倒计时秒表3

课 程 设 计 说 明 书

课程名称:      《单片机技术》      

设计题目:    倒计时数字秒表设计   

院    系:  电子信息与电气工程学院 

学生姓名:                   

学    号:             

专业班级:         

指导教师:                 

20##年 5月 18 日


课 程 设 计 任 务 书

倒计时秒表

摘  要:本次课程设计以AT89S52单片机为核心设计一个倒计时数字秒表,计数初值为59并开始每秒自动减1,当按键1按下时记录当前时间值,当按键2按下时显示当前记录值,显示过之后再次按下按键1时秒表复位为59。本设计硬件部分包括电源电路、复位电路、按键电路、振荡电路、数码管显示电路五部分电路,软件程序部分有定时中断程序、外部中断程序、显示子程序和延时子程序等。软件Proteus画出原理图并进行仿真,依照仿真成功的原理图接线,在万能版上把个个器件焊接好从而实现预期的功能。

关键词:倒计时  AT89S52   74LS47   数码管

   

1.设计背景…………………………………………………………5

1.1、设计课题的提出…………………………………………5

1.2、设计作用及意义…………………………………………5

2.设计方案…………………………………………………………6

2.1、可行方案选择……………………………………………6

2.2、可行方案比较……………………………………………6

3.方案实施…………………………………………………………7

   3.1、硬件电路的实施…………………………………………7

   3.2、软件程序的实施…………………………………………11

4.结果与结论………………………………………………………13

   4.1、Proteus仿真运行结果…………………………………13

   4.2、结论………………………………………………………14

5.收获与致谢………………………………………………………14

6.参考文献…………………………………………………………14

7.附件………………………………………………………………15

   7.1、附件一(整体电路图)…………………………………15

   7.1、附件二(元件清单图)…………………………………16

   7.1、附件三(程序)…………………………………………17

   7.1、附件四(运行实物图)…………………………………22

1. 设计背景

1.1设计课题的提出

计时器日常生活中随处可见,我们手上的电子表,手机上的时间显示等,这些利用数字电路实现的装置,与机械时钟相比具有更高的准确性与直观性,且无机械装置,具有更长的使用寿命。其中重要的组成部分就是计数器模块,是单片机中常见的模块,以计时器为基础还可以设计更多对日常生活密切相关的设备,诸如定时报警、按时自动打铃、时间程序自动控制、定时广播、自动启闭路灯、定时开关烘箱、甚至各种定时电器的自动启用等,都是以计时器为基础的。

为了更好的学习定时器模块,掌握基本计数器程序的设计,实现一个功能的基本流程,提高动手能力,更好的掌握所学的知识,我们在本次课程设计中提出了实现倒计时秒表的课题。

1.2设计作用及意义

通过查阅资料、接口设计、程序设计、安装调试等环节,完成MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。让我不仅能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,增进对单片机的感性认识,加深对单片机理论方面的理解,掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等。了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。提高学生在单片机应用方面的实践技能和科学作风;培育学生综合运用理论知识解决问题的能力,实现理论结合实际,学以至用的原则。

用所学的知识和自身课外的拓展学习加深对专业课的理解和学习;锻炼综合运用电路设计及相关电子仪器、单片机软硬件结合的理论,结合生产实际分析和解决工作工程实际问题的能力,加固、加深和扩展有关电子类,汇编语言,相关电子电路和仿真软件方面的知识和能力。通过本次课程设计,应加强培养如下能力:

(1)加强自身独立的动手能力和思考解决问题的能力,提高创造能力;

(2)学会使用软件Proteus画原理图和仿真调试。

2.设计方案

2.1可行方案选择

以AT89S52单片机为核心元件,利用两位7 段共阳极数码管作为显示器件。在此设计中共接入2个两位一体7段共阳LED 数码管,来显示实时数字,其中1个用于显示十位,1个用于显示个位,通过查表指令分别动态显示个位和十位。2个LED数码管显示范围可达到O--99 。上电时,显示59并开始自动每秒自动减1,当按键1按下时记录当前时间值,当按键2按下时显示当前记录值,显示过之后再次按下按键1时秒表复位为59。

方案一利用查询端口实现记录

通过不断的查询P2.4和P2.5的电平来判断是否记录当前时间值,当P2.4按下时记录当前时间但并不显示,当P2.5按下时则显示记录下的时间,当P2.5再次按下时则复位为59,等待下次计时。用延时程序来实现1秒的延时,通过数据区来记录记录值,通过显示子程序来显示倒计时和记录值。

方案二 利用中断实现记录

本方案在方案一的硬件基础上采用74LS47译码器硬件译码来方便实现显示,同时利用单片机的外部中断0和外部中断1来实现记录和显示,把记录处理和显示处理做成分别做成外部中断0和外部中断1的中断服务程序,通过中断服务程序处理不同的动作。利用T0做一个1秒的中断,从而实现倒计时。另外通过数据区来记录记录值。通过显示子程序来显示当前倒计时和记录值。

2.2方案的选取

如果使用方案一需要不停的查询端口的电平,单片机还要不停的去执行显示程序,另外还要执行延时程序,单片机在同一个时刻只能做一件事情,所以会对记录造成较大的误差,所以方案一误差较大

如果使用方案二,因为方案二是利用外部中断,所以不必不停查询端口电平,当按键按下时,即使程序处于显示程序中也可以立即中断去执行按键按下所需要的处理动作,由于定时1秒是采用定时器来实现,单片机可以边执行程序边实现定时,所以可以实现较精确的计时,另外外部中断均处于高级中断,可以较准确的记录记录值。

综上比较,本设计采用方案二作为此次课程设计的首选方案。

3. 方案实施

3.1硬件电路的实施

(1)整体设计框图

本硬件设计总共包括五部分电路:显示电路、振荡电路、复位电路、电源电路、按键电路。总体设计框图如图3.1所示。

图3.1  整体框图

(2)电源电路

   本设计采用整流桥墩2W10进行整流,然后用电解电容进行滤波,用7805进行稳压,最后输出+5V稳压直流电源。其中C1、C4为1000PF的电解电容,C2、C3为104瓷片电容,R1为1K的电阻。其电路图如3.2所示。

图3.2  电源电路

(3)振荡电路

本模块用了一个11.0592HZ的晶振外加两个33pf的电容,电路图用如图3.3所示。

图3.3  振荡电路

(4)复位电路

复位电路图如图3.4所示,其中C3是带极性的电解电容,R1、R2是阻值为1K的电阻

图3.4  复位电路

(5)显示电路

本设计的显示电路采用动态显示,动态显示,是指无论任何时刻只有一个LED数码管处于显示状态。若要各个数码管能同时显示出与本位相应的显示字符,就必须采用动态的“扫描显示方式”。即在某一时刻,只让某一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,同时,段码线上输出相应位要有显示的字符的段码,这样,在同一时刻,2位数码管中只有被选通的那一位显示出字符。如此循环下去就可以显示出要显示的字符。虽然这些字符是不同时刻显示的,但由于LED数码管的余辉和人眼的“视觉暂留”作用,只要每位显示间隔足够短,则可以造成“多位同时亮的假象”,达到同时显示的效果。动态显示的优点是硬件电路简单,显示器越多,优势越明显。

本次设计的显示电路有三部分组成:译码电路、驱动电路、LED数码管显示电路。

其中译码电路用的是芯片74LS47,74LS47是BCD-7段数码管驱动器,它的功能用于将BCD码转化成数码块中的数字,通过它解码, 可以直接把数字转换为数码管的显示数字, 从而简化了程序,节约了单片机的I/O开销。

74LS47译码器原理: 译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路成为译码器。译码器输出与输入代码有唯一的对应关系。74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用,其部分真值表如表3.1.1所示。

表 3.11

分析表格3.1.1易知74LS47为4-7译码器,并且是等数译码。即当输入为0000即0时,数码管显示也为0,一次类推,当输入为1001即9时,数码管显示也为9。驱动电路很简单,就是用两个9013即NPN型三极管去驱动共阳极数码管。显示电路的第三部分数码管显示电路,本次设计用的是两位共阳极数码管。显示电路模块用如图3.2所示。

图3.5  显示电路

(6)按键电路

   本实验要求开关BUTTON1和BUTTON2按下时触发两个对应的中断,所以两个按键接到外部中断0和外部中断1管脚上。其Proteus仿真电路图如图3.6所示。

图3.6  按键电路

3.2软件程序实施

本程序采用定时器T0产生1秒定时来实现秒表的倒计时,采用外部中断0来记录不同的记录值,通过外部中断1来显示已经记录的记录值。在主程序中初始化各个数值并且仅仅循环执行显示程序,有中断来时才转去做相应的中断服务程序。

(1)主程序流程图

 

(2)外部中断0流程图

(3)定时器TI流程图

 

(4)T0定时器1秒中断

(5)显示流程图

 

4. 结果与结论

4.1 Proteus仿真运行结果

我们设计好系统后,首先在proteus上进行了仿真,仿真结果可以正常运行,当上电时秒表从59开始倒计时,每当按下 BUTTON1时,系统会记录当前时间值,按下BUTTON2时系统会显示原来记录的时间值。再次按下BUTTON1时系统会复位59等待下次倒计时,并且如果没有记录值,按下BUTTON2并不起作用。

硬件结果经过半天的焊接,我们把硬件焊好后上电结果表明,我们的设计要求都达到了,硬件结果和proteus仿真结果完全一样。各项功能完整可用。仿真图如附件所示。

4.2结论

通过软件仿真和硬件运行,我们的系统完全的达到了设计要求。

5. 收获与致谢

通过本次的课程设计,我认识和了解了基本的单片机设计的开发过程。期间,我学会了分析课题的要求,查阅资料用怎样的元器件来实现,学会用Protues软件来绘制原理图,用汇编来编写源程序,最终仿真成功。在用实际器件实现系统时,还学会了怎样合理布局元器件,学会2位数码管各个管脚的分布和接法,熟识了硬件驱动数码管动态显示的基本原理和程序编写,提高了将单个电子器件组合到一起构成所需电路系统的能力。

在课程设计期间也遇到很多问题,在使用74LS47的连线时忘记给译码器加电源,在仿真时,程序编写有语法错误,在焊接时电阻弄错,阻值过大结果数码管很暗,引脚焊接出错。焊接完成通电调试时,按键不灵,经丁老师指导,在程序中添加去抖程序。除此之外,组员之间相互配合,在整个过程中有过争论,有过互助,最终圆满完成任务。在设计过程中,要是遇到问题,一定要有耐心,有错误就耐心查找,程序或实物系统出错就慢慢调试,要有永不服输的精神。

在此要特别感谢学校老师们为我们安排这次课程设计,为我们精心挑选课题,在万忙之中抽出时间指导我们,对于我们的问题,老师耐心的解答,一遍不行,再讲一遍。还不辞劳苦的给我们买需要的任何元器件。这次课程设计收获很多,为以后毕业设计打下基础,培养我们实际的动手能力,对以后的学习、工作中一定会有很大的帮助。

再次感谢所有老师。

6. 参考文献

[1]李广弟.单片机基础[M] 北京:航空航天大学出版社  20##年1月

[2]迟荣强 .单片机原理及接口技术[M] 北京:高等教育出版社 20##年9月

[3]张毅刚.单片机原理及应用[M]  北京:高等教育出版社  20##年5月

[4]阎胜利.Protel DXP2004电路设计[M] 北京:电子工业出版社 20##年7月

7. 附件

7.1整体电路图

图7.1  整体电路图

7.2元器件清单

表7.1  元器件清单

7.3源程序

;**************************************************************************

;功能:

;外部中断0用于记录不同的秒表数值

;外部中断1用于显示不同的记录数值

;外部中断0用于复位

;如果没有记录秒表数值,则外部中断1不起作用

;可以判断是否显示到最后一个数,显示的是最后一个记录值则保持显示而不再改变

;*************************************************************************

;变量分配

DATA1 EQU 40H                                ;DATA1用于储存显示的值

DATA2 EQU 42H                                 ;DATA2用于储存记录的时间的个数

TCNT EQU 41H                                 ;TCNT用于判断定时是否到1秒

MOD1 BIT 00H                                 ;MOD1用于记录计数值是否到0

MOD2 BIT 01H                                 ;MOD2用于指示初始化成59标志

MOD3 BIT 02H                                 ;MOD3用于记录外部中断1

MOD4 BIT 03H                                 ;MOD4用于记录是否储存了记录值

;主程序

          ORG 0000H                          ;开始

          LJMP START                         ;

          ORG 0003H                          ;

          LJMP INT_0                         ;

          ORG 000BH                          ;

          LJMP INT_T0                        ;

          ORG 0013H

          LJMP INT_1

          ORG 001BH

          LJMP INT_T1

          ORG 0050H

  START:  MOV SP,#70H                        ;设置堆栈

          CLR MOD1                           ;初始化标志位

          CLR MOD2                           ;

          CLR MOD3                           ;

          CLR MOD4                           ;

          MOV TCNT,#0        ;定时器初始化,16位定时方式 定时50MS,总定时1S

          MOV TMOD,#11H                      ;

          MOV TH0,3CH                        ;

          MOV TL0,#0B0H                      ;

          CLR P2.4                           ;

          CLR P2.5                           ;

          SETB PX1           ;中断设置   外部中断1和0为高级中断,跳沿触发

          SETB EX1                           ;定时器T0为低级中断

          SETB PX1                           ;

          SETB PT1                           ;定时器1设置为高级中断

          SETB ET1                           ;开定时器1

          MOV TH1,#0FFH                      ;赋初值

          MOV TL1,#0FFH                      ;

          SETB IT1                           ;

          SETB PX0                           ;

          SETB IT0                           ;

          SETB ET0                           ;

          SETB EX0                           ;

          SETB EA                            ;

          SETB TR0                           ;

          MOV R1,#50H                        ;初始化R1为50H

          MOV DATA1,#59D                     ;初值是十进制59

  LOOP1:  LCALL DISPLAY                      ;循环显示

          SJMP LOOP1                         ;

定时器T0中断

  INT_T0: MOV TH0,#3CH                       ;

          MOV TL0,#0B0H                      ;

          INC TCNT                           ;

          MOV A,TCNT                         ;

          CJNE A,#20,RETURN                  ;

          MOV TCNT,#0                        ;

          JB MOD1,RETURN                     ;到0秒直接返回不再减1

          DEC DATA1                          ;减1

          MOV A,#0                           ;判断DATA1是否到0

          CJNE A,DATA1,RETURN                ;不到0直接返回

          SETB MOD1                          ;到0则置位MOD1标志位

  RETURN: RETI                               ;

外部中断0

   INT_0: CLR EX0                           ;关外部中断0

          SETB TR1                          ;启动定时器T1

      H5: JNB MOD2,H0                       ;如果不是初始化59则判断是否到0

          MOV TH0,#3CH                      ;是初始化59则初始化T0

          MOV TL0,#0B0H                     ;

          SETB TR0                          ;

          CLR MOD2                          ;清除初始化59标志

          SJMP RETURN4                      ;

    H0:   JNB MOD1,H1                  ;如果不到0则判断上次是否是储存值显示

    H3:   MOV DATA1,#59D                    ;是到0则初始化59

          MOV R1,#50H                       ;数据指针初始化为50

          SETB MOD2                         ;初始化59标志

          CLR MOD1                         ;清除其它标志位

          CLR MOD3                         ;

          CLR MOD4                         ;

          CLR TR0                          ;

          SJMP RETURN4                     ;返回

   H1:    JNB MOD3,H2                      ;上次不是储存值显示则储存当前值

          SJMP H3                          ;上次是储存值显示则初始化59

    H2:   MOV @R1,DATA1                    ;当前值存入记录值数据区

          SETB MOD4                        ;

          INC R1                           ;指针加1

          MOV DATA2,R1                     ;储存记录数值个数

RETURN4:  RETI                             ;返回

T1中断

INT_T1:   CLR TR1                           ;关闭定时器

          MOV TH1,#0FFH                     ;重赋值

          MOV TL1,#0FFH                     ;

          CLR IE0                           ;清除中断请求标志位

          CLR IE1                           ;

          SETB EX0                          ;开中断0

          SETB EX1                          ;开中断1

          RETURN9:RETI                      ;返回

外部中断1

   INT_1: CLR EX1                           ;关闭外部中断1

          SETB TR1                          ;启动定时器T1

    X10:  JNB MOD4,RETURN6                  ;没有储存则直接返回

          JB MOD3,X7      ;如果上次也是外部中断1则直接显示下一个,上次不是外部中断1则从第一个显示 

    X8:   SETB MOD3                         ;并置位外部中断标志MOD3

          MOV R1,#4FH                       ;

    X7:   CLR TR0                           ;关定时器

          INC R1                            ;

          MOV A,R1                          ;判断是否到最后一个数

          CJNE A,DATA2,X9                   ;不到则返回显示

          DEC R1      ;到最后一个则R1减1,一直显示最后一个数值直到复位成59

          SJMP RETURN6                       ;返回

   X9:    MOV DATA1,@R1                      ;

          CLR IE1                            ;

  RETURN6:RETI                               ;

显示子程序

  DISPLAY:MOV A,DATA1                        ;

          MOV B,#10D                         ;取十位

          DIV AB                             ;

          MOV P2,A                           ;

          CJNE A,#0,D_PLAY1                  ;如果十位为0则不显示

          SJMP SKIP1                         ;

 D_PLAY1: SETB P2.4                          ;十位不为0则显示

          CLR P2.5                           ;

  SKIP1:  LCALL DELAY                        ;

          CLR P2.4                           ;

          MOV A,B                            ;取个位

          MOV P2,A                           ;

          SETB P2.5                          ;

          CLR P2.4                           ;

          LCALL DELAY                        ;

          CLR P2.5                           ;

          RET                                ;

延时程序

    DELAY:MOV R6,#5                          ;

    DE:   MOV R7,#250                        ;

          DJNZ R7,$                          ;

          DJNZ R6,DE                         ;

          RET                                ;

          END                                  ;结束

7.4运行实物图

图7.4  运行实物图

相关推荐