利用AT89C51单片机控制字符型LCD显示器制作一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。先进行一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数时间到,去做该做的事。 定时闹钟采用宇字符型LCD(16×2)显示器,显示格式为“TIME分分:秒秒”。 程序运行后LCD上显示倒计数的时间为“30:00”分钟,此时按一下K5即可开始倒计时。如果要改变为其他的倒计时时间,直接可按一下其中一个按键设定一个固定的倒计时时间: K2--设置倒计数的时间为5分钟,显示“05:00”。 K3--设置倒计数的时间为10分钟,显示“10:00”。 K4--设置倒计数的时间为20分钟,显示“20:00”。 注意:只能按一下其中一个按键,设定一次,然后再按一下K5,即开始倒计时。 也可在LCD上显示倒计数的时间为“30:00”分钟的基础上进行增1分钟或减1分钟的倒计时时间调整,即在程序运行后,先按一下K1,再按一下K2(增1分钟)或按一下K3(减1分钟),直到所设定的倒计时时间,然后按一下K5,即开始倒计时。可调整的倒计数的时间范围为1∽60分钟。 倒计时工作时,指示灯LED闪动,表示倒计时运行。 根据上面描述设计一个代码
时间: 2024-02-27 20:51:47 浏览: 74
很好,下面是对应的代码实现,代码中注释可能会有帮助:
```c
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_EN P2_2
#define LCD_DATA P0
#define K1 P3_2
#define K2 P3_3
#define K3 P3_4
#define K4 P3_5
#define K5 P3_6
uchar code music[] = {0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00};
uchar time_min = 30, time_sec = 0; // 倒计时初始时间为30:00
uchar set_time_min = 0, set_time_sec = 0; // 手动设置的倒计时时间
uchar set_flag = 0; // 标志是否设置了倒计时时间
uchar adjust_flag = 0; // 标志是否正在进行时间调整
uchar adjust_min = 0; // 调整倒计时的分钟数
sbit LED = P1_0;
/* 音乐发声函数 */
void music_play() {
uint i, j;
int t = 10000; // 调整音乐速度的参数
for(i = 0; i < 16; i++) {
for(j = 0; j < t; j++); // 调整音乐速度
P1 = music[i];
for(j = 0; j < t; j++); // 调整音乐速度
}
}
/* LCD写入命令 */
void lcd_write_cmd(uchar cmd) {
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_EN = 1;
LCD_EN = 0;
}
/* LCD写入数据 */
void lcd_write_data(uchar dat) {
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
LCD_EN = 1;
LCD_EN = 0;
}
/* LCD初始化 */
void lcd_init() {
lcd_write_cmd(0x38); // 16x2显示,5x7点阵,8位数据接口
lcd_write_cmd(0x0c); // 显示器开,光标关闭,不闪烁
lcd_write_cmd(0x06); // 光标右移,字符不移动
lcd_write_cmd(0x01); // 清屏
}
/* LCD显示字符 */
void lcd_display_char(uchar x, uchar y, uchar data) {
uchar addr;
if(y == 0) {
addr = 0x80 + x;
} else {
addr = 0xc0 + x;
}
lcd_write_cmd(addr);
lcd_write_data(data);
}
/* LCD显示字符串 */
void lcd_display_str(uchar x, uchar y, uchar *str) {
uchar addr;
if(y == 0) {
addr = 0x80 + x;
} else {
addr = 0xc0 + x;
}
lcd_write_cmd(addr);
while(*str != '\0') {
lcd_write_data(*str++);
}
}
/* 延时函数 */
void delay(uint ms) {
uint i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 1141; j++);
}
}
/* 读取按键 */
uchar key_scan() {
if(K1 == 0) {
delay(10); // 延时去抖动
if(K1 == 0) {
while(!K1); // 等待按键释放
return 1;
}
}
if(K2 == 0) {
delay(10);
if(K2 == 0) {
while(!K2);
return 2;
}
}
if(K3 == 0) {
delay(10);
if(K3 == 0) {
while(!K3);
return 3;
}
}
if(K4 == 0) {
delay(10);
if(K4 == 0) {
while(!K4);
return 4;
}
}
if(K5 == 0) {
delay(10);
if(K5 == 0) {
while(!K5);
return 5;
}
}
return 0;
}
/* 显示倒计时时间 */
void display_time() {
uchar min_high = time_min / 10;
uchar min_low = time_min % 10;
uchar sec_high = time_sec / 10;
uchar sec_low = time_sec % 10;
lcd_display_char(0, 1, 'T');
lcd_display_char(1, 1, 'I');
lcd_display_char(2, 1, 'M');
lcd_display_char(3, 1, 'E');
lcd_display_char(4, 1, min_high + '0');
lcd_display_char(5, 1, min_low + '0');
lcd_display_char(6, 1, ':');
lcd_display_char(7, 1, sec_high + '0');
lcd_display_char(8, 1, sec_low + '0');
}
/* 手动设置倒计时时间 */
void set_time() {
uchar key;
while(1) {
key = key_scan();
if(key == 2) {
set_time_min = 5;
set_time_sec = 0;
break;
}
if(key == 3) {
set_time_min = 10;
set_time_sec = 0;
break;
}
if(key == 4) {
set_time_min = 20;
set_time_sec = 0;
break;
}
}
set_flag = 1;
}
/* 调整倒计时时间 */
void adjust_time() {
uchar key;
while(1) {
key = key_scan();
if(key == 2) {
adjust_min++;
if(adjust_min > 59) {
adjust_min = 59;
}
}
if(key == 3) {
adjust_min--;
if(adjust_min < 0) {
adjust_min = 0;
}
}
if(key == 5) {
break;
}
set_time_min = time_min + adjust_min;
set_time_sec = time_sec;
if(set_time_min > 59) {
set_time_min = 59;
}
if(set_time_min < 1) {
set_time_min = 1;
}
display_time();
}
}
/* 倒计时主程序 */
void countdown() {
uint i;
uchar key;
while(1) {
// 每秒钟更新一次倒计时时间
for(i = 0; i < 1000; i++) {
delay(1);
key = key_scan();
if(key == 5) {
return;
}
if(key == 1) {
adjust_flag = 1;
adjust_time();
adjust_flag = 0;
break;
}
}
if(adjust_flag) {
continue;
}
if(time_min == 0 && time_sec == 0) {
music_play();
LED = 1;
return;
}
if(time_sec == 0) {
time_min--;
time_sec = 59;
} else {
time_sec--;
}
display_time();
LED = ~LED; // LED灯闪烁
}
}
/* 主函数 */
void main() {
lcd_init();
display_time();
while(1) {
uchar key = key_scan();
if(key == 2 || key == 3 || key == 4) {
set_time();
display_time();
}
if(key == 5) {
if(set_flag) {
time_min = set_time_min;
time_sec = set_time_sec;
set_flag = 0;
countdown();
display_time();
}
}
}
}
```
希望这个代码对你有帮助。
阅读全文