基于 5 1 单片机的电子钟 C 语言程序
#include<reg51.h>
#include<absacc.h>
#defineucharunsignedchar
#defineuintunsignedint
/* 七段共阴管显示定义*/
ucharcodedispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/* 定义并初始化变量*/
ucharseconde=0;
ucharminite=0;
ucharhour=12;
ucharmstcnt=0;
sbitP1_0=PM0;//seco nd 调整定义
sbitP1_ 仁P1A1;//mi nite 调整定义
sbitP1_2=P1A2;//hour 调整定义
/* 函数声明*/
voiddelay(uintk);// 延时子程序
voiddelay1(ucharh);
voidtime_pro();// 时间处理子程序
voiddisplay();// 显示子程序
voidkeyscan();// 键盘扫描子程序
/*****************************/
/* 延时子程序*/ voiddelay1(ucharh)
{
ucharj;
while((h--)!=0)
{ for(j=0;j<125;j++) {;}
}
}
voiddelay(uintk)
{
uinta,b,c;
for(c=k;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--);
} /************************* /* 时间处理子程序*/
*/
voidtime_pro(void)
{
if(seconde==60)// 秒钟设为60 进制
{seconde=0;
minite++;
if(minite==60)// 分钟设为60 进制
{minite=0;
hour++;
if(hour==24)// 时钟设为24 进制
{hour=0;}
}
}
}
/*****************************/
/* 显示子程序*/ voiddisplay(void)
{
P2=0xfe;
P0=dispcode[hour/10];// 显示小时的十位delay1(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80;// 显示小时的个位delay1(4); P2=0xfb;
P0=dispcode[minite/10];// 显示分的十位delay1(4);
P2=0xf7;
P0=(dispcode[minite%10])|0X80;// 显示分的个位delay1(4); P2=0xef;
P0=dispcode[seconde/10];// 显示秒的十位delay1(4);
P2=0xdf;
P0=dispcode[seconde%10];// 显示秒的个位delay1(4);
}
/*******************************/
/* 键盘扫描子程序*/
/*******************************/ voidkeyscan(void)
{
if(P1_0==0)// 按键 1 秒的调整
{
delay(2);
if(P1_0==0)
//delay(300);
{
seconde++;
if(seconde==60)
{seconde=0;}
}
}
if(P1_1==0)// 按键 2 分的调整
{
delay(2);
if(P1_1==0)
// delay(300);
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(P1_2==0)// 按键 3 小时的调整
{
delay(2);
if(P1_2==0)
//delay(300);
{
hour++;
if(hour==24)
{hour=0;}
}
}
}
voidtimerO(void)interruptlusingO〃定时器0方式1, 50ms中断一次
{
TH0=0x3c;
TMOD=0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0;// 注意点。
对计数单元的清零十分的重要,本次调试中就是
}// 因为忽略了这一点,给我早成了很大的被动。
}
/**************************/
/* 主函数*/
/**************************/ voidmain(void) {P1=0xff;// 初始化p1 口,全设为 1 TMOD=0x11;//time0 为定时器,方式 1 TH0=0x3c;// 预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();// 按键扫描time_pro();// 时间处理display();// 显示时间
}
}。