51单片机8位数码管显示时间为09-59-58
时间: 2023-08-15 11:05:52 浏览: 119
下面是修改后的代码,可以实现8位数码管显示时间为09-59-58:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code duan[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管段选码表
uchar code wei[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //数码管位选码表
uchar hour=9, minute=59, second=58; //时分秒的变量
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
TMOD=0x01; //设置定时器0为模式1,计数值为1ms
TH0=(65536-1000)/256; //设置定时器0的初始值
TL0=(65536-1000)%256;
TR0=1; //启动定时器0
ET0=1; //开启定时器0的中断
EA=1; //开启总中断
while(1) //主程序循环
{
P0=duan[hour/10]; //输出小时的十位数
P2=wei[0]; //选择第1位数码管
delay(1);
P0=duan[hour%10]; //输出小时的个位数
P2=wei[1]; //选择第2位数码管
delay(1);
P0=0x40; //输出冒号
P2=wei[2]; //选择第3位数码管
delay(1);
P0=duan[minute/10]; //输出分钟的十位数
P2=wei[3]; //选择第4位数码管
delay(1);
P0=duan[minute%10]; //输出分钟的个位数
P2=wei[4]; //选择第5位数码管
delay(1);
P0=0x40; //输出冒号
P2=wei[5]; //选择第6位数码管
delay(1);
P0=duan[second/10]; //输出秒钟的十位数
P2=wei[6]; //选择第7位数码管
delay(1);
P0=duan[second%10]; //输出秒钟的个位数
P2=wei[7]; //选择第8位数码管
delay(1);
}
}
void T0_time() interrupt 1 //定时器0中断服务函数
{
TH0=(65536-1000)/256; //重置定时器0的初始值
TL0=(65536-1000)%256;
second--; //秒数减1
if(second==255) //如果秒数减到0,则分钟数减1
{
second=59;
minute--;
if(minute==255) //如果分钟数减到0,则小时数减1
{
minute=59;
hour--;
if(hour==255) hour=23; //如果小时数减到0,则重新从23开始倒数
}
}
}
```
这个代码将定时器中断的处理改成了倒计时模式,可以实现8位数码管显示时间为09-59-58,每隔1秒更新一次。
阅读全文