51单片机c语言电子钟已加入调时闹铃整点报时功能.docx
《51单片机c语言电子钟已加入调时闹铃整点报时功能.docx》由会员分享,可在线阅读,更多相关《51单片机c语言电子钟已加入调时闹铃整点报时功能.docx(11页珍藏版)》请在冰豆网上搜索。
51单片机c语言电子钟已加入调时闹铃整点报时功能
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)
效果图:
程序如下:
//51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)
//WHJWNAVY2011/10/14
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*七段共阴管显示定义*/
//此表为LED的字模,共阴数码管0-9 -
ucharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
/*定义并初始化变量*/
ucharseconde=0;//秒
ucharminite=0;//分
ucharhour=12;//时
ucharmstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
ucharshi=0;//闹铃功能
ucharfen=0;
ucharbjcs;//报警次数
sbitP1_0=P1^0; //second调整定义
sbitP1_1=P1^1; //minite调整定义
sbitP1_2=P1^2; //hour调整定义
sbitP1_5=P1^5; //整点报时
sbitP1_3=P1^3; //闹铃功能,调整时间
sbitP1_6=P1^6; //调整时
sbitP1_7=P1^7; //调整分
sbitP1_4=P1^4; //关闭闹铃
/*函数声明*/
voiddelay(uintk); //延时子程序
voidtime_pro(); //时间处理子程序
voiddisplay(); //显示子程序
voidkeyscan(); //键盘扫描子程序
/*延时子程序*/
voiddelay(uintk)
{
ucharj;
while((k--)!
=0)
{
for(j=0;j<125;j++)
{;}
}
}
/*时间处理子程序*/
voidtime_pro(void)
{
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
/*显示子程序*/
voiddisplay(void)
{
if(P1_3==1)
{
P2=0XFE;
P0=dispcode[seconde%10];//秒个位
delay
(1);
P2=0XFD;
P0=dispcode[seconde/10];//秒十位
delay
(1);
P2=0XFB;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XF7;
P0=dispcode[minite%10];//分个位
delay
(1);
P2=0XEF;
P0=dispcode[minite/10];//分十位
delay
(1);
P2=0XDF;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XBF;
P0=dispcode[hour%10];//时个位
delay
(1);
P2=0X7F;
P0=dispcode[hour/10];//时十位
delay
(1);
}
}
/*键盘扫描子程序*/
voidkeyscan(void)
{
if(P1_0==0)//秒位的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{
seconde=0;
}
}
delay(250);
}
if(P1_1==0)//分位的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
}
delay(250);
}
if(P1_2==0)//时位的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
delay(250);
}
}
/*整点报警*/
voidzhengdian(void)
{
if((seconde==0)&(minite==0))//整点报时
{
P1_5=0;
delay(1000);
P1_5=1;
}
}
/*定时闹钟*/
voiddingshi(void)
{
if(P1_3==0) //按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
{
P2=0XFE;
P0=dispcode[0];//秒个位
delay
(1);
P2=0XFD;
P0=dispcode[0];//秒十位
delay
(1);
P2=0XFB;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XF7;
P0=dispcode[fen%10];//分个位
delay
(1);
P2=0XEF;
P0=dispcode[fen/10];//分十位
delay
(1);
P2=0XDF;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XBF;
P0=dispcode[shi%10];//时个位
delay
(1);
P2=0X7F;
P0=dispcode[shi/10];//时十位
delay
(1);
}
if(P1_6==0)//设定时
{
delay(30);
if(P1_6==0)
{
shi++;
if(shi==24)
{
shi=0;
}
}
delay(250);
}
if(P1_7==0)//设定分
{
delay(30);
if(P1_7==0)
{
fen++;
if(fen==60)
{
fen=0;
}
}
delay(250);
}
if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警十次。
{
for(bjcs=0;bjcs<10;bjcs++)
{
P1_5=0;
delay(500);
P1_5=1;
delay(500);
}
}
}
/*主函数*/
voidmain(void)
{
P1=0XFF;
TMOD=0x11;//time0为定时器,方式1
TH0=0x3c; //预置计数初值,50ms
TL0=0xb0;
EA=1; //总中断开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while
(1)
{
keyscan(); //按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
display(); //显示时间
}
}
voidtimer0(void)interrupt1 //定时器0方式1,50ms中断一次
{
TH0=0x3c; //手动加载计数脉冲次数
TL0=0xb0;
TMOD=0x11;
mstcnt++; //用于计算时间,每隔50ms加1
if(mstcnt==20)//mstcnt满20即为一秒
{
seconde++;//秒+1
time_pro();//时间处理
mstcnt=0;//对计数单元的清零,重新开始计数
}
}