单片机时分秒程序
时间: 2023-12-18 08:03:25 浏览: 63
下面是一个基于8051单片机的时分秒程序,实现了通过外部晶振计时,并将时分秒分别显示在数码管上:
```
#include <reg51.h>
#define uchar unsigned char
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码表
uchar hour,minute,second;//时分秒
void delay()
{
int i,j;
for(i=0; i<1000; i++)
for(j=0; j<100; j++);
}
void init_timer0()
{
TMOD = 0x01;//设置计时器0为模式1
TH0 = 0x4c;//设置计时器0初值,使其每隔1ms计数一次
TL0 = 0x00;
EA = 1;//开总中断
ET0 = 1;//开定时器0中断
TR0 = 1;//启动定时器0
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0 = 0x4c;//重新设置计时器0初值
TL0 = 0x00;
second++;//秒数加1
if(second == 60)//如果秒数达到60,进位
{
second = 0;
minute++;
}
if(minute == 60)//如果分钟达到60,进位
{
minute = 0;
hour++;
}
if(hour == 24)//如果小时达到24,清零
{
hour = 0;
}
}
void main()
{
hour = 0;
minute = 0;
second = 0;
init_timer0();//初始化定时器0
while(1)
{
P0 = 0x01;//选择第一位数码管
P1 = table[hour/10];//显示小时的十位
delay();
P0 = 0x02;//选择第二位数码管
P1 = table[hour%10];//显示小时的个位
delay();
P0 = 0x04;//选择第三位数码管
P1 = table[minute/10];//显示分钟的十位
delay();
P0 = 0x08;//选择第四位数码管
P1 = table[minute%10];//显示分钟的个位
delay();
P0 = 0x10;//选择第五位数码管
P1 = table[second/10];//显示秒钟的十位
delay();
P0 = 0x20;//选择第六位数码管
P1 = table[second%10];//显示秒钟的个位
delay();
}
}
```
以上程序中使用了定时器0中断来实现对时分秒的计时,每隔1ms中断一次,在中断服务程序中将秒数加1,并判断是否进位。同时,由于数码管是共阴极的,在显示时需要将对应的位选通为低电平,并将相应的数码段码输出到P1口。其中,table数组是一个数码管段码表,用于将数字转换为对应的段码。程序中的delay()函数用于延时,以保证数码管可以正常显示。
阅读全文