用AT89C51 采用T0定时方式2实现小时(24进制)、分钟(60进制)、秒(60进制)在数码管上的显示。 (设fosc=12MHz)
时间: 2023-12-31 14:05:03 浏览: 89
好的,我了解了你的问题。这是一个嵌入式系统的问题,需要用到AT89C51单片机和数码管。下面是代码实现:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
// 数码管各位段选控制码
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
// 定时器0中断服务程序
void T0_time() interrupt 1{
static uchar count = 0; // 计数器,用于控制秒数
static uchar minute = 0; // 计数器,用于控制分钟数
static uchar hour = 0; // 计数器,用于控制小时数
count++; // 每秒加一
if(count == 60){ // 一分钟过去了
count = 0; // 秒数归零
minute++; // 分钟加一
if(minute == 60){ // 一小时过去了
minute = 0; // 分钟归零
hour++; // 小时加一
if(hour == 24){ // 一天过去了
hour = 0; // 小时归零
}
}
}
}
// 显示数据函数
void display(uint num){
uchar i;
for(i=0;i<8;i++){
P2 = 0xff; // 关闭所有位选
P0 = table[num % 10]; // 显示个位
P2 = 1 << i; // 打开对应位选
num /= 10;
delay(1); // 延时一段时间,使得人眼可以看到
}
}
// 延时函数
void delay(uint i){
while(i--);
}
void main(){
TMOD = 0x02; // 定时器0工作在方式2
TH0 = 0x3c; // 定时器初值
TL0 = 0xb0;
EA = 1; // 开总中断
ET0 = 1; // 开定时器0中断
TR0 = 1; // 启动定时器
while(1){
display(hour * 10000 + minute * 100 + count); // 将时间显示在数码管上
}
}
```
以上代码实现了用AT89C51单片机和数码管实现时分秒的显示,其中使用定时器0中断来计时,每秒更新时间并在数码管上显示。
阅读全文