《单片机实现电子钟万年历秒表闹铃(10页).doc》由会员分享,可在线阅读,更多相关《单片机实现电子钟万年历秒表闹铃(10页).doc(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、-单片机实现电子钟万年历秒表闹铃-第 10 页程序清单/项目名称: 数字电子钟/项目设计者: /项目设计时间: 2011年12月23日/项目功能:电子钟上电或按键复位后能自动显示系统提示符“P.”, 并不断闪烁进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次进入时钟运行状态。电子钟能显示年月日时分秒、秒表,任意时间闹铃,整点闹铃/* crystal=12Mhz */#include#define uchar unsigned char#de
2、fine uint unsigned int sbit kaig=P10; /*启动/调制键*/ sbit ksec=P11; /*调整秒/日/秒表开关*/ sbit kmin=P12; /*调整分/月/显示秒表*/ sbit khour=P13; /*调整时/年的低两位*/ sbit date=P14; /*显示日期开关*/sbit bai=P15; /*调整年高二位/整点闹钟开关*/ sbit save=P16; /*保存设置的闹铃时间*/sbit offl=P17; /*闹铃开关*/sbit loud=P31; /*扬声器*/uint num=0,sec=0,min=0,hour=0,h
3、ao=0,miao=0,fen=0,shi=0;/ 计时 秒 分 时毫秒 秒 分 时uint day=1,mou=1,year=2000,dx=0,co=0,stopnao=0,shour=0,smin=2;/ 日 月 年 显示 整点/闹铃开关 时 分uchar secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;/时间 秒个位 秒十位 分个位 分十位 时个位 时十位 uchar i=0, flag=0, j=0, yearqian=0, yearbai=0;/ 上电标志 电子钟启停标志 秒表启动标志 年千位 年百位uchar moushi
4、=0,mouge=0,dayge=0,dayshi=0,yearshi=0,yearge=0;/ 月十位 月个位 日个位 日十位 年十位 年个位uchar haoshi=0,haoge=0,miaoshi=0,miaoge=0,fenge=0,fenshi=0,shige=0,shishi=0;/秒表 毫秒十位 个位 秒十位 秒个位 分个位 分十位 时个位 时十位 Unsigned char code table10=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/* *0*1*2*3*4*5*6*7*8*9*/void delay(uns
5、igned int z); /延时1ms函数 void time0(); / 定时器0中断方式工作 void time1(); / 定时器1中断方式工作 void display(); /显示子程序 void keyscan(); /键扫描键功能子程序/函数名: main()/功能: 主函数 /调用函数:display(),keyscan() main() TMOD=0x11; P3=0X0FF; IP=0X02; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-10000)/256; TL1=(65536-10000)%256
6、; EA=1; /*开启中断总开关*/ ET0=1; /*开启定时器0中断*/ i=0; /*控制显示,开关是否开启过*/ TR0=0; /*关闭定时器*/ ET1=0; TR1=1; while(1) keyscan(); display();/函数名: void delay(uint z)/功能: 延时时间为1ms/输入参数:z,1ms计数/说明: 总共延时时间为1ms乘以z,crystal=12Mhzvoid delay(unsigned int z) unsigned int x,y,a; for(x=z;x0;x-) for(y=142;y0;y-) for(a=2;a0;a-);
7、/函数名: void time0()/功能: 定时50ms/说明:用于电子钟时间void time0() interrupt 1 using 2 num+; /中断次数 TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(num=20) /*1s才变化显示*/ num=0; sec+; if(sec=60)/分 sec=0; min+; if(min=60)&(!co) loud=0; if(min!=60) loud=1;if(min=smin)&(hour=shour)&(!stopnao) loud=0;if(min=(smin+1)&(ho
8、ur=shour) loud=1; if(min=60)/ /时 min=0; hour+; if(hour=24) hour=0; min=0; sec=0;day+;/日 if(mou=1)|(mou=3)|(mou=5)|(mou=7)|(mou=8)|(mou=10)|(mou=12) if(day=32) day=1;mou+;goto ww; if(mou=4)|(mou=6)|(mou=9)|(mou=11) if(day=31) day=1;mou+;goto ww; if(year%4=0)&(year%100)!=0)|(year%400=0)&(mou=2) if(day
9、=30) day=1;mou+;goto ww; if(mou=2)if(day=29) day=1;mou+;ww:if(mou=13) mou=1;year+;/年 if(year=10000) year=0;/函数名: void time1()/功能: 定时10ms/说明: 用于秒表计时 void time1() interrupt 3 using 3 hao+; TH1=(65536-10000)/256; TL1=(65536-10000)%256; if(hao=100)/*/ hao=0; miao+; if(miao=60)/*/ miao=0; fen+; if(fen=60
10、)/*/ fen=0; shi+; if(shi=24)/*/ shi=0;/函数名: display()/功能: 八位LED数码显示/说明: 显示时间/显示年月日/显示秒表,显示时间LED3点表示整点闹铃已打开,显示时间LED6点表示定时闹铃已打开void display() if(i=1)&(j=0)&(dx=0)/显示时间 secge=sec%10; secshi=sec/10; minge=min%10; minshi=min/10; hourge=hour%10; hourshi=hour/10; P2=0xfe; P0=tablesecge; delay(1); P2=0xff;
11、P2=0x0fd; P0=tablesecshi; delay(1); P2=0xff; P2=0x0fb; if(co=1)P0=0xbf; /整点报时关闭 else P0=0x3f; /整点报时开启 delay(1);P2=0xff; P2=0x0f7; P0=tableminge; delay(1); P2=0xff; P2=0x0ef; P0=tableminshi; delay(1); P2=0xff; P2=0x0df; if(stopnao=1)P0=0xbf; /闹铃关闭 else P0=0x3f; /闹铃开启 delay(1); P2=0xff; P2=0x0bf; P0=t
12、ablehourge; delay(1); P2=0xff; P2=0x7f; P0=tablehourshi; delay(1); P2=0xff;if(i=1)&(j=1) /显示秒表 haoge=hao%10; haoshi=hao/10; miaoge=miao%10; miaoshi=miao/10; fenge=fen%10; fenshi=fen/10; shige=shi%10; shishi=shi/10; P2=0xfe; P0=tablehaoge; delay(1); P2=0xff; P2=0x0fd; P0=tablehaoshi; delay(1);P2=0xff
13、; P2=0x0fb; P0=tablemiaoge-0x80;/ delay(1);P2=0xff; P2=0x0f7; P0=tablemiaoshi; delay(1); P2=0xff; P2=0x0ef; P0=tablefenge-0x80;/ delay(1); P2=0xff; P2=0x0df; P0=tablefenshi; delay(1); P2=0xff; P2=0x0bf; P0=tableshige-0x80; / delay(1); P2=0xff; P2=0x7f; P0=tableshishi; delay(1); P2=0xff; if(i=1)&(dx=
14、1)&(j=0) /显示年月日 dayge=day%10; dayshi=day/10; mouge=mou%10; moushi=mou/10; yearge=year%10; yearshi=(year/10)%10; yearbai=(year/100)%10; yearqian=year/1000; P2=0xfe; P0=tabledayge; delay(1); P2=0xff; P2=0x0fd; P0=tabledayshi; delay(1);P2=0xff; P2=0x0fb; P0=tablemouge-0x80; delay(1);P2=0xff; P2=0x0f7;
15、P0=tablemoushi; delay(1); P2=0xff; P2=0x0ef; P0=tableyearge-0x80; delay(2); P2=0xff; P2=0x0df; P0=tableyearshi; delay(1); P2=0xff; P2=0x0bf; P0=tableyearbai; delay(1); P2=0xff; P2=0x7f; P0=tableyearqian; delay(1); P2=0xff; P0=0x0c; P2=0x7f; delay(10); P2=0XFF; delay(60);/函数名: void keyscan()/功能:键扫描并实
16、现键功能 /说明: 调制时间、年月日、设置闹铃、秒表开启关闭void keyscan()/*K1*/ if(kaig=0) delay(10); if(kaig=0) dodisplay( );while(!kaig); TR0=!TR0; flag=!flag;i=1;/*开启一次才为1*/*K2*/ if(ksec=0) display(); if(ksec=0) do display();while(!ksec); if(flag=0)&(dx=0)/调整秒 sec+; if(sec=60)/ sec=0; display(); if(flag=0)&(dx=1)/调整日 day+; i
17、f(mou=1)|(mou=3)|(mou=5)|(mou=7)|(mou=8)|(mou=10)|(mou=12) if(day=32) day=1; /越过该月天数日期的日为1 goto www; if(mou=4)|(mou=6)|(mou=9)|(mou=11) if(day=31) day=1; /越过该月天数日期的日为1goto www; if(year%4=0)&(year%100)!=0)|(year%400=0)&(mou=2)if(day=30) day=1; /越过该月天数日期的日为1goto www;if(mou=2) if(day=29) day=1; www:dis
18、play();if(flag=1)&(i=1) ET1=!ET1; /秒表开关 j=1; /*K3*/ if(kmin=0)/ display(); if(kmin=0) do display();while(!kmin); if(flag=0)&(dx=0)/调整分 min+; if(min=60) min=0; display(); if(dx=1)&(flag=0)/调整月 mou+; if(mou=13) mou=1;if(year%4=0)&(year%100)!=0)|(year%400=0)&(mou=2)/闰年 if(day=30) day=1; if(mou=2)&(year
19、%4!=0)if(day=29) day=1;if(mou=4)|(mou=6)|(mou=9)|(mou=11) if(day=31) day=1; if(flag=1)&(j=1) j=0; hao=0; miao=0; fen=0; shi=0; /*K4* */ if(khour=0)/ display(); if(khour=0) do display();while(!khour); if(flag=0)&(dx=0)/调整时 hour+; if(hour=24) hour=0; display(); if(dx=1)&(flag=0)/调整年 year+; if(year%4=0
20、)&(year%100)!=0)|(year%400=0)&(mou=2)/闰年 if(day=30) day=1; if(mou=2)&(year%4!=0) if(day=29) day=1; /不是闰年 if(year%100=0) year=100*(year/100);/*K5*/ if(date=0) display();if(date=0) dodisplay(); while(!date);/键释放 dx=!dx; /时间和日期显示转换/*K6*/ if(bai=0) display(); if(bai=0) do display();while(!bai); /键释放if(f
21、lag=1) co=!co; /整点报时控制 if(loud=0)loud=1; /强制关闭整点闹铃 if(flag=0)&(dx=1) /年百位千位调整 year=year+100; if(year=10000) year=year%100;/*K7* */ if(save=0)&(dx=0)&(flag=0) display(); if(save=0) dodisplay();while(!save);/ /shour=hour; /保存闹铃设置的时smin=min; /保存闹铃设置的分/*K8*/ if(offl=0) display(); if(offl=0) do display(); while(!offl);/等待键释放 if(loud=0) loud=1; /强制关闭闹铃stopnao=!stopnao; /闹铃开关标志