6位单片机电子钟.doc_第1页
6位单片机电子钟.doc_第2页
6位单片机电子钟.doc_第3页
6位单片机电子钟.doc_第4页
6位单片机电子钟.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

6位单片机电子钟1. 硬件电路设计: 我们此次设计的电子钟采用2个3位共阳LED数码管作为显示器件,以STC89C52单片机作为控制器,可以显示时分秒。具体电路设计如下图:二:源程序: #include at89x52.h #define uchar unsigned char #define uint unsigned int uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff; uchar code tab1=0x40,0x79,0x24,0x30,0x19,0x12,0x42,0x78,0x00,0x10; uchar n; uchar hh,mm,ss; uchar nhh,nmm,nss; uint year; uchar day,mon,week; uchar hhs,hhg,mms,mmg,sss,ssg; uchar days,dayg,mons,mong; uchar nhhs,nhhg,nmms,nmmg,nsss,nssg; uchar set1=1,set2=1; sbit fm=P36; sbit k1=P10; sbit k2=P11; sbit k3=P12; sbit k4=P13; uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年 uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年 void jishi(); void baoshi(); void alarm(); void set_time(); void set_alarm(); void set_mdw(); void key_change(); void key_set();void delay(int m) /延时程序,延时m*0.5ms uint i; uint j; for (i=0;im;i+) for(j=0;j50;j+); void timer0( ) interrupt 1 TMOD=0x01; TH0=0x3c; TL0=0xb1; n+; jishi(); main() TMOD=0x01; TH0=0x3c; TL0=0xb1; TR0=1; EA=1; ET0=1; hh=23;mm=59;ss=50; nhh=7;nmm=30;nss=0; year=2008;mon=12;day=1;week=1; while(1) hhs=hh/10;/时分秒 hhg=hh%10; mms=mm/10; mmg=mm%10; sss=ss/10; ssg=ss%10; nhhs=nhh/10;/闹钟 nhhg=nhh%10; nmms=nmm/10; nmmg=nmm%10; nsss=nss/10; nssg=nss%10; days=day/10;/月日 dayg=day%10; mons=mon/10; mong=mon%10; key_change(); /k1按键扫描 key_set(); /k2按键扫描 set_time(); /设置时间 set_mdw(); /设置月日星期 set_alarm(); /设置闹钟if(set1=1) /正常走时显示 P0=tabhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1hhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1mmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=2) /设置时间 P0=tabhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1hhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1mmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=3) /正常显示月日-星期 P0=tabmons;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1mong;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabdays;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1dayg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tab11;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabweek;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=4) /设置月日-星期 P0=tabmons;P2_5=0;delay(1);P2_5=1;/时十位 P0=tabmong;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabdays;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabdayg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tab11;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabweek;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=5) /正常显示定时 P0=tabnhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tabnhhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabnmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabnmmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabnsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabnssg;P2_0=0;delay(1);P2_0=01;/秒个位 if(set1=6) /设置闹钟定时 P0=tabnhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tabnhhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabnmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabnmmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabnsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabnssg;P2_0=0;delay(1);P2_0=01;/秒个位 baoshi(); /整点报时 alarm(); /闹钟 void jishi() /计时函数 if(n=20) n=0;ss+; if(ss=60) ss=0;mm+; if(mm=60) mm=0;hh+; if(hh=24) hh=0;day+;week+; if(week=8) week=0; if(year%4=0&year%100!=0|year%400=0) /闰年 if(day=table1mon+1) day=0;mon+; if(mon=13) mon=0;year+; else /非闰年 if(day=table2mon+1) day=0;mon+; if(mon=13) mon=0;year+; uchar incone(uchar n) /加1函数 if(k3=0) delay(20); if(k3=0) n+; while(!k3); return(n); uchar decone(uchar m) /减1函数 if(k4=0) delay(20); if(k4=0) m-; while(!k4); if(m0) m=0; return(m); void key_change() /k1按键扫描 if(k1=0) delay(20); if(k1=0) set1+; while(!k1); if(set1=7) set1=1; void key_set() /k2按键扫描 if(k2=0) delay(20); if(k2=0) set2+; while(!k2); if(set2=4) set2=1; void baoshi() /整点报时函数 if(mm=00&ss=00) fm=0; if(ss=1) fm=1; void alarm( ) /闹钟函数 uchar x; if(nhh=0) goto end; if(hh=nhh&mm=nmm&ss=nss) for(x=0;x6;x+) fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(180); end:; void set_time() /设置时间函数 if(set1=2) if(set2=1) hh=incone(hh); if(hh=24) hh=0; if(hh=-1) hh=23; hh=decone(hh); if(set2=2) mm=incone(mm); if(mm=60) mm=0; if(mm=-1) mm=59; mm=decone(mm); if(set2=3) ss=incone(ss); if(ss=60) ss=0; if(ss=-1) ss=59; ss=decone(ss); void set_mdw() /设置月日星期函数 if(set1=4) if(set2=1) mon=incone(mon); if(mon=13) mon=1; mon=decone(mon); if(mon=0) mon=12; if(set2=2) day=incone(day); if(day=32) day=1; day=decone(day); if(day=0) day=31; if(set2=3) week=incone(week); if(week=8) week=1; week=decone(week); if(week=0) week=7; void set_alarm() /设置闹钟函数 if(set1=6) if(set2=1) nhh=incone(nhh)

温馨提示

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

评论

0/150

提交评论