用stc89c52单片机做一个定时器,分秒,用定时器由秒计时到分,四位数码管。如果计时到两分钟,在液晶屏上显示时间到,把分秒显示到数码管上。做定时器和中断。秒两位数码管,分钟两位数码管。
时间: 2024-02-18 10:05:55 浏览: 91
好的,下面是一个基于STC89C52单片机的代码示例,可以实现你的需求:
```
#include <reg52.h>
#define DISPLAY_PORT P0 // 数码管显示口
#define LCD_RS P2_0 // 液晶屏RS引脚
#define LCD_RW P2_1 // 液晶屏RW引脚
#define LCD_EN P2_2 // 液晶屏EN引脚
#define LCD_DATA_PORT P1 // 液晶屏数据口
sbit beep = P3^7; // 蜂鸣器引脚
unsigned int second_count = 0; // 秒计时器
unsigned int minute_count = 0; // 分计时器
unsigned char code display_num[10] = { // 数码管显示码表
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
void delay(unsigned int ms) { // 延时函数
unsigned int i, j;
for (i = ms; i > 0; i--) {
for (j = 114; j > 0; j--);
}
}
void init_lcd() { // 初始化液晶屏
delay(15);
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA_PORT = 0x30;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
LCD_DATA_PORT = 0x0C;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
LCD_DATA_PORT = 0x01;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
}
void lcd_write_cmd(unsigned char cmd) { // 写命令到液晶屏
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA_PORT = cmd;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
}
void lcd_write_data(unsigned char dat) { // 写数据到液晶屏
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA_PORT = dat;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
delay(5);
}
void lcd_write_string(unsigned char *str) { // 在液晶屏上显示字符串
while (*str) {
lcd_write_data(*str++);
}
}
void interrupt_timer0() interrupt 1 { // 定时器0中断服务函数
TH0 = 0x3C;
TL0 = 0xAF;
second_count++; // 秒计时器加1
if (second_count == 60) { // 如果秒计时器达到60秒,分计时器加1
second_count = 0;
minute_count++;
if (minute_count == 2) { // 如果分计时器达到2分钟,触发蜂鸣器并显示时间到
beep = 1;
delay(500);
beep = 0;
lcd_write_cmd(0x01); // 清屏
lcd_write_cmd(0x80); // 光标移动到第一行第一列
lcd_write_string("Time is up!");
while (1); // 进入死循环,停止计时
}
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3C;
TL0 = 0xAF;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
init_lcd(); // 初始化液晶屏
lcd_write_cmd(0x80); // 光标移动到第一行第一列
lcd_write_string("Time: 00:00");
while (1) { // 主循环
DISPLAY_PORT = display_num[second_count % 10]; // 显示秒的个位数
delay(5);
DISPLAY_PORT = 0x00; // 关闭数码管,防止闪烁
DISPLAY_PORT = display_num[second_count / 10]; // 显示秒的十位数
delay(5);
DISPLAY_PORT = 0x00; // 关闭数码管,防止闪烁
DISPLAY_PORT = display_num[minute_count % 10]; // 显示分的个位数
delay(5);
DISPLAY_PORT = 0x00; // 关闭数码管,防止闪烁
DISPLAY_PORT = display_num[minute_count / 10]; // 显示分的十位数
delay(5);
DISPLAY_PORT = 0x00; // 关闭数码管,防止闪烁
}
}
```
这个代码示例使用了定时器0来进行秒计时,并在定时器0中断服务函数中进行分计时和时间到的判断。使用了液晶屏来显示时间到的信息,并使用了数码管来显示时间。你可以根据你的硬件配置进行一些修改。
阅读全文