8位数码管显示时钟(共16页)_第1页
8位数码管显示时钟(共16页)_第2页
8位数码管显示时钟(共16页)_第3页
8位数码管显示时钟(共16页)_第4页
8位数码管显示时钟(共16页)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#include unsigned char led12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00; /用一维数组定义-9、横杠、全灭unsigned char num12=2,0,0,9,3,5,0,7,0,1,2,0 ;unsigned char a8; unsigned char second=0,minute=0,hour=0,year=0,mon

2、=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char b8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/扫描unsigned char k=0;unsigned int temp; / 记录毫秒为秒的变量unsigned char M,S_flag;/M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbit K0=P37; /K0是闹钟起停标志位sbit K1=P30;sbit K2=P31;sbit K3=P32;sbit BEE

3、P=P33;void delay(unsigned n) /0.2毫秒 int x,y; for(x=0;xn;x+) for(y=0;y24;y+); void init1() S_flag=0; /闪烁标志位 TMOD=0x10; /定时器以方式定时 TH1=0xfc; TL1=0x18; EA=1; /打开总中断 ET1=1; /允许定时器中断 TR1=1; /开启定时器(开始定时计数) void init0() TMOD=0x01; /定时器以方式定时 TH0=0xff; TL0=0xff; EA=1; /打开总中断 ET0=1; /允许定时器中断 TR0=0; /关闭定时器(关闭定时

4、计数) void display_led() /流动显示学号int x;char l,a,m;for(a=0;a21;a+)x=a-8;for(l=0;l6;l+)for(m=0;m=0&x12) P1=lednumx;else P1=led11;delay(10);x+;x-=8;void display() /显示时钟及显示调节位 switch(M)case 0: a0=ledhour/10;a1=ledhour%10;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=led10;a6=ledsecond/10;a7=ledsecond%10; bre

5、ak;case 1:if(S_flag=1)a0=ledhour/10;a1=ledhour%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=led10;a6=ledsecond/10;a7=ledsecond%10;break;case 2:a0=ledhour/10;a1=ledhour%10;a2=led10;if(S_flag=1)a3=ledminute/10;a4=ledminute%10;elsea3=led11;a4=led11;a5=led10;a6=ledsecond/10;a7=le

6、dsecond%10;break; case 3:if(S_flag=1) a0=ledyear/10; a1=ledyear%10; else a0=led11; a1=led11; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10;break; case 4:a0=ledyear/10;a1=ledyear%10;a2=led10;if(S_flag=1)a3=ledmon/10;a4=ledmon%10;elsea3=led11;a4=led11;a5=led10;a6=ledday/10

7、;a7=ledday%10;break; case 5:a0=ledyear/10;a1=ledyear%10;a2=led10;a3=ledmon/10; a4=ledmon%10;a5=led10;if(S_flag=1) a6=ledday/10; a7=ledday%10; else a6=led11; a7=led11;break;case 6:if(S_flag=1)a0=ledhour1/10;a1=ledhour1%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute1/10;a4=ledminute1%10;a5=led10;a6=le

8、d11;a7=led11;break;case 7:a0=ledhour1/10;a1=ledhour1%10;a2=led10;if(S_flag=1)a3=ledminute1/10;a4=ledminute1%10;elsea3=led11;a4=led11;a5=led10;a6=led11;a7=led11; void key_prc()/时钟和闹钟调节 if(K1=0) delay(10);/延时去抖 if(K1=0) /按K1进行模式切换 M+;if(M=8) M=0;while(!K1);/等待按键释放 if(M!=0) switch(M) case 1: /模式-调时 if(

9、K2=0)delay(10);/延时去抖 if(K2=0) /加键按下 if(hour 0) hour-;else hour=23; while(!K3); break; case 2: /模式-调分 if(K2=0)delay(10);if(K2=0) if(minute0) minute-;else minute=59; while(!K3); break; case 3: /模式-调年 if(K2=0) delay(10); if(K2=0) if(year0) year-; else year=99; while(!K3); break;case 4: /模式-调月 if(K2=0)

10、delay(10); if(K2=0) if(mon1) mon-; else mon=12; while(!K3); if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)day1=28;/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; break; case 5: /模式-调日 if(K2=0) delay(10); if(K2=0) if(day1) day-; else da

11、y=day1; while(!K3); break; case 6: /模式-闹钟调时 if(K2=0)delay(10); if(K2=0) if(hour10) hour1-; else hour1=23; while(!K3); break; case 7: /模式-闹钟调分 if(K2=0)delay(10); if(K2=0) if(minute10) minute1-; else minute1=59; while(!K3); break; void display_rq() /年月日显示 if(K2=0) delay(10); if(K2=0) a0=ledyear/10; a1

12、=ledyear%10; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10; while(!K2); /等待按键释放void key_prc2() /秒表模式转换 if(M=0) if(K3=0) delay(10);/延时去抖 if(K3=0) /按K3进行模式切换 N+;if(N=2) N=0;while(!K3);/等待按键释放 void display_sec() /秒表显示 if(N=1) a0=ledmin_m/10; a1=ledmin_m%10; a2=led10; a3=led

13、sec_m/10; a4=ledsec_m%10; a5=led10; a6=ledhsec/10; a7=ledhsec%10; if(K2=0)delay(10);/延时去抖 if(K2=0) /加键按下 TR0=!TR0; while(!K2); /等待按键释放 void res_sec() /秒表复位 if(K1=0) delay(10); if(K1=0) min_m=0; sec_m=0; hsec=0; M=0; while(!K1) ; void main() /主程序 display_led();init0(); init1(); while(1) key_prc(); ke

14、y_prc2(); if(N=1) display_sec(); res_sec(); else display_rq();display(); void time1() interrupt 3 /定时器中断函数 if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)day1=28;/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; TH1=0xfc; /定时ms TL1=0x18; temp+; if(temp=1000) /配合定时器定时s temp=0; second+; if(second=60) second=0; if(minuteday1) day=1; mon+; if(mon12) mon=1; year+; if(year=99) year=0; if(hour1=hour&minute1=minute&K0=0) /闹钟时间到 BEEP=!BEEP; if(temp%250=0) /每ms S_flag=!S_flag; /闪烁标志位取反 if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论