ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:139.68KB ,
资源ID:7923881      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7923881.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(电子时钟设计及程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

电子时钟设计及程序.docx

1、电子时钟设计及程序电子时钟设计简介该设计主要由单片机AT89C51和液晶显示器组成,实现常用的实时电子钟功能。利用可编程芯片AT89C51强大的功能,我们了实现日历功能、时钟功能。该时钟使用液晶显示器作为显示模块,使用3个弹性小按键作为输入模块,调节年、月、日、星期、时、分、秒。一方案比较与论证 根据设计要求,该时钟系统可分输入部分、处理部分和显示数据部分。其中输入部分是键盘输入数据调整要显示的内容,处理部分单片机接收并通过算法处理键盘输入的信息变成显示模块所能接受的信息,显示部分是用来实时显示处理部分处理后的数据。 输入模块我们选用三个独立弹性小按键来实现,选用矩阵式键盘则太浪费资 处理模块

2、我们选用了STC公司的STC89C52芯片来,与Atmel公司生产的AT89S52一样,也是40脚双列直插式封装,这里芯片对刚学单片机的人来说容易入手,其功能也很强大,用来实现一个电子钟完全足够了。 显示部分我们可有两种选择:数码管和1602液晶显示器。实现一个电子钟若用数码管则需6个,所占空间相对大了些,而且我们还要实现日历的功能,需要更多的数码管,所点空间翻倍,而且还会造成单片机I/O引脚滥用甚至不够用,用液晶显示器来实现则方便得多,界面也相对友好,但液晶显示器有个缺点就是价格比较贵。因此我们最终选择了1602液晶显示器。另处独立弹性小按键具有价格便宜、容易获得、容易控制等特点。二系统理论

3、分析、计算与电路仿真1、定时器与中断原理 电子钟主要是利用单片机的定时器/计数器和中断来实现。定时器实际是加1计数器,单片机每运行一个机器周期定时器就自动加1,当计到所定的数N时,单片机就产生一次中断,停下所做的工作,转而去执行中断服务程序。单片机每个机器周期等于外部晶振的12个振荡周期,当外部晶振是12MHz时,则每个机器周期的时间是 Tcy = 121/12=1m (2-1)定数器设为N时,即每计到N时产生一次中断,而一次中断的时间为: t = NTcym (2-2)当产生X(x根据N来设置,两者之积为1000000)次中断后我就知道过了1s,再通过液晶显示出来,这样就达到了让液晶每隔一秒

4、跳一下的目的了。2、proteus仿真结果3、液晶部分 图4-3 液晶1、2端口分别是工作电源的负、正极,15、16是液晶背光灯电源正负极,R4起限流作用,避免电流过大烧坏背光灯。第3端口还可接一电位器,调节液晶显示对比度。无标号的8个端口是数据端,通过一上拉电阻接到单片机的P0口。三系统的软件设计(如必要,含有流程图)1、程序流程图流程图中的X表示液晶中秒、分、时、星期、年、月、日中的任一个。 图5-1 主程序流程图 图5-2 扫描键盘的子程序流程四系统测试及结果测试结果总的来说很满意,比预计的还要好。但由于中断函数中代码较长,故存在一定程度的误差,用秒表测试大约为每5分钟慢了一秒,这个问题

5、是用单片机定时器来数时所无法解决的,中断函数必定会较长,处理这一函数会花费一定的时间这就无法做到让时钟走得很精确。解决方法是用一时钟芯片来实现,由于时钟芯片不好买又比较贵(新的20几块一片),暂时就不考虑了,有机会再尝试。1 源程序/主函数放在最后面#include #define uchar unsigned char#define uint unsigned intsbit rs=P24;/定义液晶数据命令选择端sbit lcden=P25;/液晶使能端sbit s1=P20;/按键1sbit s2=P21;/按键2sbit s3=P22;/按键3uchar count,s1num;cha

6、r shi,fen,miao;/时、分、秒char year,month,day,week;/年月日星期void delay(uint x)/延时子程序 uint j,k; for(j=x;j0;j-) for(k=110;k0;k-);/-液晶写命令功能-void write_com(uchar com) rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;/-液晶写数据功能-void write_date(uchar date) rs=1; lcden=0; P0=date; delay(5); lcden=1; dela

7、y(5); lcden=0;/-写入时、分、秒-void write_sfm(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge);/-写入年、月、日-void write_nyr(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+add); write_date(0x30+shi); wri

8、te_date(0x30+ge);/-写入星期X-void write_week(uchar we) write_com(0x80+12); switch(we) case 1: write_date(M);delay(5); write_date(O);delay(5); write_date(N); break; case 2: write_date(T);delay(5); write_date(U);delay(5); write_date(E); break; case 3: write_date(W);delay(5); write_date(E);delay(5); write_

9、date(D); break; case 4: write_date(T);delay(5); write_date(H);delay(5); write_date(U); break; case 5: write_date(F);delay(5); write_date(R);delay(5); write_date(I); break; case 6: write_date(S);delay(5); write_date(A);delay(5); write_date(T); break; case 7: write_date(S);delay(5); write_date(U);dela

10、y(5); write_date(N); break; /-实现初始化功能-void init() lcden=0; shi=1; fen=1; miao=1; day=1; month=1; year=1; week=1; count=0; s1num=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80+1); write_date(2); write_com(0x80+2); write_date(0); write_com(0x80+5); write_date(-);

11、 write_com(0x80+8); write_date(-); write_nyr(9,day); write_nyr(6,month); write_nyr(3,year); write_week(week); write_com(0x80+0x40+6); write_date(:); write_com(0x80+0x40+9); write_date(:); write_sfm(10,miao); write_sfm(7,fen); write_sfm(4,shi); TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256;

12、 EA=1; ET0=1; TR0=1;/ -键盘扫描功能-void keyscan() if(s1=0)/键盘1是否被按下 delay(5);/如果检测到键盘被按下,延时约 if(s1=0)/5毫秒看是否为键下,这样可越过按 /键盘时的抖动时间,防止误判 s1num+; while(!s1); if(s1num=1) TR0=0; write_com(0x80+0x40+10); write_com(0x0f); if(s1num=2) write_com(0x80+0x40+7); if(s1num=3) write_com(0x80+0x40+4); if(s1num=4) write_

13、com(0x80+12); if(s1num=5) write_com(0x80+9); if(s1num=6) write_com(0x80+6); if(s1num=7) write_com(0x80+3); if(s1num=8) s1num=0; write_com(0x0c); TR0=1; if(s1num!=0)/键盘2是否被按下 if(s2=0) 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

14、(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) week+; if(week=8) week=1; write_week(week); write_com(0x80+12); if(s1num=5) day+; if(day=32) day=1; write_nyr(9,day); write_com(0x80+9

15、); if(s1num=6) month+; if(month=13) month=1; write_nyr(6,month); write_com(0x80+6); if(s1num=7) year+; if(year=100) year=0; write_nyr(3,year); write_com(0x80+3); 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(s

16、1num=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) week-; if(week=0) week=7; write_week(week); write_com(0x80+12); if(s1num=5) day-; if(day=0) day=31; write_nyr(9,day); write_com(0x80+9

17、); if(s1num=6) month-; if(month=0) month=12; write_nyr(6,month); write_com(0x80+6); if(s1num=7) year-; if(year=-1) year=99; write_nyr(3,year); write_com(0x80+3); /-主函数-void main() init(); /初始化子函数 while(1) keyscan(); /-中断服务子程序-void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; co

18、unt+; if(count=20) count=0; miao+; if(miao=60) miao=0; fen+; if(fen=60) fen=0; shi+; if(shi=24) shi=0; day+; week+; if(week=8) week=1; if(day=32) day=1; month+; if(month=13) month=1; year+; if(year=100) year=0; write_nyr(3,year); write_nyr(6,month); write_nyr(9,day); write_week(week); write_sfm(4,shi); write_sfm(7,fen); write_sfm(10,miao);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1