基于51单片机电子显示时钟带闹钟整点报时日期星期.docx
- 文档编号:4830329
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:13
- 大小:17.08KB
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx
《基于51单片机电子显示时钟带闹钟整点报时日期星期.docx》由会员分享,可在线阅读,更多相关《基于51单片机电子显示时钟带闹钟整点报时日期星期.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机电子显示时钟带闹钟整点报时日期星期
基于51单片机电子显示时钟带闹钟、整点报时、日期、星期
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitKEY1=P3^0;//切换键
sbitKEY3=P3^1;//minute,hour调整加1定义
sbitKEY2=P3^7;//minute,hour调整减1定义
sbitbear=P3^4;//闹铃
uchara=0;//时间显示和闹钟时间显示切换
codeunsignedchar
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21};//段码控制
charcodeweikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharStrTab[32];
charminute=01,hour=13,second=00;//正常时钟秒,分,时定义
charminute1=12,hour1=24;//闹钟时钟秒,分,时定义
uintyear=2014;
charmonth=12,day=10;//日期年,月,日定义
charweek=3,v=1;//星期
//要保持高位为0
charpp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,
0x3e,0x3d,0x3b,0x37,0x2f,0x1f,
0x1e,0x1d,0x1b,0x17,0x0f,
0x0e,0x0d,0x0b,0x07,
0x06,0x05,0x03,
0x02,0x01,
0x00
};
charw=0;
ucharflag=0;//切换标志
uintcount=0;//定时器计数,定时50ms,count满20,秒加1
/**********************延时子程序*****************************/
voiddelay(uintz)
{uintx,y;
for(x=0;x for(y=0;y<110;y++); } /*******************蜂鸣器子程序****************************/ voidbeng() { bear=~bear; delay(10); bear=1; } /**********************显示时钟子函数***************************/ voiddisplay(ucharw[32]) {unsignedinti,j,c=0; if(a==0)//正常时间显示 {for(i=0;i<8;i++)//依次将数组w中八个数取出,并显示 {P2=weikong_code[i];//位选 j=w[i];//取出要显示的数码 P0=tab[j];//取出段选编码 delay (1);//显示延时 P0=0xff; }} if(a==1)//闹钟调整显示 {for(i=8;i<16;i++) {if(c==8)c=0; P2=weikong_code[c]; c++; j=w[i]; P0=tab[j]; delay (1); P0=0xff; }} if(a==2)//日期调整显示 {for(i=16;i<24;i++)//取w内容显示 {if(c==8)c=0;//控制位选1 P2=weikong_code[c];//控制位选2 c++;//控制位选3 j=w[i];//取w内容 P0=tab[j];//取w内容查表 delay (1); P0=0xff; }} if(a==3)//星期调整显示 {for(i=24;i<32;i++) {if(c==8)c=0; P2=weikong_code[c]; c++; j=w[i]; P0=tab[j]; delay (1); P0=0xff; }} } /***********************显示时钟数组子程序***********************/ voidxianshishuzu() {StrTab[1]=second/10;//秒十位 StrTab[0]=second%10;//秒个位 StrTab[2]=10;//间隔符- StrTab[4]=minute/10;//分十位 StrTab[3]=minute%10;//分个位 StrTab[5]=10;//间隔符- StrTab[7]=hour/10;//时十位 StrTab[6]=hour%10;//时个位 } /********************************定时闹钟****************/ voidalarm() {chark; if((hour==hour1)&(minute==minute1)&(k)) {if(P3! =0XFF) {k=0;} beng(); display(StrTab); } if((hour==hour1)&(minute! =minute1)) {k=1;} StrTab[9]=10;//闹钟秒个位 StrTab[8]=10;//秒十位 StrTab[10]=10;//间隔符- StrTab[12]=minute1/10;//分个位 StrTab[11]=minute1%10;//分十位 StrTab[13]=10;//间隔符- StrTab[15]=hour1/10;//时个位 StrTab[14]=hour1%10;//时十位 display(StrTab); } voiddata1()//年日期显示 { StrTab[17]=day/10;//闹钟秒个位 StrTab[16]=day%10;//秒十位9 StrTab[18]=month%10;//间隔符- StrTab[20]=year%10;//分个位 StrTab[19]=month/10;//分十位 StrTab[21]=(year/10)%10;//间隔符- StrTab[23]=year/1000;//时个位 StrTab[22]=(year/100)%10;//时十位 display(StrTab); } voidweek1()//星期显示 { StrTab[25]=10;//闹钟秒个位 StrTab[24]=10;//秒十位9 StrTab[26]=10;//间隔符- StrTab[28]=week/10;//分个位 StrTab[27]=week%10;//分十位 StrTab[29]=10;//间隔符- StrTab[31]=10;//时个位 StrTab[30]=10;//时十位 display(StrTab); } voidgodata() { if((hour==0)&(minute==0)&(second==0)) {day++;//日期格式走 if((month==2)|(month==4)|(month==6)|(month==9)|(month==11))//2,4,6,9,11数月30 天)//其他偶数月 {if(month==2)//对二月的特殊判断 {if((year%4==0)&(year/100! =0)|(year/400==0))//判断是闰年 {if(day==30);//闰年29天 {day=1;month++; if(month==13) {month=1;year++; if(year==10000) year=0;}}} elseif(day==29)//平年28天 {day=1;month++; if(month==13) {month=1;year++; if(year==10000) year=0;}} } elseif(day==31)//其他月30天 {day=1;month++; if(month==13) {month=1;year++; if(year==10000) year=0;}} } else if(day==32)//其他其他月31天 {day=1;month++; if(month==13) {month=1;year++; if(year==10000) year=0;}} week++;//星期走 if(week==8) week=1; data1(); week1(); while(second==0); } } /**********************键盘扫描子程序*************************/ voidkeycan() { if(KEY1==0)//按一次,正常显示,按第二次,时调整,按第三次,分调这整, {delay(10);//按键1去抖以及动作 if(KEY1==0)//确认按键是否按下 {flag++;}//切换标志 if(flag==10) flag=0; a=0; if((flag==4)|(flag==5)) a=1; if((flag==6)|(flag==7)|(flag==8)) a=2; if(flag==9) a=3; while(! KEY1);}//释放按键 } voidtiao() { while(flag==1) {if(KEY2==0) {delay(10); if(KEY2==0) {hour++;if(hour==24)hour=0;}//正常时间小时加1 while(! KEY2)display(StrTab);} if(KEY3==0) {delay(10); if(KEY3==0) {hour--;if(hour==-1)hour=23;}//正常时间小时减1 while(! KEY3)display(StrTab); }display(StrTab);keycan();} while(flag==2) {if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {minute++;if(minute==60)minute=0;}//分加1 while(! KEY2)display(StrTab);} if(KEY3==0) {delay(10); if(KEY3==0) {minute--;if(minute==-1)minute=59;} while(! KEY3)display(StrTab); }display(StrTab);keycan(); } while(flag==3)//秒表的加1 {if(KEY3==0) {delay(10); if(KEY3==0) second=0; while(! KEY3)display(StrTab);} if(KEY2==0) {delay(10); if(KEY2==0) second=0; while(! KEY2)display(StrTab); }display(StrTab);keycan(); } while(flag==4)//闹钟 {if(KEY2==0) {delay(10); if(KEY2==0) {hour1++;if(hour1==25)hour1=0;}//闹钟时间小时加1 while(! KEY2)alarm();} if(KEY3==0) {delay(10); if(KEY3==0) {hour1--;if(hour1==-1)hour1=24;}//闹钟时间小时减 while(! KEY3)alarm(); }alarm();keycan();} while(flag==5) {if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {minute1++;if(minute1==60)minute1=0;}//闹钟分加1 while(! KEY2)alarm();} if(KEY3==0)//按键去抖以及动作 {delay(10); if(KEY3==0) {minute1--;if(minute1==-1)minute1=59;}//闹钟分减1 while(! KEY3)alarm();}alarm();keycan();} while(flag==6)//调整年 {if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {year++;if(year==10000)year=0;}//闹钟分加1 while(! KEY2)data1();} if(KEY3==0)//按键去抖以及动作 {delay(10); if(KEY3==0) {year--;if(year==-1)year=9999;}//闹钟分减1 while(! KEY3)data1();}data1();keycan();} while(flag==7)//调整月只加 {if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {month++;if(month==13)month=1;}//闹钟分加1 while(! KEY2)data1();} data1();keycan();} while(flag==8)//调整日只加 { if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {day++; if((month==2)|(month==4)|(month==6)|(month==9)|(month==11)) //2,4,6,9,11数月30天)//其他偶数月 {if(month==2)//对二月的特殊判断 {if((year%4==0)&(year%100! =0)|(year%400==0))//判断是闰年 {if(day==30)//闰年29天 day=1;} elseif(day==29)//平年28天 day=1;} elseif(day==31)//其他月30天 day=1;} elseif(day==32)//其他其他月31天 day=1; } while(! KEY2)data1();}//日期加加 data1();keycan();} while(flag==9)//调整星期只加 {if(KEY2==0)//按键去抖以及动作 {delay(10); if(KEY2==0) {week++;if(week==8)week=1;} while(! KEY2)week1();} week1();keycan();} } /*****************整点报警子程序***************************/ voidzhengdian(void) {chari; if((minute==0)&(second==0))//整点报时 {if((hour<=23)&(hour>=7)) {for(i=0;i {beng(); delay(1000); display(StrTab);} } else {beng(); godata(); delay(3000);} } } /**************************中断子程序*********************************/ voidtime_()interrupt1//中断程序 {count++; TH0=(65536-50000)/256;//0.5ms重新送初值 TL0=(65536-50000)%256; if(count==20)//定时器计数,定时50ms,count满20,秒加1 {second++; count=0; if(second==60)//秒值等于60,秒清零,分加1 {second=0;minute++; if(minute==60)//分值等于60,分清零,时加1 {minute=0; hour++; if(hour==24)//时值等于24,时清零,返回,全部归零 {hour=0;}}}} xianshishuzu(); } /***********************主函数***************************/ voidmain() {P3=0XFF;TMOD=0x01;//time0为定时器,方式1 TH0=(65536-50000)/256;//预置计数初值,50ms TL0=(65536-50000)%256; EA=1;//总中断开 ET0=1;//允许定时器0中断 TR0=1;//开启定时器0 bear=1; while (1)//主循环{ display(StrTab); zhengdian(); alarm(); keycan(); tiao(); if((second%8==1)&(flag==0)) {w++; if(w==36) w=0; while((second%8==1)&(flag==0)) {display(StrTab);alarm();keycan();tiao();} } P1=pp[w]; if(flag==0) {if(second==11) a=2; if(second==15) a=3; if(second==19) a=0; } }}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 电子 显示 时钟 闹钟 整点 报时 日期 星期