基于STC89C52RC单片机的数字钟设计C语言源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
sbit KEY1=P2^7;
sbit KEY2=P2^6;
sbit KEY3=P2^5;
sbit KEY4=P2^4;
sbit E1=P2^3;
sbit C=P2^2;
sbit B1=P2^1;
sbit A=P2^0;
sbit LED=P1^0;
bit flag=0;
code unsigned char tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管 0-9
unsigned char StrTab[6]; //定义缓冲区
unsigned char minute=0,hour=0,second=0; //定义并且初始化值00:00:00
unsigned char sel=0;
unsigned char count=0;
unsigned char counter=0;
void delay(unsigned int cnt)//延时函数
{
while(--cnt);
}
void Display(void)
{ if(!flag)
{ if(count<=50)
{
LED=0;
StrTab[0]=tab[hour/10];
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10]^0x80;
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];
}
else
{
LED=1;
StrTab[0]=tab[hour/10];
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];
}
}
else//进入调时模式被选中的数码管闪烁
{
if(counter<=50)
{
StrTab[0]=tab[hour/10];
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];
}
else
{
switch(sel)
{
case 0:StrTab[0]=tab[hour/10];
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[4]=tab[second/10]&0x00;
StrTab[5]=tab[second%10]&0x00;break;
case 1:StrTab[0]=tab[hour/10];
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10]&0x00;
StrTab[3]=tab[minute%10]&0x00;
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];break;
case 2:StrTab[0]=tab[hour/10]&0x00;
StrTab[1]=tab[hour%10]&0x00;
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];break;
default:break;
}
}
}
}
main()//主函数
{
E1=0;
TMOD |=0x01;//定时器0定时10ms,用于计时
TH0=0xDC;
TL0=0x00;
TMOD |=0x10; //定时器1定时1ms,用于动态扫描
TH1=0xFC;
TL1=0x66;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
EA =1;
while(1)//主循环
{
Display();
if(!KEY4) //按键4去抖以及动作
{
delay(11000);
if(!KEY4)
{
flag=~flag;
sel=0;
}
}
if(flag) //进入调时模式
{
if(!KEY3) //按键3去抖以及动作
{
delay(11000);
if(!KEY3)
{
sel++;
if(sel==3)
sel=0;
}
}
if(!KEY2) //按键2去抖以及动作
{
delay(11000);
if(!KEY2)
{
switch(sel)
{
case 0:second--;if(second==255)second=0;break;
case 1:minute--;if(minute==255)minute=0;break;
case 2:hour--;if(hour==255)hour=0;break;
default:break;
}
}
}
if(!KEY1) //按键1
去抖以及动作
{
delay(11000);
if(!KEY1)
{
switch(sel)
{
case 0:second++;if(second==60)second=0;break;
case 1:minute++;if(minute==60)minute=0;break;
case 2:hour++;if(hour==24)hour=0;break;
default:break;
}
}
}
}
}
}
/********************************/
/* 定时中断1 */
/********************************/
void time1(void) interrupt 3//定时器1用来动态扫描
{
static unsigned char num;//定义内部静态变量
TH1=0xFC;
TL1=0x66;
switch (num)
{
case 0:A=0;B1=0;C=0;P0=StrTab[num];break;
case 1:A=1;B1=0;C=0;P0=StrTab[num];break;
case 2:A=0;B1=1;C=0;P0=StrTab[num];break;
case 3:A=1;B1=1;C=0;P0=StrTab[num];break;
case 4:A=0;B1=0;C=1;P0=StrTab[num];break;
case 5:A=1;B1=0;C=1;P0=StrTab[num];break;
default:break;
}
num++;
if(num==6) //扫描6次
num=0;
}
/********************************/
/* 定时中断0 */
/********************************/
void timer0(void) interrupt 1
{
TH0=0xDC;
TL0=0x00;
counter++;
if(counter==100)
counter=0;
if(!flag)
{
count++;
if(count==100)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
}
}
}