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

         

数字钟

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

英文摘要:With the era of progress and development, microcontroller technology has spread to our life, work, research in various fields, has become a relatively mature technology, the paper will use the microcontroller to design a digital clock. When switched on, digital clock starts. Can also use the control buttons are seconds, minutes, hours count.                              

关键词:单片机,数字钟,AT89S51

一.引言

  数字钟是一种用电路技术实现时、分、秒计数字时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。该设计利用AT89S51单片机来实现,开机时,从12:00:00开始计时,并且可以利用按键来对时间进行调整。

二.总体设计方案

1.数字钟设计方案论证

方案一:

本设计可利用中小规模集成电路组成数字钟,主要利用数字电路知识,主要采用74LS160 、译码器7448等芯片,再加上555定时器、数码管、电阻、电容这些器件组成数字钟。接通电源即可工作,但接线比较麻烦。

方案二:

本设计也利用单片机来实现,单片机作主控制器,再接一些外围电路便可组成数字钟。此设计接线比较简单且利用单片机实现的电子钟具有编程灵活,并便于功能的扩展。

从以上两种方案,很容易看出,采用方案二,接线比较简单,电子钟编程灵活,故采用了方案二。

2.方案二的总体设计框图:

2.1主控制器

AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。AT89S51按其功能来分,可分为如下3类:                                                             

(1)电源及时钟引脚:Vcc、Vss;XTAL1、XTAL2。

(2)控制引脚:非PSEN、 ALE 、非EA、 RESET(即RST)。

(3)I/O口引脚:P0、P1、P2、P3,为4个8位I/O口的外部引脚。

              (引脚图)

2.2时钟振荡电路

方案一:外部时钟方式

  外部时钟方式是使用外部振荡器产生的脉冲信号,外部的时钟源直接连到XTAL1端,XTAL2端悬空。常用于多片单片机同时工作,以便于多片单片机之间的同步,一般为低于12MHz的方波。

方案二:内部时钟方式

AT89S51内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器(简称晶振)和微调电容,就构成一个稳定的自激振荡器。电路中的电容C1和C2典型值通常选择为30pF左右。对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的范围、振荡器的稳定性和起振的快速性。晶振的振荡频率的范围通常是在1.2MHz-12MHz之间。晶振的频率越高,则系统的时钟频率也就越高,单片机的运行速度也就越快。

考虑到方案一一般适用于多片单片机,故采用方案二。

2.3单片机复位电路

复位电路由两部分组成,电容和电阻。此复位电路称上电复位。上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。

2.4按键调节电路

每按下一次开关,计数值加1,把“单片机系统”区域中的P0.0、P0.1、P0.2端口连接到SP1、SP2、SP3。作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为在按下的过程中,一旦有干扰过来,可能造成误触发过程,因此在按键按下的时候要滤除干扰信号。在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,再来检测一次,看按键是否真的已经按下,若真的已经按下,这时肯定输出为低电平,若这时检测的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程,从而提高了系统的可靠性。

2.5显示电路

采用动态扫描的方法进行显示,所谓动态扫描显示技术就是指:多位数码管采用“并联”动态接口,通过对各数码管轮流循环点亮,实现多位数码显示。当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。对于显示的字形码数据采用查表方法完成。

三.程序设计框图:

1.  主程序流程图

2.  中断服务程序流程图

四.总结与体会

       在此次设计的过程中,我们发现了许多的问题,虽然以前也做过一些设计但这次设计真的让我们长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前也写过一些程序,但我们都觉得写好一个程序并不是一件简单的事。从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际中去,学习单片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我们在这次课程设计中的最大收获。

五.参考文献

1.张毅刚.单片机原理及应用.北京:高等教育出版社,2003

2.李任青、熊勇勇.单片机原理实验及应用.南昌大学共青学院,2009

六.附录一:汇编源程序

SECOND      EQU 30H

MINITE       EQU 31H

HOUR        EQU 32H

HOURK       BIT P0.0

MINITEK      BIT P0.1

SECONDK     BIT P0.2

DISPBUF       EQU 40H

DISPBIT        EQU 48H

T2SCNTA       EQU 49H

T2SCNTB      EQU 4AH

TEMP         EQU 4BH

 

        ORG 00H

        LJMP START

        ORG 0BH

        LJMP INT_T0

START:  MOV SECOND,#00H

        MOV MINITE,#00H

        MOV HOUR,#12

        MOV DISPBIT,#00H

        MOV T2SCNTA,#00H

        MOV T2SCNTB,#00H

        MOV TEMP,#0FEH

        LCALL DISP                       

        MOV TH0,#(65536-2000) / 256         

        MOV TL0,#(65536-2000) MOD 256

        SETB TR0

        SETB ET0

        SETB EA

WT:     JB SECONDK,NK1   

        LCALL DELY10MS

        JB SECONDK,NK1

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NS60

        MOV SECOND,#00H

NS60:   LCALL DISP

        JNB SECONDK,$

NK1:    JB MINITEK,NK2

        LCALL DELY10MS

        JB MINITEK,NK2

        INC MINITE

        MOV A,MINITE

        CJNE A,#60,NM60

        MOV MINITE,#00H

NM60:   LCALL DISP

        JNB MINITEK,$

NK2:    JB HOURK,NK3

        LCALL DELY10MS

        JB HOURK,NK3

        INC HOUR

        MOV A,HOUR

        CJNE A,#24,NH24

        MOV HOUR,#00H

NH24:   LCALL DISP      

 JNB HOURK,$

NK3:    LJMP WT

DELY10MS:

        MOV R6,#10

D1:     MOV R7,#248

        DJNZ R7,$

        DJNZ R6,D1

        RET

DISP:                        

        MOV A,#DISPBUF       

        ADD A,#8

        DEC A

        MOV R1,A

        MOV A,HOUR

        MOV B,#10

        DIV AB

        MOV @R1,A             

        DEC R1

        MOV A,#10              

        MOV@R1,A   

        DEC R1

        MOV A,MINITE

        MOV B,#10

        DIV AB

        MOV @R1,A

        DEC R1

        MOV A,B

        MOV @R1,A

        DEC R1

        MOV A,#10

        MOV@R1,A

        DEC R1

        MOV A,SECOND

        MOV B,#10

        DIV AB

        MOV @R1,A

        DEC R1

        MOV A,B

        MOV @R1,A

        DEC R1

        RET

INT_T0:

        MOV TH0,#(65536-2000) / 256

        MOV TL0,#(65536-2000) MOD 256

        MOV A, #0FFH

        MOV P3,A

        MOV A,#DISPBUF

        ADD A,DISPBIT           

        MOV R0,A      

        MOV A,@R0

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P1,A

        MOV A,DISPBIT

        MOV DPTR,#TAB

        MOVC A,@A+DPTR

        MOV P3,A

        INC DISPBIT

        MOV A,DISPBIT

        CJNE A,#08H,KNA

        MOV DISPBIT,#00H

KNA:    INC T2SCNTA          

        MOV A,T2SCNTA

        CJNE A,#100,DONE

        MOV T2SCNTA,#00H

        INC T2SCNTB

        MOV A,T2SCNTB

        CJNE A,#05H,DONE

        MOV T2SCNTB,#00H

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NEXT

        MOV SECOND,#00H

        INC MINITE

        MOV A,MINITE

        CJNE A,#60,NEXT

        MOV MINITE,#00H

        INC HOUR

        MOV A,HOUR

        CJNE A,#24,NEXT

        MOV HOUR,#00H

NEXT:   LCALL DISP

DONE:   RETI

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

TAB:    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

        END

 附录二:

1.DXP

2.proteus

 

第二篇:单片机课程设计报告最终版

单片机原理及其接口技术

课程设计报告

  设计课题:基于MCS-51单片机的时钟秒表设计

             专业班级:    08自动化              

小组成员:    周剑(08118090              

指导教师:   阮海容               


   基于MCS-51单片机的时钟秒表设计

      设计任务书

      基本设计要求

(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。
(2)程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
(3)6位显示器数码管从左到右分辨显示时. 分. 秒(各占用2位),采用24小时标准计时制。开端计时时为000000,到235959后变成000000.
(4)在4*4矩阵键盘上选定3个键分辨作为小时. 分. 秒的调校键。每按一次键,对应的显示值便加1。分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变).
(5)软件设计必须应用8031片内定时器,采用定时中断结构,不得应用软件延时法

     选作项目

1)另设三个键,分别作小时、分、秒的减1调校。

         (2)在以上设计的基础上,修改程序制作一个电子秒表。分、秒各占用                  2位显示,1/10秒、1/100秒各占用1位显示。设定二个键分别作启动/ 停止、清零。

         (3)在做完(2)后,将时钟与秒表合二为一,并且在同时使用时互不影 响。即可在时钟与秒表之间任意切换,而不影响走时、计秒。

    .目录

    第一章 设计阐明
       1.1 设计内容
       1.2 设计请求
       1.3设备及工作环境

   第二章 硬件计划
            2.1 设计思路

2.2 原理电路图

            2.3 硬件工作原理论述

   第三章 软件计划

           3.1 分析论证

           3.2 程序流程图

           3.3程序清单
   第四章 调试过程及成果分析

   第五章设计总结
          参考文献
                       第一章 设计阐明

1.1设计内容
用ZY15MCU12BD型综合单片机实验箱及串口电路设计实现显示时间并能够调校时间的时钟,还能够实现秒表的启动/暂停,复位功能
1.2设计请求
   (1) 在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。
   (2) 程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
   (3) 6位显示器数码管从左到右分别显示时. 分. 秒(各占用2位),采用24小时标准计时制。开端计时时为000000,到235959后变成000000.
   (4) 在键盘上选定6个键分别作为小时. 分. 秒的调校键。每按一次键,对应的显示值便加1或减1。分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变)再选一个键用作时钟的复位键.另外选一个键作为秒表的启动/暂停键,再选一个键作为秒表的复位键。
  (5) 软件设计必须应用8031片内定时器,采用定时中断结构,不得应用软件延时法。
  (6) 上机调试程序。
  (7) 写出设计报告。
1.3设备及工作环境
  (1) 硬件:盘算机一台、ZY15MCU12BD型综合单片机实验箱一台、通信电缆一根。
  (2) 软件:Windows操纵系统、Keil C51软件。

                      第二章 硬件计划
2.1 设计思路
   电子时钟程序由显示模块、校时模块和时钟运算模块三大部分组成。其中校时模块和时钟运算模块要对时、分、秒的数值进行操作,并且秒算到60时,要自己清零并向分进1;分算到60时,要自己清零并向时进1;时算到24时,要清零。这样,才能循环记时。秒表程序也由显示模块,启动/暂停复位模块和时钟运算模块组成。其中校时模块和时钟模块要对1/100秒,1/10秒,秒,分的数值进行操作并且1/100秒算到10时,要自己清零并向1/10秒进1;1/10秒算到10时,要自己清零并向秒进1;秒时算到60时,要自己清零并向分进1,秒时算到60时,要自己清零。用按键决定是进入时钟程序还是秒表程序。
2.2 原理电路图

2.3 硬件工作原理论述

硬件由8031芯片、74LS373锁存器、8255A串口芯片、74LS240驱动器、显示器数码显示管和4*4键盘组成.由8031片内定时器定时中断,并取一存储单元作为计数器应用,每中断一次,在中断服务程序中使计数器加1、用8031片内定时器T0定时中断服务程序完成秒、分、时的运算即计时功效,T1定时中断服务程序完成1/100秒、1/10秒、秒,分的运算即秒表功效。8255A负责将内存里的时位、分位和秒位数值或1/100秒、1/10秒、秒,分位数值输出到数码管。同时按键01键、02键、03键是分别对时、分、秒的加1校订;05键、06键、07键时分别对时、分、秒的减1校订;00键是清零键。并且开机时时钟时从000000开端计时的,到235959时在回到000000.09键实现秒表的启动/暂停,0A0键实现秒表的复位。
                  第三章软件计划


3.1 分析论证
此时钟秒表的设计与实现,主要采用了6只显示器数码管8031内部二进制16位定时器/计数器,可编程并行I/O接口8255芯片和矩阵键盘等,包含显示模块,运算模块和校时模块三大功效模块。
3.1.1、显示模块:
用8255,数码管的显示功效来设计。显示部分硬件用六只显示器为显示管,这些显示器发光二极管的阳极是互相连接在一起的,所以称为共阳极数码管。通过在这8只发光二极管的阴极加-5 V或0 V的电压使不同的二极管发光,形成不同的数字。该模块重要是将运算模块和校时模块运算出来并存放在内存单元里的十六进制表现的时位、分位和秒位或或1/100秒、1/10秒、秒,分数值转化为十进制,并通过6只数码管显示出来。该模块实现的硬件是实验箱中的显示器单元,采用软件译码,即在程序中设置一个段选码表。CPU直接往显示器输出八段代码,省去了硬件译码器。只要做到每送一次段选码时也送一次位扫描码,并且每送一次位扫描码后,位码中的0右移一位作为下一次的位扫描码,即可实现由左向右使6只显示器依次呈现数字显示。
3.1.2、运算模块:
该模块的重要功效是对时、分、秒或或1/100秒、1/10秒、秒,分的运算,并把运算出的终极成果存到事先已经开辟的内存单元里,以便显示模块即时地显示出来。该模块可以细分为定时模块和运算模块。定时模块负责供给中断信号,由于CPU运算模块中的指令耗费必定的时间,所以中断信号最好通过硬件来实现。本实验中用8031定时器/计数器,但由于8031供的信号的周期是毫秒级的,因此必须通过软件的方法在运算模块中设置一个统计中断次数的变量,并且这一变量必须事先在内存里开辟存储单元。中断信号是8031工作方法为方法1,产生一个50ms的脉冲信号。运算模块负责时、分、秒或或1/100秒、1/10秒、秒,分的计算,在中断服务程序里,必须对秒、分和时的单元内的数值进行判断,当秒加到60时,分必须加1 、秒清零;当分加到60时,时加1、分清零。当时加到24时,直接清零,然后转到调用处。秒表也是如此。
3.1.3、校时模块:
该模块重要功效是修正时、分、秒内存单元的数值。每按一次键,对应的显示值便加1。分、 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变)。要注意在主程序中对时间进行调校前应封闭中断,以防在调校过程中定时中断服务程序也对时间进行修正而造成混杂。

3.1.4、启动/暂停,复位模块

该模块的功能是实现秒表的启动/暂停,复位。本实验中第一次按下09键进入秒表程序,开始跑时,第二次按下09键暂停秒表,按下0A0键秒表清零并返回到主程序
3.1.5、整体功效:
在6块显示器数码管上能实现数字时钟的时、分、秒显示和秒表,并能对时、分、秒进行加1校订、减1校订和清零。本实验中01键、02键、03键是分别对时、分、秒的加1校订;05键、06键、07键时分别对时、分、秒的减1校订;00键是清零键。并且开机时时钟时从000000开端计时的,到235959时在回到000000.
3.2 程序流程图

 


                    

 


主程序流程图

 

3.3程序清单

        

      ORG 0000H

      LJMP START

      ORG 000BH

      LJMP INTT0

      ORG 001BH

      LJMP INTT1

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 ;;           主 程 序                 ;;

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

START: MOV SP, #60H

       MOV R0, #5

LOOP1: MOV R1, #200

LOOP2: MOV R2, #250

       DJNZ R2, $

       DJNZ R1, LOOP2

       DJNZ R0,LOOP1    ;延时0.5S

       MOV DPTR,#4003H  ;8255初始化

       MOV A, #81H

       MOVX @DPTR, A

       MOV R0, #20H

       MOV R7, #07H

CLEAR: MOV @R0, #00H

       MOV @R1, #00H

       INC R0

       DJNZ R7,CLEAR  ;20H-26H 30H-36H清零

       MOV TMOD,#11H  ;选择方法.

       MOV TH1, #0D8H

       MOV TL1, #0F0H

       MOV TH0, #3CH

       MOV TL0,#0B0H  ;赋初值

LOOP: SETB EA

      SETB ET0

      SETB TR0  ;启动T0计数

      LCALL DISPLAY1   ;调用时钟显示程序

      LCALL KEYSCAN     ;键盘扫描

      CJNE A,#0FFH, CHOOSE ;若有键按下,则CHOOSE

      SJMP CLOCK ;无键按下,则转LOOP

CHOOSE: CJNE A, #09H,CLOCK

       LJMP SECONDS ;若秒表启动键按下,则进入秒表

CLOCK: LCALL DISPLAY1

      LCALL KEYSCAN ;再次扫描键盘

      CJNE A,#0FFH,SET_A;若有键按下则进入调校

      SJMP LOOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           秒表 程 序              ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SECONDS: MOV 30H, #00H

        MOV 31H, #00H

        MOV 32H, #00H

        MOV 33H, #00H

        MOV 34H, #00H

        MOV 35H, #00H

SETB TR1

LOOP3: SETB ET1

      LCALL DISPLAY2

      LCALL KEYSCAN

      CJNE A,#0FFH,PAUSE;若有键按下,则PAUSE

      SJMP LOOP3

PAUSE:CLR ET1 ;关中断

      CJNE A, #09H, RESET1

      CPL TR1;暂停

      SJMP LOOP3

RESET1: CJNE A, #0AH, LOOP5

       MOV TH1, #0D8H

       MOV TL1, #0F0H

       SETB TR1

       MOV 30, #00H

       MOV 31, #00H

       MOV 32, #00H

       MOV 33, #00H

       MOV 34, #00H

       MOV 35,#00H;清零

       CLR TR1

       LCALL DISPLAY2

       LJMP LOOP

LOOP5: AJMP LOOP3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           加1子 程 序              ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

SET_A: CLR ET0  ;关中断

         CJNE A,#03H,ADDMM ;按下的键为秒键往下履行

         INC 25H

         MOV A, 25H

         CJNE A, #10, LOOP4

         MOV 25H, #0

         INC 24H      

         MOV A, 24H

         CJNE A, #6, LOOP4

         MOV 24H, #0

         SJMP LOOP

ADDMM: CJNE A,#02H,ADDHH ;按下的键为分键往下履行

       INC 23H

       MOV A, 23H

       CJNE A, #10, LOOP4

       MOV 23H, #0

       INC 22H

       MOV A, 22H

       CJNE A, #6, LOOP4

       MOV 22H, #0

       LJMP LOOP

ADDHH: CJNE A,#01H,REST ;按下的键为小时键往下履行

       INC 21H

       MOV A, 21H

       CJNE A, #10, A_HOUR

       MOV 21H, #0

       INC 20H

REST: CJNE A,#00H,DECSS

       MOV 20H, #00H 

       MOV 21H, #00H

       MOV 22H, #00H

       MOV 23H, #00H

       MOV 24H, #00H

       MOV 25H, #00H

A_HOUR: MOV A, 20H

       SWAP A

       ORL A, 21H

       CJNE A, #24H, LOOP4

       MOV 20H, #0

       MOV 21H, #0

LOOP4: LJMP LOOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           减1子 程 序              ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

SET_D: LJMP LOOP

DECSS: CJNE A,#07H,DECMM

       MOV A, 25H

       DEC 25H

       CJNE A, #0, SET_D

       MOV 25H, #9

       MOV A, 24H

       DEC 24H

       CJNE A, #0, SET_D

       MOV 24H, #5

       SJMP SET_D

DECMM: CJNE A, #06H, DECHH

       MOV A, 23H

       DEC 23H

       CJNE A, #0H, SET_D

       MOV 23H, #9

       MOV A,

       DEC 22H

       CJNE A, #0, SET_D

       MOV 22H, #5

       SJMP SET_D

DECHH: CJNE A,#05H,SET_D

       MOV A, 21H

       CJNE A, #0, D_HOUR1

       MOV A, 20H

       CJNE A, #0,D_HOUR2

       MOV 21H, #3

       MOV 20H, #2

       SJMP SET_D

D_HOUR1: DEC 21H

       LJMP SET_D

D_HOUR2: DEC 20H

        MOV 21H, #9

       LJMP SET_D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           时钟显示程序                  ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 显示数据在20H-25H单元内,用六位LED共阳数码管显示,

DISPLAY1: MOV PSW, #08H

     MOV R0, #20H

     MOV R2, #0FEH

LD0: MOV A,@R0

        MOV DPTR, #DTAB

        MOVC A,@A+DPTR  ;查字形代码

        MOV DPTR,#4001H  ;字形代码送B段口

        MOVX @DPTR, A

        MOV A, R2

        MOV DPTR,#4000H  ;字形代码送A位口

        MOVX @DPTR, A 

        MOV R1, #250

        DJNZ R1, $

        MOV A,#0FFH  ;封闭所有的显示位即位口置高电平

        MOVX @DPTR, A

        MOV A, R2

        RL A

        MOV R2, A

        INC R0

        CJNE R0, #26H,LD0

        RET

DTAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H

  DB 92H, 82H, 0F8H, 80H, 90H

  DB 88H, 83H, 0C6H, 0A1H, 86H

DB 8EH, 40H, 79H, 24H, 30H

DB 19H, 12H, 02H, 78H, 00H

DB 80H, 08H, 03H, 46H, 21H

DB 06H, 0EH, 0BFH, 0FFH

    

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           秒表显示程序                  ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 显示数据在30H-35H单元内,用六位LED共阳数码管显示,

DISPLAY2: MOV PSW, #08H

     MOV R0, #30H

     MOV R2, #0FEH

LD1: MOV A,@R0

        MOV DPTR, #DTAB1

        MOVC A,@A+DPTR  ;查字形代码

        MOV DPTR,#4001H  ;字形代码送B段口

        MOVX @DPTR, A

        MOV A, R2

        MOV DPTR,#4000H  ;字形代码送A位口

        MOVX @DPTR, A 

        MOV R1, #250

        DJNZ R1, $

        MOV A,#0FFH  ;封闭所有的显示位即位口置高电平

        MOVX @DPTR, A

        MOV A, R2

        RL A

        MOV R2, A

        INC R0

        CJNE R0, #36H,LD1

        RET

DTAB1: DB 0C0H,  0F9H , 0A4H, 0B0H, 99H

  DB 92H, 82H, 0F8H, 80H, 90H

  DB 88H, 83H, 0C6H, 0A1H, 86H

DB 8EH, 40H, 79H, 24H, 30H

DB 19H, 12H, 02H, 78H, 00H

DB 80H, 08H, 03H, 46H, 21H

DB 06H, 0EH, 0BFH, 0FFH

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           键盘扫描程序             ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEYSCAN: MOV DPTR, #4002H

     MOV A, #0FH

     MOVX @DPTR, A

     MOVX A,@DPTR

     ANL A, #0FH

     CJNE A, #0FH,NEXT

     SJMP DONE

NEXT: MOV R2, #0EFH

KEYSM1: MOV A, R2

       MOV DPTR, #4002H

       MOVX @DPTR, A

       MOVX A,@DPTR

       ANL A, #0FH

       CJNE A, #0FH, NEXT1

KEYSM2: MOV A, R2

       RL A

       MOV R2, A

       JB ACC.0, KEYSM1

DONE: MOV A, #0FFH

       RET

NEXT1: MOV R6, A

       MOV R3, #100

LOOP9: MOV R4, #100

       DJNZ R4, $

       DJNZ R3, LOOP9

       MOVX A,@DPTR

       ANL A, #0FH

       XRL A, R6

       JNZ KEYSM2

LOOP20: MOVX A,@DPTR

       ANL A, #0FH

       CJNE A, #0FH, LOOP20

       MOV A, R6

       ANL A, #0FH

       MOV R6, A

       MOV A, R2

       ANL A, #0F0H

       ORL A, R6

       CALL KEY20

       RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           查键值程序             ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY20: PUSH ACC

       MOV R1, #00H

KEY21: JNB ACC.4, KEY22

      RR A

      INC R1

      SJMP KEY21

KEY22: MOV A, R1

      MOV B, #4

      MUL AB

      MOV R1, A

      POP ACC

KEY23: JNB ACC.0,KEY24

       RR A

       INC R1

       SJMP KEY23

KEY24: MOV DPTR, #KEYTAB

      MOV A, R1

      MOVC A,@A+DPTR

      RET

KEYTAB: DB 0FH, 0BH, 07H, 03H

DB 0EH, 0AH, 06H, 02H

DB 0DH, 09H, 05H, 01H

DB 0CH, 08H ,04H, 00H

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           T1中断服务程序              ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

INTT1: PUSH ACC

       PUSH PSW

       MOV TH1, #0D8H

       MOV TL1, #0F0H

       INC 35H

       MOV A, 35H

       CJNE A,#10,OUTT1;未到1秒,则转RETURN

       MOV 35H, #00H

       INC 34H  ;到1秒,秒单元的个位加1

       MOV A, 34H

       CJNE A, #10, OUTT1;

       MOV 34H, #00H

       INC 33H

       MOV A, 33H

       CJNE A,#10,OUTT1;未到60秒,则转

       MOV  33H , #00H

       INC 32H ; 分单元个位加1

       MOV A, 32H

       CJNE  A , #06,OUTT1

       MOV 32H, #00H

       INC 31H

       MOV A, 31H

       CJNE A,#10H,CCC ;若未到60分,则转

       MOV A, 30H

       CJNE A, #06H, CCC

       MOV 31H, #00H

       MOV 30H, #00H

CCC: CJNE A, #10, OUTT1

      MOV 31H, #00H

      INC 30H

      MOV A, 30H

OUTT1: POP PSW

       POP ACC

       RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           T0中断服务程序              ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T0中断服务程序

INTT0: PUSH ACC

       PUSH PSW

       MOV TH0, #3CH

       MOV TL0, #0B0H

       INC 26H

       MOV A, 26H

       CJNE A,#20,OUTT0 ;未到1秒,则转RETURN

       MOV 26H, #00H

       INC 25H  ;到1秒,秒单元的个位加1

       MOV A, 25H

       CJNE A, #10, OUTT0;

       MOV 25H, #00H

       INC 24H

       MOV A, 24H

       CJNE A,#6,OUTT0;未到60秒,则转

       MOV 24H, #00H

       INC 23H ; 分单元个位加1

       MOV A, 23H

       CJNE A, #10, OUTT0

       MOV 23H, #00H

       INC 22H

       MOV A, 22H

       CJNE A,#06H,OUTT0 ;若未到60分,则转

       MOV 22H, 00H

       INC 21H

       MOV A, 21H

       CJNE A, #4H, CCCC

       MOV A, 20H

       CJNE A, #2H, CCCC

       MOV 21H, #00H

       MOV 20H, #00H

CCCC: CJNE A, #10, OUTT0

      MOV 21H, #00H

      INC 20H

      MOV A, 20H

OUTT0: POP PSW

       POP ACC

       RETI

       END

相关推荐