资源描述
目录
第1章 Proteus软件简介 2
第2章 电子时钟相关介绍 2
2.1 电子时钟的总体简介 2
2.2 电子时钟功能要求 3
2.3 实现时钟计时的基本方法 3
2.4 电子时钟的时间显示及操作 4
第3章 系统硬件设计 4
3.1 AT89C52单片机 4
3.2 74LS245芯片 5
3.3 数码管显示工作原理 6
3.4 键盘电路设计 7
3.5 整个电路原理图 8
第4章 系统软件设计 9
4.1 程序设计 9
4.2 系统流程图 9
4.2.1 主程序流程图 9
4.2.2 加一子程序流程框图 10
4.3 电子时钟程序 11
第5章 系统仿真 17
5.1 仿真结果 17
5.2 仿真结果分析 20
第6章 结束语 20
参考文献 21
第1章 Proteus软件简介
PROTEUS软件由Labcenter公司开发,是目前世界上最先进、最完整的嵌入式系统设计与仿真平台,可以实现数字电路、模拟电路及微控制器系统与外设的混合电路系统的电路仿真、软件仿真、系统协同仿真和PCB设计等功能,是目前唯一能够对各种处理器进行实时仿真、调试与测试的EDA工具。微控制器系统相关的仿真需建立编译和调试环境,可选择Keil软件。该软件支持众多不同公司的芯片,集编辑、编译和程序仿真等于一体,同时还支持PLM、汇编和C语言的程序设计。它的界面友好易学,在调试程序、软件仿真方面有很强大的功能。 其革命性的功能是:将电路仿真和微处理器仿真进行协同,直接在基于原理图的虚拟原型上进行处理器编程调试,并进行功能验证,通过动态器件如电机、LED、LCD、开关等,实时看到运行后的输入、输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等, Proteus为我们建立了完备的电子设计开发环境。
第2章 电子时钟相关介绍
2.1 电子时钟的总体简介
1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。该电子时钟由89C52,74LS245芯片,BUTTON,八段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。电路中有4个控制键,A按键按下第一次表示进入运行状态,再按一下表示键入调整状态,依次类推;通过D按键实现秒钟的累加,每按一次秒钟加一,累加到60秒钟清零;通过C按键实现分钟的累加,每按一次分钟加一,累加到60分钟清零;通过B按键实现小时的累加 ,则可实现小时的调节,同样每按一次小时加一累加到24小时清零。
2.2 电子时钟功能要求
可调整运行的电子钟具有三种工作状态:“P.”状态、运行状态、调整状态。
(1)、“P.”状态,依靠上电或按复位键进入,在此状态下,按B、C、D键均无效,按A键有效,进入运行状态;
(2)、运行状态,按奇数次A键进入,在此状态下,按B、C、D键均无效,只有按A键有效,按下A键后,退出运行状态,进入调整状态;
(3)、调整状态,按偶数次A键进入,在此状态下,按A、B、C、D键均有效。如按下A键,则退出调整状态,进入运行状态;按下B、C、D键,则分别对时、分、秒加1,调整结束后必须按A键,即可退出调整状态,进入运行状态。
基本功能要求:
“P.”稳定地显示在LED显示器的最左端数码管(LED5)上,无A键按下(在“P.”状态下,按下B、C、D键无效),则不进入电子钟的运行状态,继续显示“P.”。
按下A 键后,电子钟以起始时间:00时00分00秒开始运行。
再次按下A 键后,电子钟退出运行状态,进入调整状态,利用B、C、D键把电子钟的显示时间修改为当前实时时间,时间修改正确后可再次按下A键,电子钟则退出调整状态,进入运行状态。
注意:每次按下B、C、D键,只允许加一,不允许连加。
2.3 实现时钟计时的基本方法
利用MCS-51系列单片机的可编程定时/计数器、中断系统来实现时钟计数。
(1) 计数初值计算:
把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。
假设使用T/C0,方式1,50ms定时,fosc=12MHz。
则初值X满足(216-X)×1/12MHz×12μs =50000μs
X=15536→0011110010110000→3CB0H
(2) 采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);
(3) 从秒到分和从分到时的计时是通过累加和数值比较实现。
2.4 电子时钟的时间显示及操作
利用AT89S52单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。
电子钟的时钟时间在六位数码管上进行显示,因此,在内部RAM中设置显示缓冲区共8个单元:
LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED1
37H 36H 35H 34H 33H 32H 31H 30H
时十位 时个位 分隔 分十位 分个位 分隔 秒十位 秒个位
电子钟设置4个按键通过程序控制来完成电子钟的启、停及时间调整:
A键控制电子钟的启、停;
B键调整小时;
C键调整分钟;
D键调整秒钟。
第3章 系统硬件设计
3.1 AT89C52单片机
单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的简称。它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。随着SCM在技术上、体系上不断扩展其控制功能,国际上已经采用MCU(MicroControllerUnit)代替单片机的名词。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出适配器简单,功能较低。目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。近年来,AT89C52在我国非常流行 。通过对多种单片机性能的分析,最终认为89C52是最理想的电子时钟开发芯片。89C52是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C52是一种高效微控制器,而且它与MCS-52兼容,且具有4K字节可编程闪烁存储器和1000写/擦循环,数据保留时间为10年等特点,是最好的选择[2] 。
图3.1 AT89C52
3.2 74LS245芯片
74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由 B向 A 传输;(接收)
DIR=“1”,信号由 A 向 B 传输;(发送)当/CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端/1G和/2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,/E端接地,保证数据现畅通。8051的/RD和/PSEN相与后接DIR,使得/RD或/PSEN有效时,74LS245输入(P0.i←Di),其它时间处于输出(P0.i→Di)。
图3.2 芯片 74LS245
3.3 数码管显示工作原理
数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共商。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即,所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在
一起,共同占用8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来[3]。
图3.3 8段共阳数码管
3.4 键盘电路设计
该设计用4个键盘,实现的功能是比较完善,减少了硬件资源的损耗,该键盘可以实现小时和分钟的调节。A按键按下第一次表示计时开始,再按一下表示暂停,再按下接着计时,依次类推;通过D按键实现秒钟的累加,每按一次秒钟加一,累加到60秒钟清零;通过C按键实现分钟的累加,每按一次分钟加一,累加到60分中钟小时进一;通过B按键实现小时的累加 ,则可实现小时的调节,同样每按一次小时加一累加到24小时清零。
图3.4 控制键
3.5 整个电路原理图
图3.5 系统电路原理图
第4章 系统软件设计
4.1 程序设计
程序设计是指设计、编制、调试程序的方法和过程,是目标明确的智力活动。在进行控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。故软件设计在电子时钟设计中占重要地位。
4.2 系统流程图
4.2.1 主程序流程图
图4.2.1主程序流程框图
4.2.2 加一子程序流程框图
图 4.2.2 加一子程序
4.2.3 “P.”点显示子程序流程框图
图4.2.3 “P.”点显示子程序流程框图
图3-2主程序流程框图
4.3 电子时钟程序
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0030H
MAIN: MOV SP, #60H ;确立堆栈区
MOV PSW, #00H ;
MOV R0, #20H ;RAM区首地址
MOV R7, #5FH ;RAM区单元个数
QL: MOV @R0, #00H ;RAM清零
INC R0
DJNZ R7, QL
MOV IP, #02H ;IP初始化,优先定时器0
MOV IE, #82H ;IE初始化,
MOV TMOD, #01H ;定时器0方式1工作
LCALL PP ;调P.子程序
NEXT: LCALL KEY ;按键检测子程序
JB ACC.0, RUNF ;A键按下运行
LCALL DISP ;调用显示子程序
SJMP NEXT
RUNF: LCALL OUTT ;调传送子程序
LCALL TIME ;开电子钟
JK: LCALL DISP ;调用显示子程序
LCALL KEY ;按键检测子程序
JZ JK
LCALL ANKEY
LCALL DISP ;调用显示子程序
SJMP JK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; P点显示 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PP: MOV 37H, #12 ;P点编码送寄存器
MOV R0, #30H ;P点编码送寄存器
MOV R7, #07H
PPP: MOV @R0, #10
INC R0
DJNZ R7, PPP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 键扫子程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY: LCALL KEYS ;调键值处理子程序
JZ EXIT ;没有键按下转到返回
LCALL DISP
LCALL DISP ;调显示去抖动
LCALL KEYS
JZ EXIT
MOV B, 20H ;保存键值
KEYSF: LCALL KEYS ;调键值处理子程序
JZ KEYY ;键释放,转到恢复键值
LCALL DISP ;调显示子程序延时
AJMP KEYSF ;等到键释放
KEYY: MOV A, B ;键值送20H单元保存
EXIT: RET ;返回
KEYS: MOV P1, #0FFH ;先向P1口写1
MOV A, P1 ;P1口值送累加器A
CPL A ;A值取反
ANL A, #0FH ;保存P1口的低4位
MOV 20H, A ;A值送20H保存
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 键功能子程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANKEY: CLR EA ;关中断
CHECK: JB TR0, YXZ ;判断是否运行
K0: CJNE A, #01H, K1
AJMP RUN ;转运行
K1: CJNE A, #02H, K2
AJMP KEY1 ;转时调整
K2: CJNE A, #04H, K3
AJMP KEY2 ;转分调整
K3: CJNE A, #08H, OUT
AJMP KEY3 ;转秒调整
YXZ: JB ACC.0, STOP
AJMP OUT
KEY1: MOV R0, #45H ;时调整
LCALL ADD1
CLR C
CJNE A, #24H, OUTT
ACALL CLR0
AJMP OUTT
KEY2: MOV R0, #43H ;分调整
LCALL ADD1
CLR C
CJNE A, #60H, OUTT
ACALL CLR0
AJMP OUTT
KEY3: MOV R0, #41H ;秒调整
ACALL ADD1
CLR C
CJNE A, #60H, OUTT
ACALL CLR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 传送显示数据 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTT: MOV 30H, 40H ;秒显示单元41H-42H
MOV 31H, 41H
MOV 32H, #11 ; "-"
MOV 33H, 42H ;分显示单元43H-44H
MOV 34H, 43H
MOV 35H, #11 ; "-"
MOV 36H, 44H ;时显示单元44-45H
MOV 37H, 45H
RET
STOP: CLR TR0 ;关电子钟并跳出
RET
RUN: LCALL TIME ;运行电子钟
OUT: SETB EA ;无键按下或完成功能跳出
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 运行电子钟 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME: SETB EA
MOV TL0, #0B0H
MOV TH0, #3CH ;3CB0H
MOV R4, #20 ;50ms,20次循环
SETB TR0 ;启动定时器0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 定时中断 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV TL0, #0B0H ;重新设定定时初值
MOV TH0, #3CH
SETB TR0 ;启动定时器0
DJNZ R4, OUTT0 ;1秒到
ADDSS: MOV R4, #14H ;20次计数
MOV R0, #41H ;秒十位
ACALL ADD1 ;加1程序
CLR C
CJNE A, #60H, ADDMM ;1分到
ADDMM: JC OUTT0
ACALL CLR0
MOV R0, #43H
ACALL ADD1 ;加1程序
CLR C
CJNE A, #60H, ADDHH ;1小时到
ADDHH: JC OUTT0
ACALL CLR0
MOV R0, #45H
ACALL ADD1 ;加1程序
CLR C
CJNE A, #24H, HOUR ;1天到
HOUR: JC OUTT0
ACALL CLR0
OUTT0: MOV 30H, 40H ;秒显示单元41H-42H
MOV 31H, 41H
MOV 32H, #11 ; "-"
MOV 33H, 42H ;分显示单元43H-44H
MOV 34H, 43H
MOV 35H, #11 ; "-"
MOV 36H, 44H ;时显示单元44-45H
MOV 37H, 45H
POP PSW
POP ACC
SETB ET0
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 时间清零子程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLR0: CLR A
MOV @R0, A
DEC R0
MOV @R0, A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;; 加一子程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD1: MOV A, @R0 ;取十位
DEC R0
SWAP A
ORL A, @R0 ;组合十位与个位
ADD A, #01H ;加1
DA A ;十进制调整
MOV R3, A ;暂存
ANL A, #0FH ;屏蔽十位
MOV @R0, A ;放入个位单元
MOV A, R3 ;取值
INC R0
SWAP A
ANL A, #0FH ;屏蔽个位
MOV @R0, A ;放入十位单元
MOV A, R3 ;数值放入A中等待判断
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;显示子程序 30H ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP: MOV R1, #30H ;显示缓冲存储单元首地址
MOV R2, #80H ;从右至左显示
DISP1: MOV P2, R2 ;送位控
MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A ;送段控
ACALL DL ;延时
MOV A, R2
JB ACC.0, DISP2
RR A
INC R1
MOV R2, A
AJMP DISP1
DISP2: RET
TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0CH
DL: MOV R6, #14H ;显示延时子程序
DL1: MOV R7, #19H ;
DL2: DJNZ R7, DL2
DJNZ R6, DL1
RET
END
第5章 系统仿真
5.1 仿真结果
所有准备工作做好后,点击进行仿真,则进入“P.”状态,在此状态下,按B、C键均无效。
见图5.1.1所示
图5.1.1 P.显示
按A键进入运行状态,计时开始进行。
见图5.1.2所示
图5.1.2 启动
在运行状态即计时状态下,按B、C、D键均无效,只有按A键有效。
见图5.1.3所示
图5.1.3 运行
按下偶数次A键后,退出运行状态,进入调整状态。每按一下D键,则对秒加1;每按一下C键,则对分加1;每按一下B键,则对小时加1。而后再按奇数次A键,进入运行状态。
如图5.1.4所示 举例:
分别对时、分、秒钟进行加1时间调整。
图5.1.4 调整时间举例
5.2 仿真结果分析
本设计功能太过单调,设计比较简单。电路图的设计过于单调,用的器件少了点,实现调节时间的按钮太少,不能很好的实现时间的调节。不过最后的仿真效果非常好,实现了预期的效果,能过通过B、C控制键和调节时间,是一个比较令人满意的设计。同时,单片机工作也会受到环境的影响,比如温度、湿度,以及其它电子设备的干扰。因此,应该让电子钟工作在适度温度、干燥和电子干扰较少的环境下,还有一种方法就是采用实时时钟芯片,这样可以使误差降低到最。另外,在调试运行过程中,在所有参数正确的情况下,我的结果仍出现运行缓慢情况。产生误差的主要原因是我们用软件计时,计时1秒是采用定时器的中断服务程序。当电子钟运行1秒,执行中断程序需要一定时间,这个时间就是所产生的误差,这个误差是不可避免的。
第6章 结束语
通过本次课程设计,我去认真再次学习了汇编语言的,以及熟练了PROTEUS和KEIL软件的运用。有时间还是会更多锻炼的。感觉这些软件都越来越顺手了,挺开心。发现自己真是不逼就不学的人。另外,我认识到本人对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储空间增大。损耗了过多的内存资源。
本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争,同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。
最后,在课程设计过程中,我们巩固和学习了我们的单片机知识。相信这对我以后的课程设计和毕业设计将会有很大的帮助!
参考文献
[1] 李泉溪.《单片机原理与应用实例仿真》.北京航空航天大学出版社 2009年
[2] 江世明.《基于proteus的单片机应用技术》.电子工业出版社 2008年
[3] 喻宗泉.《单片机原理与应用技术》.西安电子科技大学出版社 2005年
[4] 万光毅.《单片机实验与实践教程》.北京航空航天大学出版社 2004年
22
展开阅读全文