基于51单片机可调数字钟的设计Word格式文档下载.docx
《基于51单片机可调数字钟的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机可调数字钟的设计Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
只要通过设置特殊功能寄存器TMOD,即可完成。
定时/计数器何时工作也是通过TCON特殊功能寄存器来设置的。
在此设计中,选择16位定时工作方式。
对于T0来说,系统时钟为12MHz,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,必须通过软件来处理这个问题,假设取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。
对于这20次计数,就可以采用软件的方法来统计了。
设定TMOD=01H,设置定时/计数器0工作在方式1。
给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出:
N=t/Ty=(50×
10^-3)/(1×
10^-6)=50000
X=65536-50000=15536=3CB0H
即TH0=3CH,TL0=0B0H.
这样,当定时/计数器0计满50ms时,产生一个中断,我们可以在中断服务程序中,对中断次数加以统计,以实现数字钟的逻辑功能。
2.2数字钟的时间显示
显示器的时间显示采用动态扫描电路驱动形式,以达到简化电路的目的。
但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。
可采用74LS244或者晶体管;
其中74LS244是用来驱动段选码,晶体管是驱动位选码。
电子钟的时钟时间在六位数码管上进行显示,因此,在内部RAM中设置显示缓冲区共8个单元。
LED8
LED7
LED6
LED5
LED4
LED3
LED2
LED1
37H
36H
35H
34H
33H
32H
31H
30H
小时
分隔符
分钟
秒
3.系统的硬件设计
3.1单片机的功能介绍
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示。
图3.1单片机AT89C52引脚功能简化图
3.2时钟振荡电路
时钟振荡器即时钟脉冲发生器,产生整个芯片内部各功能电路正常操作所需的时钟脉冲和定时信号。
最常用的一种电路连接方法是,在XTAL1和XTAL2这2只引脚之间外接一只晶体振荡器XTAL和2只电容C1和C2到地(如图5-3所示),与片内电路共同构成一个多谐振荡器电路。
其振荡频率取决于外接石英晶体振荡器元件XTAL的固有频率,常选取12MHZ或6MHZ的晶振。
典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)特别注意:
对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;
当接低电平时,复位后直接从外部ROM的0000H开始执行。
图3.2时钟振荡电路图
3.3键盘控制电路
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.而靠软件编程来识别的称为非编码键盘;
在单片机组成的各种系统中,用的最多的是非编码键盘。
也有用到编码键盘的。
非编码键盘有分为:
独立键盘和行列式(又称为矩阵式)键盘。
下图5-6是非编码键盘式控制电路。
图3.3键盘控制电路
按键在闭合和断开时,触点会存在抖动现象为使CPU能正确地读出端口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:
硬件方法和软件方法。
单片机中常用软件法,软件法其实很简单,就是在单片机获得端口为低的信息后,不是立即认定按键已被按下,而是延时10毫秒或更长一些时间后再次检测端口,如果仍为低,说明按键的确按下了,这实际上是避开了按键按下时的抖动时间。
而在检测到按键释放后(端口为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。
不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求。
4.系统的软件设计
4.1系统软件设计流程图
这次的数字钟设计用到很多子程序,最好将它们分为若干个相对独立且相互联系的部分。
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
以下是数字钟工作的流程图。
开始
显示初始化,设置定时器,定时50毫秒,开断断。
器
根据计数值显示时间
到60秒?
S键按下?
M键按下?
H键按下?
到60分?
到24小时?
秒计数加1
小时计数加1
分计数加1
小时计数值清0
是
否
R键按下?
秒计数清零
分计数清零
图4.1数字钟工作流程图
4.2系统中断流程图
单片机一般允许有多个中断源,当几个中断源同时向CPU请求中断时,就存在CPU优先响应哪一个中断请求源的问题(优先级问题),一般根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求,于是便规定每一个中断源都有一个中断优先级别,并且CPU总是响应级别最高的中断请求。
当CPU正在处理一个中断源请求的时候,又发生了另一个优先级比它高的中断源请求,如果CPU能够暂时中止对原来中断处理程序的执行,转而去处理优先级更高的中断源请求,待处理完以后,再继续执行原来的低级中断处理程序,这样的过程称为中断嵌套。
以下图是定时器中断服务子程序流程图
显示初始化,设置定时器,定时50毫秒
所有计数值清0
图4.2定时器中断服务子程序流程图
4.3子程序说明
4.3.1按键扫描
按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;
如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;
如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;
如果没有按下,就检测复位键是否按下,复位健按键如果按下,时钟就复位。
如果没有按下,把时间显示出来。
4.3.2数码管动态扫描
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留特性,使人的感觉好像各位数码管同时都在显示。
5.数字钟元件清单和软件介绍
5.1数字钟元件清单
列元件清单的主要目的是为了更好地理论联系实际,为了硬件设计和仿真起到了不可磨灭的作用,做到心中有数。
以下是数字钟的元件清单
元件名称
规格型号
数量(个)
单片机
AT89C51
1
电阻
RES/10K,RES/220
5,8
晶振
11.0592MHz
电容
30pF/220uf
2,1
按键
BUTTON
4
排阻
RESPACK-8/10K
锁存器
74LS245
液晶显示
7SEG-MPX6-CC
二极管
1N4148
表5.1电子钟元器件清单
5.2软件调试
打开程序调试软件keiluVision3,在里面新建一个工程,接着新建文件,编写相应程序。
编写好的各个程序进行编译与连接。
但若是在该过程中,看见我们编好的程序有错误,那么根据他相应的提示来修改错误,直到该程序能够正确编译为止。
能够正常编译的程序说明没有什么问题了,此时我们在点击相关栏目,让它生成我们在硬件仿真时所需要的.HEX文件。
5.3硬件调试
打开Proteus仿真软件,按照方案所选的电路元件来设计整体电路,先把芯片按一定的位置放好,然后按相应的对象进行连接,连接时需仔细,以免调试时发生错误。
做好之后把编程所生成的。
HEX文件加载到AT89C52中,运行仿真软件,查看运行效果。
如果运行出错那么就根据他相应的提示来修改错误,直到仿真成功为止。
总结
通过本次仿真的设计,我遇到很多自己不理解的问题及书本上或是我以前没有看见过的知识点。
在面对这些问题时,我首先采用的是上网搜寻的方法,在根据别人的提示,想想自己的问题出在哪里,该怎么解决。
当我还是无法想到解决的办法时,我就带着自己的问题到图书馆查阅资料或找同学互相交流,如果我的问题还是没有解决,我就带着问题去问我们的指导老师,让他帮我解决。
采用这样的方法,我的很多问题都迎刃而解了!
其次,我不但努力解决自己遇到的问题,还帮助同学解决他们遇到的问题。
这样一来,我的知识得到了进一步的巩固,同学的问题也得到了相应的解决,我达到了一举双收的效果,我为此而感到高兴。
让我觉得仿真的最大成果是:
知道了将理论用到实际当中时,会遇到很多的问题。
需要我们一个一个地把它解决,根据自己所学的专业基础知识分析具体原因,具体问题具体分析,再逐一把它克服掉。
知道理论与实际的差距,所以以后要多加强实际动手的能力。
因此,学习就应该采取理论与实践相结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
最后,我相信以后不管遇到什么困难和挫折,不要畏惧,要敢于向前探索。
这样问题才能迎刃而解。
附录一系统程序源代码
S_SETBITP1.0;
数字钟秒控制位
M_SETBITP1.1;
分钟控制位
H_SETBITP1.2;
小时控制位
RESETBITP1.3;
复位键
SECONDEQU30H
MINUTEEQU31H
HOUREQU32H
TCNTEQU34H
ORG0000H
SJMPSTART
ORG0BH
LJMPINT_T0;
定时器0溢出中断矢量
START:
MOVDPTR,#TABLE
MOVHOUR,#0;
初始化
MOVMINUTE,#0
MOVSECOND,#0
MOVTCNT,#0;
计数值赋0
MOVTMOD,#01H;
定时器/计数器工作在方式1
MOVTH0,#3CH;
定时50毫秒
MOVTL0,#0B0H
MOVIE,#82H;
EA中断总允许位置1
SETBTR0;
允许T0累加计数。
;
判断是否有控制键按下,是哪一个键按下
A1:
LCALLDISPLAY
MOVP1,#0FFH;
把P1脚置成高电平
JNBS_SET,S1
JNBM_SET,S2
JNBH_SET,S3
JNBRESET,S4
LJMPA1;
如果没有键按下重新检测
S1:
LCALLDELAY;
有S_SET键按下去抖动
JBS_SET,A1;
确实有键按下进入下面处理,否则为干扰重新检测
INCSECOND;
秒值加1
MOVA,SECOND
CJNEA,#60,J0;
判断是否加到60秒
MOVSECOND,#0
LJMPJ0;
等待按键弹起来,按一次,只加一次
S2:
有M_SET键按下去抖动
JBM_SET,A1
INCMINUTE;
分钟值加1
MOVA,MINUTE
CJNEA,#60,J1;
判断是否加到60分
MOVMINUTE,#0
LJMPJ1
S3:
有H_SET键按下去抖动
JBH_SET,A1
INCHOUR;
小时值加1
LCALLDISPLAY
MOVA,HOUR
CJNEA,#24,J2;
判断是否加到24小时
MOVHOUR,#0
LJMPJ2
S4:
有RESET键按下去抖动
JBRESET,A1
LJMPSTART
J0:
JBS_SET,A1
SJMPJ0
J1:
JBM_SET,A1
SJMPJ1
J2:
JBH_SET,A1
SJMPJ2
定时器中断服务程序(每50ms中断一次),对秒,分钟和小时的计数
INT_T0:
MOVTH0,#3CH
MOVTL0,#0B0H
INCTCNT
MOVA,TCNT
CJNEA,#20,RETUNE;
计时1秒
INCSECOND
MOVTCNT,#0
MOVA,SECOND
CJNEA,#60,RETUNE
INCMINUTE
MOVSECOND,#0
MOVA,MINUTE
CJNEA,#60,RETUNE
INCHOUR
MOVA,HOUR
CJNEA,#24,RETUNE
MOVHOUR,#0
RETUNE:
RETI
显示控制子程序
DISPLAY:
MOVA,SECOND;
显示秒
MOVB,#10
DIVAB;
商和余数分别保留在A和B
CLRP3.6
MOVCA,@A+DPTR;
把A+DPTR指定单元内容复制到A
MOVP0,A;
将A中查得结果送P0端口显示
LCALLDELAY
SETBP3.6
MOVA,B
CLRP3.7
MOVP0,A
LCALLDELAY
SETBP3.7
CLRP3.5
MOVP0,#40H;
显示分隔符
SETBP3.5
MOVA,MINUTE;
显示分钟
DIVAB
CLRP3.3
MOVCA,@A+DPTR
SETBP3.3
CLRP3.4
MOVCA,@A+DPTR
SETBP3.4
CLRP3.2
SETBP3.2
MOVA,HOUR;
显示小时
CLRP3.0
SETBP3.0
CLRP3.1
SETBP3.1
RET
TABLE:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
DELAY:
MOVR6,#5;
5ms延时子程序
D1:
MOVR7,#250;
1ms
D0:
NOP
DJNZR7,D0
DJNZR6,D1
END
附录二系统电路图