基于51单片机,通过定时器实现的时钟程序
//使用定时器设计一个时钟
//数码管:Datapros(),DigDisplay()
//定时器初始化
//中断函数,主函数
//临时变量:a,秒:sec,分:min,时:hour
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar a=0,sec=0,min=0,hour=0;
uchar DataTime[8];
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
//延时函数
void delay(uchar i)
{
while(i--);
}
//数码管显示函数
void DigDisplay()
{
uchar i;
for(i=0;i<8;i++) //动态扫描显示8个数码管
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case(1):
LSA=1;LSB=0;LSC=0;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
P0=DataTime[i]; //给P0口赋值,时对应的数码管输出对应的值
delay(100);
P0=0x00; //消隐
}
}
//对得到的时间进行处理,供P0口使用
void Datapros()
{
DataTime[0]=smgduan[sec%10]; //取余得到秒的个位 ,通过smgduan[]得到对应的十六进制数
DataTime[1]=smgduan[sec/10]; //取余得到秒的十位
DataTime[2]=0x40; //显示一条横线
DataTime[3]=smgduan[min%10];
DataTime[4]=smgduan[min/10];
DataTime[5]=0x40;
DataTime[6]=smgduan[hour%10];
DataTime[7]=smgduan[hour/10];
}
//定时器初始化
void TimerInit()
{
TMOD=0X01; //选择定时器0,方式1
TH0=0Xd8; //对TH0和TL0赋初值为10ms,
TL0=0Xf0;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
TimerInit();
while(1)
{
Datapros();
DigDisplay();
}
}
void Timer() interrupt 1
{
TH0=0Xd8;
TL0=0Xf0;
a++;
if(a==99) // TH0和TL0溢出一次为10ms,溢出100次为1s.
{
sec++; //+1s
a=0;
if(sec==60)
{
min++; //+1分钟
a=0;
sec=0;
if(min==60)
{
hour++;
a=0;
sec=0;
min=0;
if(hour==24)
{
a=0;
hour=0;
min=0;
sec=0;
}
}
}
}
}