用proteus实现简单的万年历仿真

一、设计题目:万年历

二、设计任务

显示年月日和相对应的时间,实现时间的进位 并且可以显示平年和闰年,对二月进行分析。

三、电路设计

3.1设计方法

基本上按照模块完成,我将它分为时间模块、日期模块、年份模块通过逻辑电路建立联系。通过发出脉冲信号实现从秒到分小时以及日期的变化。通过查询资料,找到合适的具有相应功能的芯片,设计条件电路或者状态电路,具体电路如下: 

3.2电路工作原理分析

(1)日期模块

利用两块CC40192计数器构成日十位、日个位,利用.数据选择器根据月份的情况分别构成31进制、30进制.28进制(闰年29进制)的加法计数器。利用两块CC40192计数器构成12进制加法计数器表示月十位和月个位。利用CC40192相应的输出分别经译码显示器进行显示月份和日数。在数据选择方面,使用了74LS153芯片,使用卡诺图法对每个月份该输出的日期进行了化简,从而得到了相应月份对应的日期。对于平年和闰年的实现是通过74LS153来实现每四年一个循环

(2)时间模块


在时间模块我是通过6块74LS160来实现十进制的加法,秒和分钟都是60进制的,小时是24进制。这些模块都是通过个位的RCO端来控制十位的ENT和ENP端来实现进位,在秒到分钟的进位是通过一个与非门和一个非门来实现的,因为分钟和秒的进制都是60进制,所以都是在十位连接下一位的时钟端使得74LS160实现秒到分钟的进位,同时连接自身的MR端使十位置零。分钟到小时的进位也是同理。

(3)年份模块

  通过两块CC40192实现,从2001年开始计时,每四年会显示一个闰年,时钟端与日期模块的年份判断相连,年份每置一一次,会使40192累加一次,以此来实现年份的进位。

四、技术难点与总结

本实验是通过对每四年一个循环来实现对闰年和平年的判断,所以如果要实现校准功能的话,首先是对年份进行判断是否为4的倍数,这一部分难以实现,但是如果通过编程的话会很好实现,所以我使用单片机实现了校准功能。

五、对实验的改进

在这部分中,我使用了单片机的LCD1602显示屏模块和DS1302模块来实现万年历。首先是对以上函数进行了添加,通过程序实现了对万年历的校准,第一个按键设置为修改,第二个按键是调整对哪一个模块进行修改,第三个和第四个按键为对当前模块进行加减,到此实现了万年历的校准功能。


六、附录

A原理图

一、设计题目:万年历

二、设计任务

显示年月日和相对应的时间,实现时间的进位 并且可以显示平年和闰年,对二月进行分析。

三、电路设计

3.1设计方法

基本上按照模块完成,我将它分为时间模块、日期模块、年份模块通过逻辑电路建立联系。通过发出脉冲信号实现从秒到分小时以及日期的变化。通过查询资料,找到合适的具有相应功能的芯片,设计条件电路或者状态电路,具体电路如下: 

3.2电路工作原理分析

(1)日期模块

利用两块CC40192计数器构成日十位、日个位,利用.数据选择器根据月份的情况分别构成31进制、30进制.28进制(闰年29进制)的加法计数器。利用两块CC40192计数器构成12进制加法计数器表示月十位和月个位。利用CC40192相应的输出分别经译码显示器进行显示月份和日数。在数据选择方面,使用了74LS153芯片,使用卡诺图法对每个月份该输出的日期进行了化简,从而得到了相应月份对应的日期。对于平年和闰年的实现是通过74LS153来实现每四年一个循环

(2)时间模块


在时间模块我是通过6块74LS160来实现十进制的加法,秒和分钟都是60进制的,小时是24进制。这些模块都是通过个位的RCO端来控制十位的ENT和ENP端来实现进位,在秒到分钟的进位是通过一个与非门和一个非门来实现的,因为分钟和秒的进制都是60进制,所以都是在十位连接下一位的时钟端使得74LS160实现秒到分钟的进位,同时连接自身的MR端使十位置零。分钟到小时的进位也是同理。

(3)年份模块

  通过两块CC40192实现,从2001年开始计时,每四年会显示一个闰年,时钟端与日期模块的年份判断相连,年份每置一一次,会使40192累加一次,以此来实现年份的进位。

四、技术难点与总结

本实验是通过对每四年一个循环来实现对闰年和平年的判断,所以如果要实现校准功能的话,首先是对年份进行判断是否为4的倍数,这一部分难以实现,但是如果通过编程的话会很好实现,所以我使用单片机实现了校准功能。

五、对实验的改进

在这部分中,我使用了单片机的LCD1602显示屏模块和DS1302模块来实现万年历。首先是对以上函数进行了添加,通过程序实现了对万年历的校准,第一个按键设置为修改,第二个按键是调整对哪一个模块进行修改,第三个和第四个按键为对当前模块进行加减,到此实现了万年历的校准功能。


六、附录

A原理图

B参考文献

[1]张申科,岳备.数字电路与逻辑设计[]M.上海:同济大学出版社

[2]蒋黎红,黄培根,朱维婷.模电数电基础实验及Multisim 7仿真[M].杭州:浙江大学出版社,2007:182.
[3]华成英.数字电子技术基础[M].北京:高等教育出版社

C元器件清单

数码管    7SEG-BCD            14

数字芯片  74LS160             6

          74LS153             2

          40193               1

          40192               4

其他      逻辑门              若干

          信号源              1

         

七、仿真调试相关文件说明

一个proteus仿真,是对简易万年历的实现。

一个k5文件,包括了该万年历系统的程序。

一个视频,录制了如何对该万年历进行校准。

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
**********************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]=" 2013-07-30 WED "; uchar code table1[]=" 21:14:55"; uchar code table2[]=" 579259 "; uchar code table3[]="Made by Lisongze"; uchar code table4[]="MONTUEWEDTHUFRISATSUN"; uchar count,s1num; char miao,fen,shi,ri,yue; uint nian; sbit lcd_rs = P0^5; sbit lcd_rw = P0^6; sbit lcd_en = P0^7; sbit s1=P3^7; sbit s2=P3^6; sbit s3=P3^5; sbit g=P3^0; void delay(uint z)//延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)//写命令函数 { lcd_rs = 0; P2= com; delay(5); lcd_en=1; delay(5); lcd_en=0; } void write_date(uchar date)//写数据函数 { lcd_rs = 1; P2= date; delay(5); lcd_en=1; delay(5); lcd_en=0; } void init()//初始化函数 { int num; shi=21; fen=14; miao=55; ri=30; yue=7; nian=2013; lcd_en=0; lcd_rw=0; write_com(0x38);//显示设置模式 write_com(0x0c);//00001100开显示,不显示光标,光标不闪烁 write_com(0x06);//00000110地址指针加一,整屏不移动 write_com(0x01);//清屏 write_com(0x80); for(num=0;num<16;num++)//显示数字579259 { write_date(table2[num]); delay(300); } write_com(0x80+0x40); for(num=0;num<16;num++)//显示made by lisongze { write_date(table3[num]); delay(300); } delay(5000); write_com(0x01); write_com(0x80); for(num=0;num<16;num++)//显示日期 { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<12;num++)//显示时间 { write_date(table1[num]); delay(5); } TMOD=0x01;//启动定时器中断 TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; ET0=1; TR0=1;//打开定时器 } void write_sfm(uchar add,uchar date)//写时分秒函数 { uchar shi,ge; shi=date/10; ge=date; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void write_nyr(uint add,uint date)//写年月日函数,此处若用uchar范围只有0-255 { //不够,改用uint(0-65535) uint qian,bai,shi,ge; qian=date/1000; bai=date00/100; shi=date0/10; ge=date; write_com(0x80+add); write_date(0x30+qian); write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } void write_yr(uchar add,uchar date)//写月日函数 { uchar shi,ge; shi=date/10; ge=date; write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge); } void keyscan()//按键扫描函数 { int m,n; g=0;//将矩阵键盘当做独立键盘使用 if(s1==0) { delay(5); if(s1==0)//按键1光标移位扫描 { s1num++; if(s1num==1) { while(!s1);//等待按键松手 write_com(0x80+0x40+10); TR0=0;//关闭定时器 write_com(0x0f); } if(s1num==2) { while(!s1); write_com(0x80+0x40+7); } if(s1num==3) { while(!s1); write_com(0x80+0x40+4); } if(s1num==4) { while(!s1); write_com(0x80+3); } if(s1num==5) { while(!s1); write_com(0x80+6); } if(s1num==6) { while(!s1); write_com(0x80+9); } if(s1num==7) { while(!s1) write_com(0x80+13); } if(s1num==8) { while(!s1); s1num=0; write_com(0x0c); TR0=1;//开定时器 } } } if(s1num!=0) { if(s2==0)//按键2加功能 { delay(5); if(s2==0) { while(!s2); if(s1num==1)//秒加 { miao++; if(miao==60) { miao=0; } write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num==2)//分加 { fen++; if(fen==60) { fen=0; } write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num==3)//时加 { shi++; if(shi==24) { shi=0; } write_sfm(4,shi); write_com(0x80+0x40+4); } if(s1num==4)//年加 { nian++; if(nian==10000) { nian=2000; } write_nyr(1,nian); write_com(0x80+3); } if(s1num==5)//月份加 { yue++; if(yue==13) { yue=1; } write_yr(6,yue); write_com(0x80+6); } if(s1num==6)//日期加 { ri++; if(ri==29&&yue==2&&!((nian%4==0&&nian0!=0)||nian%400==0)) { ri=1;//平年 } if(ri==30&&yue==2&&((nian%4==0&&nian0!=0||nian%400==0))) { ri=1;//闰年 } if(ri==31&&(yue==4||yue==6||yue==9||yue==11)) { ri=1; } if(ri==32) { ri=1; } write_yr(9,ri); write_com(0x80+9); } if(s1num==7)//星期加 { m=m+3; if(m==21) m=0; write_com(0x80+12); for(n=m;n<m+3;n++) { write_date(table4[n]); delay(5); } write_com(0x80+13); } } } if(s3==0)//按键3减功能 { delay(5); if(s3==0) { while(!s3); if(s1num==1)//秒减 { miao--; if(miao==-1) { miao=59; } write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num==2)//分减 { fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num==3)//时减 { shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); } if(s1num==4)//年减 { nian--; if(nian==1999) nian=2000; write_nyr(1,nian); write_com(0x80+3); } if(s1num==5)//月份减 { yue--; if(yue==0) yue=12; write_yr(6,yue); write_com(0x80+6); } if(s1num==6)//日减 { ri--; if(ri==0) { if(yue==2&&!((nian%4==0&&nian0!=0)||nian%400==0)) { ri=28;//平年 } if(yue==2&&((nian%4==0&&nian0!=0||nian%400==0))) { ri=29;//闰年 } if(yue==4||yue==6||yue==9||yue==11) { ri=30; } if(yue==1||yue==3||yue==5||yue==7||yue==9||yue==11) ri=31; } write_yr(9,ri); write_com(0x80+9); } if(s1num==7)//星期减 { m=m-3; if(m==0) m=21; write_com(0x80+12); for(n=m;n-3<m;n++) { write_date(table4[n-3]); delay(5); } write_com(0x80+13); } } } } } void main() { int i,j; init(); while(1) { keyscan(); if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; ri++; j=j+3; if(j==21) j=0; write_com(0x80+12); for(i=j;i<j+3;i++) { write_date(table4[i]); delay(5); } if(ri==29&&yue==2&&!((nian%4==0&&nian0!=0)||nian%400==0)) { ri=1;yue++;//平年 } if(ri==30&&yue==2&&((nian%4==0&&nian0!=0||nian%400==0))) { ri=1;yue++;//闰年 } if(ri==31&&(yue==4||yue==6||yue==9||yue==11)) { ri=1;yue++; } if(ri==32) { ri=1;yue++; } if(yue==13) { yue=1; nian++; if(nian==10000) { nian=2000; } write_nyr(1,nian); } write_yr(6,yue); } write_yr(9,ri); write_sfm(4,shi); } write_sfm(7,fen); } write_sfm(10,miao); } } } void timer() interrupt 1 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; count++; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值