任务描述 | 重难点 |
完成数字钟系统的软硬件设计与调试,系统主要功能要求如下: 1. 在给定电路图基础上,完成数字钟系统设计; 2. 可以显示时间、日期、定时时间,具有闹钟功能; 3. 设计按键校准并设置时间、日期、闹钟时间,切换显示内容(时间、公历日期、闹钟时间); 4. 闹钟时间到,数码管做相应显示,蜂鸣器响; 5. 万年历功能,重点是大月、小月的设置,平年、闰年2月份的设置; 51单片机程序图: #include<reg51.h> #define uchar unsigned char unsigned char duanma[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xa3,0xa1}; // 段码 unsigned char weima[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //位码 unsigned char saomiao,jishu1,jishu2,shi,fen,miao,banmiao,jishu3,jishu22,nlmiao,Y1,Y2,Y3,nzs,nzf,nzm,year,month,day,jishu4; unsigned char xianshi[6]={0,0,0,0,0,0}; unsigned char flag; bit naoling; bit kaiting=0; sbit D1=P3^0; sbit D2=P3^1; sbit k1=P3^4; //停止 运行 sbit k2=P3^5; //时+1 sbit k3=P3^6; //分+1 sbit k4=P3^7; //秒+1 sbit k5=P0^1; //闹钟时+1 sbit k6=P0^2; //闹钟分+1 sbit k7=P0^3; //闹钟秒 sbit k8=P0^4; // 年+1 sbit k9=P0^5; // 月+1 sbit k10=P0^6; // 日+1 sbit sm=P3^2; sbit QH=P0^0; void chushihua (void) { TMOD=0x11; EA=1; ET0=1;TR0=1;ET1=1; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; Y1=shi;Y2=fen;Y3=miao; } void date(void) { day++; if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) { if(day==32)day=1; } if((month==4)||(month==6)||(month==9)||(month==11)) { if(day==31)day=1; } if(month==2) { if(((((year+2000)%4)==0)&&(((year+2000)%100)!=0))||(((year+2000)%400)==0)) { if(day==30)day=1; } else if(day==29)day=1; } if(day==1) { month++; if(month==13) { month=1; year++; if(year==100)year=0; } } } void yanshi (void) { unsigned char i,j,k; for(i=250;i>0;i--) for(j=100;j>0;j--); for(k=100;k>0;k--); } void naol (void) interrupt 3 { TH1=(65536-1000)/256; TL1=(65536-1000)%256; D1=~D1; } void shuzizhongduan (void) interrupt 1 { TH0=(65536-5000)/256; TL0=(65536-5000)%256; if(flag==0) { Y1=shi;Y2=fen;Y3=miao; } if(flag==1) { Y1=nzs;Y2=nzf;Y3=nzm; } if(flag==2) { Y1=year;Y2=month;Y3=day; } xianshi[0]=duanma[Y1/10]; xianshi[1]=duanma[Y1%10]; xianshi[2]=duanma[Y2/10]; xianshi[3]=duanma[Y2%10]; xianshi[4]=duanma[Y3/10]; xianshi[5]=duanma[Y3%10]; jishu1++; if(jishu1==6) { jishu1=0; } P2= weima[jishu1];//位码 P1=xianshi[jishu1];//段码 jishu2++; if(jishu2==100) { if(naoling) nlmiao++; } jishu2++; banmiao++; if(banmiao==100) { banmiao=0; D1=~D1; D2=~D2; } jishu3++; if(jishu3==200) { jishu3=0; if(kaiting==0) { miao++; } if(naoling) { sm=~sm; } if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; date(); } } } } } void main (void) { year=17;month=6;day=15; shi=23;fen=58;miao=46; chushihua(); while(1) { if(QH==0) { flag++; if(flag==3) flag=0; if(flag==0) { Y1=shi,Y2=fen,Y3=miao; } if(flag==1) { Y1=nzs;Y2=nzf;Y3=nzm; } if(flag==2) { Y1=year;Y2=month;Y3=day; } while(QH==0) ; } P0 = 0xff; saomiao=P0; if(saomiao!=0xff) { saomiao=P0; yanshi(); if(saomiao!=0xff) { if(flag==1) { if(k5==0) { if(nzs==23) { nzs=0; } else nzs++; } if(k6==0) { if(nzf==60) { nzf=0; } else nzf++; } if(k7==0) { if(nzm==60) { nzm=0; } else nzm++; } } } } P0 = 0xff; saomiao=P0; if(saomiao!=0xff) { saomiao=P0; yanshi(); if(saomiao!=0xff) { if(flag==2) { if(k8==0) { if(year==99) { year=17; } else year++; } if(k9==0) { if(month==12) { month=1; } else month++; } if(k10==0) { day++; if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) { if(day==32)day=1; } if((month==4)||(month==6)||(month==9)||(month==11)) { if(day==31)day=1; } if(month==2) { if(((((year+2000)%4)==0)&&(((year+2000)%100)!=0))||(((year+2000)%400)==0)) { if(day==30)day=1; } else if(day==29)day=1; } } } } } if((shi==nzs)&&(fen==nzf)&&(miao==nzm)) { TR1=1; naoling=1; } if(nlmiao==5) { nlmiao=0; TR1=0; naoling=0; } P3 = 0xff; saomiao=P3; if(saomiao!=0xff) { saomiao=P3; yanshi(); if(saomiao!=0xff) { if(k1==0) { kaiting=~kaiting; } if((k2==0)&&(kaiting==1)) { if(shi==23) { shi=0; } else shi ++; } if((k3==0)&&(kaiting==1)) { if(fen==59) { fen=0; } else fen ++; } if((k4==0)&&(kaiting==1)) { if(miao==59) { miao=0; } else miao ++; } while(P3!=0xff); } } } } | 1. 蜂鸣器的控制; 2. 万年历算法; 3. 各种信息的交替显示; 4.系统的统调。 |
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |