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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于STC89C52的时钟系统.docx

1、基于STC89C52的时钟系统基于STC89C52的时钟系统摘 要结合锐志RZ-51V2.0学习时钟设计的要求,把单片机中数字时钟的设计作为一个项目,在达到熟练使用相应软件的前提下,通过仿真器进行硬件仿真,以完成一个程序完整的设计过程。并作出相应的结论。利用单片机进行设计等,且各有特点。其中利用单片机实现时钟的设计方法,具有电路简单、编程灵活、便于扩展、精确度高、稳定性好等优点,关键词:单片机;数字时钟;设计;仿真1引言32设计要求33电路模块331 单片机模块332 DS1302数字芯片模块333 数码管显示模块44软件程序工作原理441 时钟设计部分程序5程序代码6结论20参考文献211、

2、引言 现代电子系统的基本核心是单片机,而单片机的应用能使爱好者既动脑、又动手地进行软件设计和硬件制作,再加上单片机原理与应用课程是目前职业学校电类专业的主干课之一,其操作性很强,利用AT89C51 单片机,实现断电自动保护显示数据的功能2、设计要求1.时间显示在1602液晶上,并且按秒实时更新。2.能够使用板上的按键随时调节时钟的时、分、秒,按键可设计三个有效键,分别为功能选择键,数值增大键和数值减小键。3.每次有键按下时,蜂鸣器都以短“滴”声报警。4.利用板上AT24C08设计实现断电自动保护显示数据的功能,当下次上电时会接着上次断电前的时间数据继续运行。5.扩展显示年、月、日、星期功能。3

3、、电路模块 31 单片机模块本温度控制系统的核心部分即单片机模块采用STC89C52RC单片机,该单片机指令代码完全兼容传统8051单片机。STC89C52单片机的工作电压为5.5V-3.4V,工作频率范围0-80MHz,程序存储器flash容量为8KB,随机存储器RAM空间为512字节,完全满足设计温度控制系统的要求。 3、2 DS1302数字芯片模块DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与

4、31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。 3、3数码显示模块本温度控制系统选用的显示部分由7段LED数码管并列组成动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形

5、,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据。4、软件程序设计原理把数字时钟设计作为一个项目时,应该对单片机应用系统的开发过程有一个比较深入的了解。整个开发过程包括三个部分:总体设计;硬件设计调试;软件设计调试。软件设计调试由流程图(先粗后细),分配I/O,内存,编程,编辑,汇编,仿真调试等7 部分组成。在教学中可以先通过几个简单程序的编写,熟悉

6、程序的设计过程。第一个程序设计要求在仿真器的个位上显示“5”字,程序如下:mov p2,#0efh ;显示位数mov p0,#0a7h ;显示“5”sjmp $end第二个程序:让“F”循环移位,每秒移位一位,熟悉延时子程序的应用。loop: mov p2,#0efh delay: mov r3,#0ffhmov p0, #047h delay1: mov r4,#0ffhacall delay del ay2: nopmov p2,#0dfh nopmov p0, #047h nopacall delay djnz r4,delay2: djnz r3,delay1: ret延时子程序如右方

7、所示end完整程序见网址通过以上程序的设计,使设计者对软件调试过程有了一定的了解后。下一步进行数字时钟的设计。此软件程序由主程序、动态显示子程序、定时器中断服务程序和延时子程序组成。系统初始化后,启动T0,定时时间为50ms,然后累加20 次的方法定时1s,计满60s 就让分单元加1,秒单元清零,循环往复,直至显示59 min59s 后全部清零,重新开始计数。笔者用四位数码管个位,十位代表秒显示,从零开始计数,百位,千位代表分显示,十位和百位中间用小数点闪烁显示。下面是一个完整的数字时钟显示程序框图。根据框图设计一个完整的数字时钟显示程序,然后在KeilC51 环境中,进行一个项目的建立,输入

8、源文件。源文件程序可登陆 下载。调试软件5、程序代码/按4X4键盘的E键 进入设定状态/D键是减设定键/C按键加设定键#include reg52.h#include /包含随机函数rand()的定义文件#include /包含_nop_()函数定义的头文件#define OP_READ 0xa1 / 器件地址以及读取操作,0xa1即为1010 0001B#define uchar unsigned char#define OP_WRITE 0xa0 / 器件地址以及写入操作,0xa1即为1010 0000Bsbit SDA=P35; /将串行数据总线SDA位定义在为P3.5引脚sbit SC

9、L=P34; /将串行时钟总线SDA位定义在为P3.4引脚sbit RW=P21;sbit RS=P20;sbit E=P22;sbit BEEP=P36;bit at=0;uchar display_buffer116; /显示缓冲区uchar code shen=Hello!;uchar code word=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20;uchar dispbuf8,h,m,s,counter,counter1=0,y,mo,d,t=1;/*函数功能:延时1ms(3j+2)*i=(333+2)10=1

10、010(微秒),可以认为是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i; for(i=0;in;i+) delay1ms(); /*/void beep() /蜂鸣器响一声函数unsigned char i;for (i=0;i25;i+)delaynms(2);BEEP=!BEEP; /BEEP取反BEEP=1; /关闭蜂鸣器delaynms(100);

11、/延时void start()/ 开始位 SDA = 1; /SDA初始化为高电平“1” SCL = 1; /开始数据传送时,要求SCL为高电平“1” _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SDA = 0; /SDA的下降沿被认为是开始信号 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) /*函

12、数功能:结束数据传送*/void stop()/ 停止位 SDA = 0; /SDA初始化为低电平“0” _n SCL = 1; /结束数据传送时,要求SCL为高电平“1” _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SDA = 1; /SDA的上升沿被认为是结束信号 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SDA=0; SCL=0;/*函数功能:从AT24Cxx读取数据出口参

13、数:x*/unsigned char ReadData()/ 从AT24Cxx移入数据到MCU unsigned char i; unsigned char x; /储存从AT24Cxx中读出的数据 for(i = 0; i 8; i+) SCL = 1; /SCL置为高电平 x=1; /将x中的各二进位向左移一位 x|=(unsigned char)SDA; /将SDA上的数据通过按位“或“运算存入x中 SCL = 0; /在SCL的下降沿读出数据 return(x); /将读取的数据返回/*函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)*/在调用此数据写入函

14、数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y) unsigned char i; bit ack_bit; /储存应答位 for(i = 0; i 8; i+) / 循环移入8个位 SDA = (bit)(y&0x80); /通过按位“与”运算将最高位数据送到S /因为传送时高位在前,低位在后 _nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /将SCL重新置为低电平,以在SC线形

15、成传送数据所需的个脉冲 y = 1; /将y中的各二进位向左移一位 SDA = 1; / 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电

16、平,表示没有接收到,传送异常 SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) return ack_bit; / 返回AT24Cxx应答位/*函数功能:向AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)*/void WriteSet(unsigned char add, unsigned char dat)/ 在指定地址addr处写入数据WriteCurrent start(); /开始数据传递 WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据 Writ

17、eCurrent(add); /写入指定地址 WriteCurrent(dat); /向当前地址(上面指定的地址)写入数据 stop(); /停止数据传递 delaynms(4); /1个字节的写入周期为1ms, 最好延时1ms以上/*函数功能:从AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent() unsigned char x; start(); /开始数据传递 WriteCurrent(OP_READ); /选择要操作的AT24Cxx芯片,并告知要读其数据 x=ReadData(); /将读取的数据存入x stop

18、(); /停止数据传递 return x; /返回读取的数据/*函数功能:从AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x */unsigned char ReadSet(unsigned char set_addr)/ 在指定地址读取 start(); /开始数据传递 WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据 WriteCurrent(set_addr); /写入指定地址 return(ReadCurrent(); /从指定地址读出数据并返回void delay() uchar i; for(i=0;i2

19、55;i+);/*写命令*/void lcd_wmc(uchar i) P0=i; RS=0; RW=0; E=0; delay(); E=1;/*写数据*/void lcd_wmd(uchar i) P0=i; RS=1; RW=0; E=0; delay(); E=1;/*初始化液晶*/void lcd_init() uchar i; lcd_wmc(0x01);/清屏幕指令,将以前的显示内容清除 lcd_wmc(0x38);/显示模式设置:162显示,57点阵,8位数据接口 lcd_wmc(0x0c); lcd_wmc(0x06);/显示模式设置:光标右移,字符不移 lcd_wmc(0x

20、c9); for(i=0;i7;i+) lcd_wmd(sheni); lcd_wmc(0xc0);/*更新缓冲区子程序*/void newbuf() uchar tmp2; WriteSet(0x33,s); WriteSet(0x34,m); WriteSet(0x35,h); WriteSet(0x36,y); WriteSet(0x37,mo); WriteSet(0x38,d); WriteSet(0x39,t); display_buffer10 = 2 ; display_buffer11 = 0 ; display_buffer12 = y/10;/+0x30 ; displa

21、y_buffer13 = y%10;/+0x30 ; display_buffer14 = _; display_buffer15 = mo/10;/+0x30 ; display_buffer16 = mo%10;/+0x30 ; display_buffer17 =_; display_buffer18 = d/10;/+0x30 ; display_buffer19 = d%10;/+0x30 ; display_buffer110 = ; display_buffer111 = ; tmp2=display_buffer12; tmp2=wordtmp2; display_buffer

22、12=tmp2; tmp2=display_buffer13; tmp2=wordtmp2; display_buffer13=tmp2; tmp2=display_buffer15; tmp2=wordtmp2; display_buffer15=tmp2; tmp2=display_buffer16; tmp2=wordtmp2; display_buffer16=tmp2; tmp2=display_buffer18; tmp2=wordtmp2; display_buffer18=tmp2; tmp2=display_buffer19; tmp2=wordtmp2; display_b

23、uffer19=tmp2; switch(t%16) case 1 : display_buffer112 = M ; display_buffer113 = o ; display_buffer114 = n ; break ; case 2 : display_buffer112 = T ; display_buffer113 = u ; display_buffer114 = e ; break ; case 3 : display_buffer112 = W ; display_buffer113 = e ; display_buffer114 = d ; break ; case 4

24、 : display_buffer112 = T ; display_buffer113 = h ; display_buffer114 = u ; break ; case 5 : display_buffer112 = F ; display_buffer113 = r ; display_buffer114 = i ; break ; case 6 : display_buffer112 = S ; display_buffer113 = a ; display_buffer114 = t ; break ; case 7 : display_buffer112 = S ; display_buffer113 = u ; display_buffer114 = n ; break ; default : break; dispbuf0=s%10; dispbuf1=s/10; dispbuf3=m%10; dispbuf4=m/10; dispbuf6=h%10; dispbuf7=h/10;/*显示子程序*/void disp1(uchar dispadd) uchar i=0; lcd_wmc(dispadd

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

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