51单片机编写的闹钟程序.docx
《51单片机编写的闹钟程序.docx》由会员分享,可在线阅读,更多相关《51单片机编写的闹钟程序.docx(8页珍藏版)》请在冰豆网上搜索。
51单片机编写的闹钟程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitw仁P0A0;
sbitw2=P0A1;
sbitw3=P0A2;
sbitw4=P0A3;
sbitk1=P0A4;//定义按键
sbitk2=P0A5;
sbitk3=P0A6;
sbitk4=P0A7;
sbitfm=P3A4;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};//0--9十六进制数共阴voidtimetune();//时间校正函数
voiddelayms(uint);//延迟函数
voidkeyscan();//闹钟设置函数
voidkeyscan1();〃闹钟检测函数
voiddisplay(uintanum,uintanum1,uintanum2,uintanum3);//显示函数
uintnum0,num,num1,num2,num3,anum,anum1,anum2,anum3,temp,temp0,temp1,
temp2,temp3,temp4,s,s1,s2,s3,s4;
voidmain()
TMOD=0x01;〃设置定时器0为工作方式1(00000001)TH0=(65536-
45872)/256;//装初值50毫秒中断一次
TL0=(65536-45872)/256;
EA=1;//开总中断
ET0=1;〃开定时器0终中断
TR0=1;〃开定时器
while
(1)//中断后进入死循环时间永不停止计时{
timetune();//调用时间设置函数
keyscan();//调用闹钟设置函数
if(num0==20)
{
num0=0;
num++;
if(num==10)
{
num1++;
num=0;
if(num1==6)
{
num2++;
num1=0;
if(num2==10)//和下面if必须分开,否则时间到24小时后不会清0继续走下去
{
num3++;
num2=0;
}
}}}if(num3==2&&num2==4)//当时间走到24小时后自动清0{
num3=0;
num2=0;
num=0;
num1=0;
}
if(temp0==1)//为了防止闹钟时间显示和正常时间显示同时显示出现数码管显示不清晰,所以
display(s1,s2,s3,s4);//写两个对立的if条件判断语句(temp==1和temp!
=1)来作为限制条件.
if(temp0!
=1)
display(num,num1,num2,num3);//
keyscan1();
}
}
voiddisplay(uintanum,uintanum1,uintanum2,uintanum3)//时间显示函数{
P2=table[anum3];
w1=1;
delayms
(1);
w1=0;
P2=table[anum2];
w2=1;
delayms
(1);
w2=0;
P2=table[anum1];
w3=1;
delayms
(1);
w3=0;
P2=table[anum];
w4=1;
delayms
(1);
w4=0;
}
voidtimetune()//时间校正程序
{
if(k4==0)
{//当每按下第四个键后会出现temp不同的值,然后用delayms(10);//不同的值作为不同的条件给四个数码管加减值来校正时间if(k4==0)
{
temp++;
while(!
k4);
}
}
if(temp==1)
{
if(k2==0)
{
delayms(10);//按键时由于会产生机械振动,为了准确检测到按键if(k2==0)//按下所以要延时
{
num++;
if(num==10)
num=0;
while(!
k2);
if(temp==2)
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
num1++;if(num1==6)num1=0;while(!
k2);
}
}
}
if(temp==3)
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
num2++;
if(num2==10)
num2=0;
while(!
k2);
}
}
}
if(temp==4)
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
num3++;if(num3==3)num3=0;while(!
k2);
}
以
}}
if(num3==2&&num2>=4)//前面由于num2可以加到十,但是num2最多只能是4,所{//当num3加到2时,num2只能最大为4,大于4后要清0num2=0;
}
if(temp==5)
{
}temp=0;//为了让时间能够反复校正,temp要清0
voidkeyscan1()〃闹钟判断程序
{
if(s1==num&&s2==numl&&s3==num2&&s4==num3&&temp0==2)〃闹钟判断条件{
temp0=0;〃当闹钟判断条件成立后,第一次闹钟响了后,为了能够进行第二次闹钟的设置,所以temp0要清0
fm=0;//蜂鸣器
}
}
voidkeyscan()〃闹钟调整程序
{
if(k3==0)
{
delayms(10);
if(k3==0)
(Dmpo++whiCD(一k3)wif(klHO)宀
de-aymsuo)八if(klHO)
S++whiCDuklxif(sp)宀
if(k2xo)
宀
de-aymsusif(k2xo)
s1++;
if(s1==10)
s1=0;
while(!
k2);
}
}
}
if(s==2)
{if(k2==0)
{delayms(10);if(k2==0)
{
s2++;
if(s2==6)
s2=0;
while(!
k2);
}
}
}
if(s==3)
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s3++;
}}}if(s3==10)
s3=0;
while(!
k2);if(s==4)
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s4++;
if(s4==3)
s4=0;
while(!
k2);
}
}
}
if(s4>=3&&s3>=5)〃同时间调整程序一样
{
s3=0;
}
if(s==5)
{
s=0;
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidT0_time()interrupt1//中断服务程序
EA=0;
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
}num0++;
EA=1;