利用定时计数器,设计一个电子时钟,可以先编写显示子程序。从左到右依次显示时分秒。有两种方法实现,一种是在中断程序中计数,产生时分秒计数,送显示缓冲区。另一种是中断程序每一秒清除一个位变量,而主程序通过监视位变量的变化来知道每秒的时间 要keil的代码
时间: 2024-03-10 20:49:59 浏览: 110
好的,下面是使用中断计数法的Keil代码实现:
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0; // 定义LED引脚
// 定义时分秒计数器
uchar hour_cnt = 0;
uchar minute_cnt = 0;
uchar second_cnt = 0;
// 定义时分秒显示缓冲区
uchar hour_buf[2] = {0};
uchar minute_buf[2] = {0};
uchar second_buf[2] = {0};
// 定义定时器计数变量
uint timer_cnt = 0;
// 定时器中断服务程序
void timer0_isr(void) interrupt 1
{
TH0 = 0xFC; // 重新设置定时器初值
TL0 = 0x67;
timer_cnt++; // 定时器计数器加1
// 如果定时器计数器达到1秒钟
if (timer_cnt >= 500)
{
timer_cnt = 0; // 重置定时器计数器
// 时分秒计数器加1
second_cnt++;
if (second_cnt >= 60)
{
second_cnt = 0;
minute_cnt++;
if (minute_cnt >= 60)
{
minute_cnt = 0;
hour_cnt++;
if (hour_cnt >= 24)
{
hour_cnt = 0;
}
}
}
// 将时分秒信息存入缓冲区
hour_buf[0] = hour_cnt / 10 + '0';
hour_buf[1] = hour_cnt % 10 + '0';
minute_buf[0] = minute_cnt / 10 + '0';
minute_buf[1] = minute_cnt % 10 + '0';
second_buf[0] = second_cnt / 10 + '0';
second_buf[1] = second_cnt % 10 + '0';
}
}
// 显示时分秒信息
void display_time()
{
P0 = 0x00; // 关闭所有数码管
P2 = 0xFE; // 打开第一个数码管
P0 = hour_buf[0];
delay_ms(5);
P2 = 0xFD; // 打开第二个数码管
P0 = hour_buf[1];
delay_ms(5);
P2 = 0xFB; // 打开第三个数码管
P0 = minute_buf[0];
delay_ms(5);
P2 = 0xF7; // 打开第四个数码管
P0 = minute_buf[1];
delay_ms(5);
P2 = 0xEF; // 打开第五个数码管
P0 = second_buf[0];
delay_ms(5);
P2 = 0xDF; // 打开第六个数码管
P0 = second_buf[1];
delay_ms(5);
}
void main()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置定时器初值
TL0 = 0x67;
IE = 0x82; // 开启定时器0中断和总中断
TR0 = 1; // 启动定时器
while (1)
{
display_time(); // 显示时分秒信息
}
}
// 延时函数
void delay_ms(uint ms)
{
uint i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 120; j++);
}
}
```
以上是使用中断计数法的Keil代码实现。在中断服务程序中,我们每隔500个定时器计数器就将时分秒计数器加1,并将时分秒信息存入缓冲区。在主程序中,我们不断调用显示函数来显示时分秒信息。其中,我们使用了一个简单的延时函数来控制数码管的刷新速度。
希望对您有所帮助!
阅读全文