#include<reg52.h>
sbit LATCH1 = P2^1; //位码控制
sbit LATCH2 = P2^2; //段码控制
void LedRefresh(unsigned char n);//数码管刷新函数
void InitUART();
unsigned char LedBuff[8];//LED全局缓存
unsigned char WeiMa[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff} ; //位码(选通数码第 N 位数)
unsigned char code DuanMa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码(选通数码要显示数字)
unsigned char i = 0; //动态扫描判断
unsigned int cnt = 0; //定义一个记数变量cnt,记录T0中断次数
unsigned long sec = 0; //定义一个记数变量sec,记录秒数
void main()
{
EA = 1; //总中断打开
TMOD = 0x01; //定时器选择工作模式 1
TH0 = 0xFF; //给TH0赋值初始化 定时100微妙
TL0 = 0xA4;
ET0 = 1 ; //启动中断 T0
TR0 = 1; // 启动定时器 T0
InitUART(); //初始化串口波特率
while(1)
{
if(cnt>=10000) //
{
cnt = 0; //达到10000次后,计数清零
sec++;
if(sec>=86401) //判断是否达到24小时
{
sec = 0; //达到24小时,数据清零重新开始
}
if(sec<10)
{WeiMa[0]=0x7f;}
else if((sec>9)&&(sec<60))
{WeiMa[1]=0xbf; }
else if((sec>59) &&(sec<600))
{WeiMa[2]=0xdf;WeiMa[3]=0xef;}
else if ((sec>599)&&(sec<3600))
{WeiMa[4]=0xf7;}
else if ((sec>3599) &&(sec<36000))
{ WeiMa[5]=0xfb;WeiMa[6]=0xfd; }
else if (sec>35999)
{WeiMa[7]=0xfe;}
/*--------------------------------------------------------------------------
分解显示时钟数字
---------------------------------------------------------------------------*/
LedBuff[0] = DuanMa[(sec%10)]; //秒 个位
LedBuff[1] = DuanMa[(sec%60)/10]; //秒 十位
LedBuff[2] = 0x40;
LedBuff[3] = DuanMa[(sec/60)%10];//分 个位
LedBuff[4] = DuanMa[((sec/60)%60)/10];//分 十位
LedBuff[5] = 0x40;
LedBuff[6] = DuanMa[(sec/3600)%10];//小时 个位
LedBuff[7] = DuanMa[(sec/3600)/10]; //小时 十位
}
}
}
/*----------------------------------------------------------------------
定时器 T0 中断服务函数
-----------------------------------------------------------------------*/
void InterruptTime0() interrupt 1
{
TH0 = 0xFF; //重新加载初始值
TL0 = 0xA4;
cnt++; //计数值自动加 1
LedRefresh(i);
i++;
if(i >= 8)
{
i = 0;
}
}
/*----------------------------------------------------------------------
数码管动态扫描显示
-----------------------------------------------------------------------*/
void LedRefresh(unsigned char n)
{
P1 = 0; //数码管显示数据清零,防止重影
LATCH2 = 1;
LATCH2= 0;
P1 = WeiMa[n];
LATCH1 = 1;
LATCH1 = 0;
P1 = LedBuff[n];
LATCH2 = 1;
LATCH2 = 0;
}
/*------------------------------------------------------------------------
串口波特率9600
------------------------------------------------------------------------*/
void InitUART()
{
TMOD = 0x21;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
sec = SBUF;
}
else
TI = 0;
}
|