基于单片机AT89S51控制的数字时钟课程设计报告

时间:2024.3.31

宁波技师学院

论文题目     基于AT89S51控制的数字时钟   

专业班级                        

学生姓名                      ___

学    号                  ___

指导教师    _____________           _

宁波技师学院电气技术系

二零一三 年  九 月

摘  要

本系统采用MSC-51系列单片机以AT89S51为中心器件来设计多功能数字时钟。文中详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理。该时钟系统能实现时钟日历的功能:能进行时、分、秒的显示;也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现秒表,整点报时等功能

关键词:AT89S51;74LS245 ;原理;时钟 ;单片机


目录

1     引言.................................................................................................................................... 4

2     总体设计方案..................................................................................................................... 5

2.1   系统总体结构框图.......................................................................................................... 5

3     硬件设计............................................................................................................................. 6

3.1   复位电路........................................................................................................................ 6

3.2   晶振电路........................................................................................................................ 6

3.3 数码管原理图.................................................................................................................. 7

3.3.1     AT89S51的管脚说明.......................................................................................... 8

4     软件设计............................................................................................................................. 9

4.1   主程序流程图................................................................................................................. 9

5     制作和调试中遇到的问题和解决方法............................................................................. 9

6     结论................................................................................................................................... 10

7     致谢................................................................................................................................... 10

8     参考文献........................................................................................................................... 10

附录1          C语言程序............................................................................................................ 11

附录2          硬件接线图......................................................................................................... 24

附录3          系统仿真图......................................................................................................... 25


1    引言

近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新.在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善.

本文通过用对一个能实现定时,日历显示功能的时间系统的设计学习,详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。

2    总体设计方案

系统AT89S51、LED数码管、按键、电容,电阻,晶震等部分构成,能实现的功能有:时间显示、日期显示、定时。

左键:切换更改项目,按一下选择更改时钟秒位,再按为分位、小时位。小时位置在按则跳出编辑时间功能。

中键:给当前项进行加1的控制,使当前项在个位加1。

右键:给当前项进行减1的控制,使当前项在个位减1。

2.1    系统总体结构框图

针对于设计思想,做系统的结构框图如下图2-1所示:

图2-1总体方案方框图

3    硬件设计

本数字时钟系统的硬件电路主要包括晶振电路、数码显示电路及其它外围电路等。

3.1复位电路【2】[9]

复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。下图所示的RC复位电路可以实现上述基本功能,Sm为手动复位开关。

图3-0 复位电路图

3.2晶振电路[1]

AT89S51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是放大器的输入端和输出端,这个放大器与作为反馈元件的石英晶体构成自激震荡电路。外接石英晶体及电容C1,C2接在放大器的反馈回路中构成并联震荡电路。

图3-1晶体震荡电路

3.3数码管原理图[4][8][10]

图3-2 数码管管脚图

3.3.1  AT89S51的管脚说明[2]

图3-3 AT89S51管脚图

VCC 电源电压.
GND 接地.
RST 复位输入.当RST变为高电平并保持2个机器周期时,将使单片机复位.WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能.DISKRTO位缺省为RESET输出高电平打开状态.

XTAL1 反向振荡放大器的输入及内部时钟工作电路的输入.
XTAL2 来自反向振荡放大器的输出.
P0口 一组8位漏极开路型双向I/O口.也即地址/数据总线复用口.作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写"1"可作为高阻抗输入端用.在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻.在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻.

P1口 一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).Flash编程和程序校验期间,P1接收低8位地址.

P2口 一个带内部上拉电阻的8位双向I/O口.P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据.在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变.Flash编程和程序校验期间,P2亦接收低8位地址.

P3口 一个带内部上拉电阻的8位双向I/O口.P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对P3口写"1"时,它们被内部的上拉电阻把拉到高电并可作输入端口.作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流(IIL).P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下图所示.P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号.
PSEN/ 程序储存允许输出是外部程序存储器的读先通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲.当访问外部数据存储器,没有两次有效的PSEN/信号.

EA/VPP 外部访问允许.欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态.Flash存储器编程时,该引脚加上+12V的编程电压VPP.

4    软件设计

4.1    主程序流程图

 


5    制作和调试中的一些问题和解决办法

数字时钟设计刚完成时,我经过检查,发现了一些问题[1][4][7]:

1. 刚弄好电路板并烧写程序进去后发现数码管不能正确显示时间,每个数码管中显示的数字几乎一样。经过询问老师,自己查阅资料,终于找出问题的原因:由于我在电路中采用的是动态数码管显示,需准确地调整延时子程序DEL1MS。我在程序中采取的延时时间为1毫秒。

2.复位电路中的开关不能使电路复位到初始状态即12:00:00,经过认真检查电路后我发现我是开关的管脚没接对。测试后重新接下开关的管脚就可以了。

6    结论

经过调试之后,我发现我做的基于AT89S51设计的数字时钟,经过调试,一天的时间里面,差不多在1秒,计时是相对准确。而且该设计的成本不高,硬件电路简单,可以用在对时间精度要求不高的场合. 由于时钟电路的重要性,时钟电路在很多应用系统中必不可少,用软件方法可以实现,但误差很大。在对时间精度要求很高的情况下,通常采用时钟芯片来实现。典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足精度要求。

致谢辞

在论文完成之际,谨向关心我、支持我的师长、朋友和亲人表示最衷心的感谢。首先要感谢我尊敬的指导老师陈弢和唐幼君,本论文的工作得到了陈老师悉心的指导和启发,从论文的选题和具体实现都给予极大的帮助。唐老师平易近人,我非常感两位老师。

本设计的完成,当然也少不了同学的帮助,感谢他们对我的帮助,没有他们的帮助,设计的任务是不可能这么快顺利完成的。同时,也要感谢我的爸爸妈妈,感谢他们这么多年来默默地支持着我的学业,我会再接再厉,以更加饱满的热情投入到今后的学习和工作中去。

参考文献:

 [1] 曹巧媛 单片机原理与应用[M].京:电子工业出版社, 2002

[2] 何立民 MCS-51系列单片机应用系统设计.北京航空航天大学出版社,2000

[3] 丁元杰 单片微机原理及应用第2版[M].北京机械工业出版社,2001

[4] 郁凯平 MCS-51单片机串口一口两用在LED显示屏的一例应用 《电子与电脑》20##年第1期

[5] 陈忠平 P89LPC935驱动数码管显示时钟的设计 《湖南工业职业技术学院学报》2007 年第 02 期

[6] 林成武等 MCS-51单片机PO口扩展技术研究.《电子元器件应用》2007 年第 4 期

[7] 谢自美 《电子线路设计、实验、测试 》.华中理工大学出版社,2000

[8] 李正浩等 51单片机在LED数码管显示中的应用.《实验科学与技术》 20## 年第z1 期

[9] 包国宾、张建民 单片机复位电路的设计与分析.《光电技术应用》 20## 年第 03 期

[10] 唐光明 基于中断技术的开关软件消抖算法《现代机械》 20## 年第 03 期

[11]  N. Ambramson, Editor, Multiple Acess Communication-Foundation of Emerging Tecnologies, IEEE Press,1992


附录1   C语言程序

附录

ORG 0000H

LJMP MAIN           ;跳到主程序

ORG 0003H

LJMP INT0           ;跳到外部中断0

ORG 000BH          

LJMP T0             ;跳到定时器0

ORG 0013H

LJMP INT1           ;跳到外部中断1

ORG 001BH

LJMP T1             ;跳到定时器1

ORG 0100H

MAIN:                ;主函数

CLR P3.0             ;关蜂鸣器

ACALL INITIAL       ;调用初始化函数

DONE:

JNB 00H,DONE1       ;是否显示时间

MOV R0,#73H         ;显示时间

ACALL CONVERT     ;把时间存储器转化到显示存储器

AJMP TEST             ;是否处于调整状态

DONE1:

JNB 01H,DONE2      ;是否显示日期

MOV R0,#70H           ;显示日期

ACALL CONVERT       ;转化

AJMP TEST               ;是否处于调整状态

DONE2:

JNB 02H,DONE3      ;是否显示定时时间

MOV R0,#63H              ;显示定时时间

ACALL CONVERT            ;转化

AJMP TEST                ;

DONE3:

MOV R0,#60H        ;显示秒表

ACALL CONVERT            ;转化

LJMP DISP                ;跳到显示函数

TEST:                    ;判断是否处于调整状态

    JNB 18H,TEST10         ;是否按键已经按下

    JNB P3.5,TEST7          ;按键是否已经释放

    AJMP TEST11

TEST10:

JB 16H,TEST8          ;判断是否有按键按下

    JB P3.5,TEST7

    SETB 16H

    AJMP TEST7

TEST8:

JB P3.5,TEST9

          SETB 18H

          AJMP TEST7

   TEST11:CLR 18H

          CPL 17H

          MOV C,17H

          MOV P0.0,C

          CLR 16H

          CLR 12H                        ;定时结束

          CLR TR1                        ;关定时器1

          CLR P3.0                       ;关蜂鸣器

          CLR 13H                        ;

          MOV 59H,#00H                   ;

          MOV 58H,#01H 

          AJMP TEST7

    TEST9:CLR 16H

    TEST7:JNB 12H,TEST6

         JB P3.4,TEST6

         CLR 12H                        ;定时结束

         CLR TR1                        ;关定时器1

         CLR P3.0                       ;关蜂鸣器

         CLR 13H                        ;

         MOV 59H,#00H                   ;

         MOV 58H,#01H                   ;

TEST6:JNB 01H,TEST5          ;是否处于日期状态

          JB P3.4,TEST4          ;案键3是否按下

          MOV 20H,#01H            ; 返回时间状态

          MOV 21H,#00H

          LJMP DISP

   TEST5:JNB 02H,TEST4     ;是否处于定时时间状态

         JB P3.4,TEST4           ;按键3是否按下

         MOV 20H,#01H             ;返回时间状态

         MOV 21H,#00H

          LJMP DISP

   TEST4:JNB 15H,DO            ;闪烁标志是否有效

         LJMP DISP             ;无效则进入显示函数

DO:

      MOV A,21H            ;

      CJNE A,#00H,TEST2        ;是否在调整状态

      LJMP DISP              ;不处于调整状态则进入显示函数

 TEST2: JB P3.4,TEST3

      MOV 20H,#01H

      MOV 21H,#00H

      LJMP DISP

     TEST3:JNB 08H,DONE4   ;是否秒位置处于调整状态

      MOV 78H,#11          ;不显示

      MOV 79H,#11           ;不显示

      LJMP DISP             ;进入显示函数

 DONE4:JNB 09H,DONE5   ;是否分位置处于调整状态

        MOV 7BH,#11         ;不显示

        MOV 7CH,#11         ;不显示

        LJMP DISP            ;进入显示函数

 DONE5:MOV 7EH,#11      ;时位置不显示

         MOV 7FH,#11         ;时位置不显示

         LJMP DISP           ;进入主函数

CONVERT:                      ;转化成数码管显示所对应的存储器

MOV A,@R0              ;把R0存储的地址所对应的存储器的内容转化到秒位置的存储器

MOV B,#10                     ;

DIV  AB                        ;

MOV 79H,A                     ;高位存储?

MOV 78H,B                     ;地位存储

INC R0                        ;地址加一

MOV A,@R0                      ;取数据

MOV B,#10                      ;

DIV AB                         ;

MOV 7CH,A                      ;高位存储

MOV 7BH,B                      ;低位存储

INC R0                         ;地址加一

MOV A,@R0                      ;取数据

MOV B,#10                      ;

DIV AB                         ;

MOV 7FH,A                      ;高位存储

MOV 7EH,B                      ;低位存储

RET

INITIAL:

   MOV 7FH,#1        ;数码管显示12:00:00

   MOV 7EH,#2

   MOV 7DH,#10

   MOV 7CH,#0

   MOV 7BH,#0

   MOV 7AH,#10

   MOV 79H,#0

   MOV 78H,#0

   MOV 75H,#12        ;初始化时间  12:00:00

   MOV 74H,#0

   MOV 73H,#0

   MOV 72H,#08         ;初始化日期  08.3.20

   MOV 71H,#3

   MOV 70H,#20

   MOV 65H,#12          ;初始化定时时间 12:00:20

   MOV 64H,#0

   MOV 63H,#20

   MOV 62H,#00           ;初始化秒表00:00.00

   MOV 61H,#00

   MOV 60H,#00

   MOV 50H,#100          ;1s定时100*10ms

   MOV 51H,#20           ;200ms闪烁计时

   MOV 52H,#10           ;秒表计数器

   MOV 53H,#5            ;每放一个音时延时5ms

   MOV 58H,#1            ;存放音乐表的指针

   MOV TH0,#0D8H        ;T0定义为10ms中断

   MOV TL0,#0F0H

   MOV TMOD,#11H        ;定时器工作在方式1

   MOV IP,#2            ;定时器0高优先级

   MOV IE,#8FH          ;开中断

   SETB IT0              ;外部中断为边缘触发

   SETB IT1              ;外部中断为边缘触发

   SETB TR0              ;开定时器0

   MOV 20H,#0            ;

   SETB 00H              ;设置成处在时间显示状态      00H为时间显示标志,01h为日期显示标志,02h为定时时间显示标志,03h秒表显示标志 ;08h为秒位置选择标志,09h为分位置选者标志,0ah为时位置选择标志 ;10h为秒表开始或暂停标志,11h为,12h为是否正在放音乐标志,13h为是否延时标志,15h为闪烁标志,16h,17h为判断定时按键标志

                          

   MOV 21H,#0            ;位存储器初始化

   MOV 22H,#0            ;

   SETB 17H               ;  开定时器

   SETB P0.0               ;开定时器指示灯

RET

DISP:                    ;显示函数

    MOV R0,#78H           ;显示第一 个位置

    MOV DPTR,#TAB          ;

MOV R7,#0FEH            ;第一位有效

NEXT:

      MOV A,@R0            ;

      MOVC A,@A+DPTR       ;把十进制数转化成数码管对应的数据

      MOV P1,A             ;数据送出端口

      MOV P2,R7            ;地址送出端口

      ACALL DEL1MS         ;延时一毫秒

      MOV A,R7             ;

      RL A                 ;地址位左移到下一位

      MOV R7,A              ;

      INC R0                ;数据地址加1

      CJNE  R0,#80H,NEXT     ;是否已经显示完

LJMP DONE

TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H

       ;0   1    2   3   4   5   6   7   8   9  -   空

DEL1MS:                       ;延时1毫秒函数

       MOV R6,#2

 DEL1:MOV R5,#250

        DJNZ R5,$

        DJNZ R6,DEL1

RET

T0:                            ;定时器0函数

   PUSH DPH

   PUSH DPL

   PUSH PSW

   PUSH ACC

   MOV TH0,#0D8H                    ;定时时间设置为10毫秒

   MOV TL0,#0F0H

   DJNZ 50H,MIAO1                   ;是否已经延时1秒

   AJMP NEXT5                       ;

   MIAO1:LJMP MIAOBIAO              ;一秒还没到,进入秒表

   NEXT5:MOV 50H,#100               ; 重新循环100次,即一秒

   INC 73H                           ;秒加一

   MOV A,73H                         ;

   CJNE A,#60,MIAO2                   ;是否已经加到60

   AJMP NEXT6                        ;

   MIAO2:LJMP MIAOBIAO               ;没到60,进入秒表

   NEXT6:MOV 73H,#0                  ;已经加到60,秒清0

   INC 74H                           ;分加一

   MOV A,74H                         ;

   CJNE A,#60,MIAO3                  ;分是否已经加到60

   AJMP NEXT7                        ;

   MIAO3:LJMP MIAOBIAO               ;没到60,进入秒表

   NEXT7:MOV 74H,#0                  ;已经到60,分清0

   INC 75H                           ;时加1

   MOV A,75H                         ;

   CJNE A,#24,MIAO4                  ;是否已加到24

   AJMP NEXT8                        ;

   MIAO4:LJMP MIAOBIAO               ;没到24则进入秒表

   NEXT8:MOV 75H,#0                  ;时清0

   INC 70H                          ;日加1

   MOV A,70H                        ;

   CJNE A,#29,MONTH                  ;是否是29

   MOV A,71H                         ;

   CJNE A,#2,MIAO5                   ;是否是2月

   AJMP NEXT9                        ;

MIAO5:LJMP MIAOBIAO               ;不是2月,进入秒表

NEXT9:MOV 71H,#3                  ;月份为3

      MOV 70H,#1                        ;日为1

      LJMP MIAOBIAO                     ;

MONTH: MOV A,70H                     ;

      CJNE A,#31,MONTH1               ;是否是日是31

      MOV A,71H                       ;

      CJNE A,#4,MONTH6               ;是否是4月

      MOV 71H,#5                     ;;月份为5

      MOV 70H,#1                     ;日为1

      AJMP MIAOBIAO                  ;

 MONTH6:MOV A,71H                   ;

        CJNE A,#6,MONTH9             ;是否是6月

      MOV 71H,#7                     ;月份为7

      MOV 70H,#1                     ;日为1

      AJMP MIAOBIAO                  ;

 MONTH9:MOV A,71H                   ;

       CJNE A,#9,MONTH11             ;是否是 9月

      MOV 71H,#10                    ;月分为10

      MOV 70H,#1                     ;;日为1

      AJMP MIAOBIAO                  ;;

 MONTH11:MOV A,71H                  ;

         CJNE A,#11,MIAOBIAO         ;是否是11月

         MOV 71H,#12                    ;月份为12

         MOV 70H,#1                     ; 日为1

      AJMP MIAOBIAO                  ;

MONTH1: MOV A,70H                    ;

       CJNE A,#32,MIAOBIAO           ;是否日是32

       MOV A,71H                     ;

      CJNE A,#12,MONTH0              ;是否是 12月

      INC 73H                        ;年加1

      MOV 70H,#1                     ;月为1

      MOV 71H,#1                     ;日为1

      AJMP MIAOBIAO                  ;

 MONTH0:INC 71H                     ;不是12月,月加1

       MOV 70H,#1                    ;日为

       AJMP  MIAOBIAO               ;

MIAOBIAO:                            ;秒表函数

   JNB 03H,DINGSHI                   ;是否进入计时

   JNB 10H,DINGSHI                   ;是否开始计时

   DJNZ 52H,DINGSHI                  ;是否100毫秒已到

   MOV 52H,#10                       ;

   JNB P3.4,CLEAR                    ;按键按下时清0

   INC 60H                           ;0.1秒位加1

   MOV A,60H                         ;

   CJNE A,#10,DINGSHI                ;是否已加到10

   MOV 60H,#0                       ;0.1秒位清0

   INC 61H                          ;秒位加1

   MOV A,61H                         ;

   CJNE A,#60,DINGSHI                ;秒是否已经加到60

   MOV 61H,#0                        ;秒位清0

   INC 62H                           ;分加1

   MOV A,62H                         ;

   CJNE A,#60,DINGSHI                ;是否是60分

   MOV 62H,#0                        ;分为清0

   AJMP DINGSHI                      ;

   CLEAR:MOV 60H,#0                  ;清0

         MOV 61H,#0                  ;

         MOV 62H,#0                  ;

         CLR 10H                     ;停止计数

         AJMP DINGSHI                ;

DINGSHI:                             ;定时函数

   JB 17H,YSTART                     ;定时器有效

   LJMP BAOSHI                       ;定时器无效

   YSTART:JB 12H,START                      ;是否已经在放音乐

   MOV A,63H                         ;

   CJNE A,73H,BAO1                   ;是否时已到

   AJMP NEXT10                      ;

   BAO1:LJMP BAOSHI                 ;

   NEXT10:MOV A,64H                 ;

   CJNE A,74H,BAO2                  ;是否分已到

   AJMP NEXT11                      ;

   BAO2:LJMP BAOSHI                 ;

   NEXT11:MOV A,65H                 ;

   CJNE A,75H,BAO3                  ;是否秒已到

   AJMP NEXT12                      ;

   BAO3:LJMP BAOSHI                 ;

   NEXT12:SETB 12H                  ;设置定时已到

   MOV 55H,#10H                     ;第一个节拍

   MOV 57H,#0FBH                    ;第一个音调高位

   MOV 56H,#8BH                     ;第一个音调低位

   SETB TR1                         ;启动定时器1

START:DJNZ 55H,BAO4               ;节拍是否已结束

      AJMP NEXT13                   ;

BAO4: LJMP BAOSHI              ;

NEXT13: CPL 13H                 ;

     JB 13H,DELAY50MS               ;进入延时50毫秒

     MOV A,58H                      ;

     INC A                          ;表地址加1

     MOV 58H,A                      ;

 GETNEXT:MOV DPTR,#DAT              ;

     MOVC A,@A+DPTR                 ;取音调

     CJNE A,#00H,DSQ1           ;是否已经结束

     CLR 12H                        ;定时结束

     CLR TR1                        ;关定时器1

     CLR P3.0                       ;关蜂鸣器

     CLR 13H                        ;

     MOV 59H,#00H                   ;

     MOV 58H,#01H                   ;

     AJMP BAOSHI                    ;

  DSQ1:CJNE A,#01H,DSQ2             ;

      MOV A,55H                     ;

      INC A                         ;

      INC A                         ;

      MOV 55H,A                     ;

      AJMP GETNEXT                  ;

  DSQ2:CJNE A,#0FFH,DSQ3        ;是否播放空音调

       CLR TR1                      ;关定时器1

       CLR P3.0                     ;关蜂鸣器

      AJMP DSQ4                     ;

  DSQ3:MOV B,#20                    ;把音调转化成定时器1所对应定时存储器

       MUL AB                      ;

       MOV 59H,A                   ;

       MOV A,#0FFH                  ;

       SUBB A,59H                   ;

       MOV 56H,A                    ;

       MOV 59H,B                    ;

       MOV A,#0FFH                  ;

       SUBB A,59H                   ;

       MOV 57H,A                    ;

       SETB TR1                     ;

  DSQ4:MOV A,58H                    ;

       INC A                        ;表地址加1

       MOV 58H,A                    ;

       MOV DPTR,#DAT                ;

       MOVC A,@A+DPTR               ;取节拍进行延时

       MOV 55H,A                    ;

       JB P3.4,BAOSHI               ;是否停止放

       CLR 12H                      ;清标志位

       CLR TR1                      ;关定时器1

       CLR P3.0                     ;关蜂鸣器

       CLR 13H                      ;

       MOV 59H,#00H                 ;

       MOV 58H,#01H                 ;

       AJMP BAOSHI                  ;

 DELAY50MS:CLR TR1                 ;延时50毫秒

        CLR P3.0                    ;关蜂鸣器

        MOV 55H,#5                  ;

BAOSHI:                             ;整点报时函数

   JB 12H,FLASHCTRL                 ;如果正在定时放音乐则不整点报时

   MOV A,74H                        ;

   CJNE A,#0,BAO                    ;是否是0分

   MOV A,73H                        ;

   CJNE A,#0,FLASHCTRL              ;是否是0秒

   ;JNB TR1,FLASHCTRL                ;是否已经关定时器1

   CLR TR1                          ;关定时器0

   CLR P3.0                         ;关蜂鸣器

   AJMP FLASHCTRL                   ;

   BAO:MOV A,74H                    ;

   CJNE A,#59,FLASHCTRL             ;是否是59分

   MOV A,73H                       ;

   CJNE A,#55,EQU56S                ;是否是55秒

   JB TR1,FLASHCTRL                 ;是否已经在报时

   MOV 56H,#8BH                     ;启动定时器1报时

   MOV 57H,#0FBH                    ;;

   SETB TR1                         ;

   AJMP FLASHCTRL                   ;

   EQU56S:                          ;

     CJNE A,#56,EQU57S              ;是否是56秒

     JNB TR1,FLASHCTRL              ;是否已经关定时器1

     CLR TR1                        ;关定时器1

     CLR P3.0                       ;关蜂鸣器

     AJMP FLASHCTRL                 ;

   EQU57S:                          ;

     CJNE A,#57,EQU58S              ;是否是57秒

     JB TR1,FLASHCTRL               ;是否正在报时

     MOV 56H,#8BH                   ;启动定时器1报时

     MOV 57H,#0FBH                  ;

     SETB TR1                       ;

     AJMP FLASHCTRL                 ;

   EQU58S:                          ;

     CJNE A,#58,EQU59S              ;是否是58秒

     JNB TR1,FLASHCTRL              ;是否已经关定时器1

     CLR TR1                        ;关定时器1

     CLR P3.0                       ;关蜂鸣器

     AJMP FLASHCTRL                 ;

   EQU59S:                          ;

     CJNE A,#59,FLASHCTRL           ;是否是59秒

     JB TR1,FLASHCTRL               ;是否开定时器1

     MOV 56H,#8BH                   ;

     MOV 57H,#0FEH                  ;

     SETB TR1                       ;

     AJMP FLASHCTRL                 ;

FLASHCTRL:                          ;闪烁标志控制函数

    DJNZ 51H,T0OUT                  ;是否已经延时200豪秒

    MOV 51H,#20                     ;

    CPL 15H                         ;标志位取反

AJMP T0OUT                      ;

T0OUT:POP ACC                       ;

      POP PSW                       ;

      POP DPL                       ;

      POP DPH                       ;

RETI

T1:                                 ;定时器1,产生音调所对应频率的方波

  PUSH ACC                          ;

  PUSH PSW                          ;

 MOV A,56H                          ;

 ORL TL1,A                          ;存入音调所对应的定时时间

 MOV A,57H                          ;

     MOV TH1,A                      ;

     CPL P3.0                       ;蜂鸣器位取反

 POP PSW

 POP ACC

RETI

                                    ;外部中断0

INT0:

   PUSH PSW

   PUSH ACC

   MOV 6FH,#30                        ;延时15毫秒

   DEL2:MOV 6EH,#250                  ;

       DJNZ 6EH,$                     ;

       DJNZ 6FH,DEL2                  ;

   JB P3.2,INT5                       ;是否已出低电平

   AJMP NEXT20                        ;

   INT5:LJMP INT0OUT                  ;

   NEXT20:MOV A,21H                   ;

   CJNE A,#0,TIAO                     ;是否出在调整状态

   MOV A,20H                          ;

   RL A                               ;时间、日期、定时时间、秒表间的状态切换

   MOV 20H,A                          ;

   JNB 04H,INT6                       ;秒表状态返回时间状态

   AJMP NEXT21                        ;

   INT6:LJMP INT0OUT                  ;

   NEXT21:MOV 20H,#01H                ;

   MOV 60H,#0                         ;回到时间状态,秒表清0

   MOV 61H,#0                         ;

   MOV 62H,#0                         ;

   CLR 10H                            ;秒表停止计时

   LJMP INT0OUT                       ;

TIAO:JNB 00H,DAY                      ;是否出在时间状态

     JNB 08H,MIN                      ;是否调整秒

     MOV 73H,#0                       ;秒清0

     LJMP INT0OUT                     ;

     MIN:JNB 09H,HOUR                 ;是否调整分

     INC 74H                          ;分加1

     MOV A,74H                        ;

     CJNE A,#60,INT7                  ;分是否60

     AJMP NEXT22                      ;

     INT7:LJMP INT0OUT                ;

     NEXT22:MOV 74H,#0                ;分清0

     LJMP INT0OUT                     ;

     HOUR:INC 75H                     ;时加1

     MOV A,75H                        ;

     CJNE A,#24,INT8                  ;时是否24

     AJMP NEXT23                      ;

     INT8:LJMP INT0OUT                ;

     NEXT23:MOV 75H,#0                ;时清0

     LJMP INT0OUT                     ;

  DAY:JNB 01H,TIMER                   ;是否处在日期状态

      JNB 08H,MON                      ;是否调整日

      INC 70H                          ;日加1

      MOV A,70H                        ;

      CJNE A,#29,MON2                  ;是否29

      MOV A,71H                        ;

      CJNE A,#2,INT0OUT                ;是否2月

      MOV 70H,#1                       ;调为1日

      AJMP INT0OUT                     ;

     MON2: MOV A,70H                  ;

          CJNE A,#31,MON1             ;是否31

          MOV A,71H                   ;

          CJNE A,#4,MON6              ;是否四月

          MOV 70H,#1                  ;调为1

     MON6:MOV A,71H              ;

               CJNE A,#6,MON9         ;     是否6月

               MOV 70H,#1             ;

     MON9:MOV A,71H              ;

              CJNE A,#9,MON11         ;是否9月

               MOV 70H,#1             ;

     MON11:MOV A,71H             ;

               CJNE A,#11,INT0OUT     ;是否11月

               MOV 70H,#1             ;

          AJMP INT0OUT                ;

   MON1: MOV A,70H                 ;

            CJNE A,#32,INT0OUT        ;日是否32

          MOV 70H,#1                  ;调为1

          AJMP INT0OUT                ;

   MON:JNB 09H,YEAR                   ;是否调整月

       INC 71H                        ;月加1

       MOV A,71H                      ;

       CJNE A,#13,INT0OUT             ;是否为13

       MOV 71H,#1                     ;调为1

       AJMP INT0OUT                   ;

  YEAR:INC 72H                      ;

          MOV A,72H                   ;

         CJNE A,#99,INT0OUT           ;年是否99

         MOV 72H,#0                   ;清0

         AJMP INT0OUT                 ;

 TIMER:JNB 08H,TIMERMIN               ;是否调整定时时间秒

      INC 63H                         ;秒加1

      MOV A,63H                       ;

      CJNE A,#60,INT0OUT              ;是否是60

      MOV 63H,#0                      ;清0

      AJMP INT0OUT                    ;

 TIMERMIN:JNB 09H,TIMERHOUR        ; 是否调整定时时间分

      INC 64H                         ;分加1

      MOV A,64H                       ;

      CJNE A,#60,INT0OUT              ;是否是60

      MOV 64H,#0                      ;分清0

      AJMP INT0OUT                    ;

 TIMERHOUR:INC 65H                   ;时加1

        MOV A,65H                     ;

      CJNE A,#24,INT0OUT              ;是否是24

      MOV 65H,#0                      ;时清0

      AJMP INT0OUT                    ;

INT0OUT:POP ACC

         POP PSW

RETI

INT1:                                 ;外部中断1

   PUSH PSW

   PUSH ACC

   MOV 6FH,#30                        ;延时15毫秒

   DEL3:MOV 6EH,#250                  ;

       DJNZ 6EH,$                     ;

       DJNZ 6FH,DEL3                  ;

      JB P3.3,INT0OUT                    ;是否稳定处于底电平

      JNB 03H,TIAO1                      ;是否处于秒表状态

      CPL 10H    ;秒表                   ;开始或暂停

      AJMP INT1OUT                       ;

  TIAO1: MOV A,21H                    ;

      CJNE A,#0,TIAO2                 ;是否处于调整状态

      SETB 08H                          ;

      AJMP INT1OUT                      ;

  TIAO2:MOV A,21H                     ;

        RL A                          ;

        MOV 21H,A                     ;

        JNB 0BH,INT1OUT               ;

        MOV 21H,#0                    ;

        MOV A,20H                     ;

        RL A                          ;选择其他调整位

        MOV 20H,A                     ;

        AJMP INT1OUT                  ;

INT1OUT:POP ACC

       POP PSW

       RETI

DAT:DB 39H,20H,26H,20H,26H,20H,26H,20H,26H,60H

    DB 2BH,20H,30H,30H,2BH,10H,30H,20H,33H,20H

    DB 39H,80H,1CH,20H,1CH,20H,1CH,20H,1CH,20H

    DB 1CH,60H,20H,20H,26H,20H,20H,20H,20H,20H

    DB 48H,20H,26H,80H,26H,20H,1CH,20H,1CH,20H

    DB 20H,20H,26H,60H,2BH,20H,30H,30H,2BH,10H

    DB 30H,20H,33H,20H,39H,40H,4CH,40H,4CH,20H

    DB 30H,20H,30H,20H,33H,20H,39H,60H,26H,20H

    DB 2BH,30H,30H,10H,33H,20H,40H,20H,39H,80H

    DB 4CH,20H,30H,20H,30H,20H,33H,20H,39H,60H

    DB 26H,20H,2BH,20H,2BH,20H,40H,20H,33H,20H

    DB 39H,80H,00H,00H,00H

附录2   硬件接线图

附录3 系统仿真图

更多相关推荐:
单片机课程设计数字钟实验报告

单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时间3闹钟功能一旦走时到该时间能以声或光的形式告警提示4能够实现按键启动与停止功能...

单片机课程设计数字钟报告

单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时间就是生命时间对人们来说总是那么宝贵工作的忙碌性和繁杂性容易使人忘记当前的时间忘...

单片机电子时钟设计报告

科技创新实践[数字时钟设计][用AT89S52单片机设计电子时钟的实验报告]目录单片机的个性化电子钟设计报告1一、设计背景1二、作品介绍1三、设计目的及意义1四、设计要求1五、总体方案设计25.1硬件设计21.…

单片机数字时钟课程设计报告

西安建筑科技大学课程设计论文第1章绪论1设计要求1系统可以按秒进行计时2数字时钟可以显示小时0023分钟0059和秒00593可通过按键K1来选择设置小时分钟和秒设置时可通过加和减按键K2K3来调整时间设置过程...

51单片机电子时钟课程设计报告

JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20xx级电工2班学号20xx401020xx2姓名王贞指导教师邹云峰提交日期20xx...

单片机电子时钟课程设计设计报告

单片机电子时钟设计一作品功能介绍该作品是个性化电子钟设计技术上主要用单片机AT89S52主控6位LED数码显示分别显示小时分钟秒该作品主要用于24小时计时显示能整时报时能作为秒表使用能定时闹铃1分钟功能介绍1上...

单片机数字钟课程设计报告

湖南工业大学课程设计资料袋电气与信息工程学院学年第学期课程名称单片机课程设计指导教师凌云职称教授学生姓名专业班级学号题目数字钟成绩起止日期20xx年12月23日20xx年1月10日目录清单湖南工业大学课程设计任...

单片机课程设计论文_电子时钟设计

课程设计论文题目名称电子时钟设计课程名称单片机原理与接口技术学生姓名学号系专业电气工程系电气类指导教师20xx年7月2日课程设计论文任务书1指导教师签字学生签字2课程设计论文评阅表学生姓名学号系别电气工程系专业...

单片机数字时钟课程设计报告

单片机应用综合设计报告设计学院专班姓指导题目名称业级名教师日期20xx122820xx1231一任务书1用80C51设计一个数字时钟2可显示时分秒3按键实现时分秒人工校准4具有闹钟功能5实现秒表时钟转换秒表要求...

单片机课程设计报告_数字钟

数字钟中文摘要随着时代的进步和发展单片机技术已经普及到我们的生活工作科研各个领域已经成为一种比较成熟的技术本文将利用单片机来设计制作一个数字钟当开机时数字钟开始计时同时也可以利用按键分别调整秒分时的计数英文摘要...

单片机电子时钟课程设计报告-自动化专业

单片机原理及应用课程设计专业自动化设计题目电子时钟班级学生姓名学号10指导教师分院院长教研室主任电气工程学院一课程设计任务书1课程设计项目电子时钟LED显示2设计内容1以MCS51系列单片机为核心器件组成电子时...

单片机简易数字钟设计及其报告

单片机课程设计课程设计报告题目学年学期专业电气工程及其自动化班级094学号姓名指导教师时间20xx年11月日20xx年12月6日浙江XXX学院电子信息学院目录浙江XX学院电子信息学院课程设计报告1设计简介22设...

单片机数字钟课程设计报告(17篇)