基于STC89C51单片机的万年历制作方法_第1页
基于STC89C51单片机的万年历制作方法_第2页
基于STC89C51单片机的万年历制作方法_第3页
基于STC89C51单片机的万年历制作方法_第4页
基于STC89C51单片机的万年历制作方法_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、基于51单片机的万年历论文学校 华侨大学学院 信息科学与工程学院班级 10级 集成电路设计与集成系统一、 摘要1、2、74lLS245摘要:74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。3、四位一体共阴数码管管脚图:二、 所用到的元器件:元器件各类、及参数、个数STC89C51RC系列单片机1个按键开关5个上拉电阻10K1组其它各类电阻220/8个、10K/4个、1K/个1n4148二极管4个电容22uf/1个、30pf/2个FJ3461AH类4位一体共阴数码管2组12

2、MHz晶振1个导线若干1、天关及其功能:P1_0 /时钟秒或日历天调整P1_1 /时钟分或日历月调整P1_2; /时钟时或日历年调整P1_3 /时间与日历间的切换RST:复位。三、protues仿真图:四1、Altium designer下的原理图:2、Altium designer下的PCB图:五、c语言源代码:#include#include#define uchar unsigned char#define uint unsigned int/*七段共阳管显示定义*/ uchar code dispcode = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0

3、7,0x7f,0x6f,0x40,0x80; /此表为 LED 的字模, 共阳数码管 0-9 ,_ 和./*定义并初始化变量*/uchar seconde=0;/秒uchar minite=0;/分uchar hour=12; /时uchar day=24;/日uchar month=3;/月uint year=2012,a=1,b=1,c=1; /年和下降沿变量uchar mstcnt=0;/定时器计数,定时50ms,mstcnt满20,秒加1int dateadd1=0;sbit P1_0=P10; /时钟秒或日历天调整sbit P1_1=P11; /时钟分或日历月调整sbit P1_2=

4、P12; /时钟时或日历年调整sbit P1_3=P13; /时间与日历间的切换/*函数声明*/void delay(uint k ); /延时子程序void time_pro( ); /时间处理子程序void display( ); /时间显示调整子程序void dateadd(int m); /日历处理子程序void calendar( ); /日历显示调整子程序/*延时子程序*/void delay (uint k)uchar j;while(k-) for(j=0;j125;j+) ; /*时间处理子程序*/void time_pro(void) if(seconde=60) seco

5、nde=0; minite+; if(minite=60) minite=0; hour+; if(hour=24) hour=0; dateadd1+; /*时间显示调整子程序*/void display(void) if(P1_3=1) /*时间调整键盘扫描子程序*/ if(P1_0!=a)/秒位的调整,下降沿有效 delay(10); if(P1_0=0) seconde+; if(seconde=60) seconde=0; a=P1_0; if(P1_1!=b)/分位的调整,下降沿有效 delay(10); if(P1_1=0) minite+; if(minite=60) mini

6、te=0; b=P1_1; if(P1_2!=c)/时位的调整,下降沿有效 delay(10); if(P1_2=0) hour+; if(hour=24) hour=0; c=P1_2; /*时间显示子程序*/P3=0Xfe;P0=dispcodehour/10;/时十位 delay(2); P3=0Xfd; P0=dispcodehour%10;/时个位 delay(2); P3=0Xfb; P0=dispcode10;/间隔符 - delay(2); P3=0Xf7; P0=dispcodeminite/10;/分十位 delay(2); P3=0Xef; P0=dispcodemini

7、te%10;/分个位 delay(2); P3=0Xdf; P0=dispcode10;/间隔符 - delay(2); P3=0Xbf; P0=dispcodeseconde/10;/秒十位 delay(2); P3=0X7f; P0=dispcodeseconde%10;/秒个位 delay(2); /*日历处理子程序*/void dateadd( int m) /日期加1函数 if(m) dateadd1-; switch(month) case 1: if( day=31) day=1; month+; break; else day=day+1; break; case 2: if(

8、year%400=0)|(year%4=0&year%100!=0) if(day=29) month+; day=1; break; else day=day+1; break; else if(day=28) month+; day=1; break; else day=day+1; break; case 3: if( day=31) month+; day=1; break; else day=day+1; break; case 4: if( day=30) month+; day=1; break; else day=day+1; break; case 5: if( day=31

9、) month+; day=1; break; else day=day+1; break; case 6: if( day=30) month+; day=1; break; else day=day+1; break; case 7: if( day=31) month+; day=1; break; else day=day+1; break; case 8: if( day=31) month+; day=1; break; else day=day+1; break; case 9: if( day=30) month+; day=1; break; else day=day+1;

10、break; case 10: if( day=31) month+; day=1; break; else day=day+1; break; case 11: if( day=30) month+; day=1; break; else day=day+1; break; case 12: if( day=31) year+; month=1; day=1; break; else day=day+1; break; default:break; /*日历显示调整模块*/void calendar(void) if(P1_3=0) /*日历调整键盘扫描子程序*/ /日期调整, p1_0日,

11、 p1_1月,p1_2年 /日的调整,下降沿有效if(P1_0!=a) delay(10);if(P1_0=0) if(month=1|month=3|month=5|month=7|month=8|month=10) if(day=31) day=1;month+; else day=day+1; if(month=12) if(day=31) day=1;month=1;year+;else day=day+1; else if(month=4|month=6|month=9|month=11) if(day=30) day=1;month+; else day=day+1; else i

12、f(month=2) if(year%400=0)|(year%4=0&year%100!=0) if(day=29) day=1;month+; else day=day+1; else if(day=28) day=1; month+; else day=day+1; a=P1_0; if(P1_1!=b) /月的调整,下降沿有效 delay(10); if(P1_1=0) if(month=12) month=1;year+; else month=month+1; if(day=31)&(month=2|month=4|month=6|month=9|month=11) day=1;

13、if(day=30&month=2) day=1; if(day=29&month=2) if(!(year%400=0)|(year%4=0)&(year%100!=0) day=1; b=P1_1;if(P1_2!=c) delay(10); if(P1_2=0) year=year+1; if(!(year%400=0)|(year%4=0)&(year%100!=0) if(month=2&day=29) day=1; c=P1_2; /*日历显示模块*/ P3=0Xfe; P0=dispcode(year/1000);/年千位 delay(2); P3=0Xfd; P0=dispco

14、de(year/100)%10);/年百位 delay(2); P3=0Xfb; P0=dispcode(year/10)%100);/年十位 delay(2); P3=0Xf7; P0=dispcode(year%10);/年个位 delay(2); P3=0Xf7; P0=dispcode11;/. delay(2); P3=0Xef; P0=dispcode(month/10);/月十位 delay(2); P3=0Xdf; P0=dispcodemonth%10;/月个位 delay(2); P3=0Xdf; P0=dispcode11;/年个位 delay(2); P3=0Xbf;

15、P0=dispcodeday/10;/日十位 delay(2); P3=0X7f; P0=dispcodeday%10;/日个位 delay(2); void timer0(void) interrupt 1 /定时器0方式1,10ms中断一次 TH0=0xd8; /手动加载计数脉冲次数 TL0=0xf0; TMOD=0x11; /使用16位定时器 mstcnt+; /用于计算时间,每隔10ms加1 if(mstcnt=100)/mstcnt满10即为一秒 seconde+;/秒+1 mstcnt=0; /对计数单元的清零,重新开始计数 /*主函数*/void main(void) P1=0X

16、ff; TMOD = 0x11; /time0为定时器,方式1 TH0=0xd8; TL0=0xf0; /预置计数初值,10ms EA=1; /总中断开 ET0=1; /允许定时器0中断 ET1=1; TR0=1; /开启定时器0 TR0=1; while (1) time_pro( ); /时间处理 display( ); /显示时间 dateadd(dateadd1); /日历处理子程序calendar( ); /日历显示子程序六、 成品:七、总结本次是我第一次参加电子竞赛,通过这次电子竞赛使我基本掌握了51单片机、数码管、74LS245芯片等的运用。同时使我深化了对keil、protues、Altium designer等单片机设计必用软件的理解。在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多课本上学不到的知识。虽然在设计中出现了一些不应该出现的问题,但是经过我不断的

温馨提示

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

评论

0/150

提交评论