找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3607|回复: 1
收起左侧

60秒LED旋转电子钟

[复制链接]
ID:551457 发表于 2019-5-30 22:16 | 显示全部楼层 |阅读模式
1系统分析
1.1功能
本文设计一款采用LED显示器件显示的电子时钟,有效克服了时钟存在的误差问题,并能在夜间不必其它照明就能看到时间,且以60只发光管实现秒显示,接近于传统的秒针来显示秒的形式。另加七只装饰用的LED灯,使整个时钟显的相当美观新颖,故还可作为室内装饰用。
电子钟的外观如图1所示。周边60只发光管顺时旋转来显示秒,中间四只LED数码管用于显示时间,中下方的七只LED灯顺时旋转,供装饰用。其主要功能有:
(1)整点报时;
(2)四只LED数码管显示当前时分;
(3)每隔一秒钟周边的60只LED发光管旋转一格,装饰用的LED每隔一秒旋转一次;
(4)当发生停电事件时,由后备电池供电,系统进入低功耗状态,所有显示部件停止显示,这样即延长了电池的寿命,同时又保证了CPU继续计数,不至于因停电而时钟停止运行。当恢复供电后,系统自动恢复工作状态,不影响计时。

1.2方案论证
电脑钟的原理框图如图2所示。它由以下几个部件组成:单片机89C2051、电源、时分显示部件、60秒旋转译码驱动电路。
file:///C:/Users/jiaxin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
时分显示采用动态扫描,以降低对单片机端口数的要求,同时也降低系统的功耗。时分显示模块、60秒旋转译码驱动电路以及显示驱动都通过89C2051的I/O口控制。
电源部分:电源部分有二部分组成。一部分是由220V的市电通过变压、整流稳压来得到+5V电压,维持系统的正常工作;另一部分是由3V的电池供电,以保证停电时正常走时。正常情况下电池是不提供电能的,以保证电池的寿命。


2 系统设计
2.1 系统硬件电路的设计
本系统的应用程序主要由主程序、中断服务程序和子程序组成。主程序的任务是对系统进行初始化,实现参数输入,并控制电加热炉的正常运行。主程序主要由系统初始化、数据
2.1.1 60秒旋转译码驱动原理
按常规传统设计,需60进制译码驱动电路才能实现60秒旋转译码驱动,若用六片十进制计数译码器构成六十进制计数译码电路,则电路连线多(需要120根连线),硬件电路庞大,开销大。为此,本文巧妙地采用了两片CD4017进行六十进制计数译码,实现60秒旋转译码驱动。既减少了电路的复杂程度又可降低了成本。图3为CD4017功能引脚图和工作时序图。

CD4017集成电路是十进制计数/时序译码器,共有10个译码输出Q0~Q9;每个译码输出通常处于低电平,且在时钟脉冲由低到高的上升沿输出高电平;每个高电平输出维持1个时钟周期;每输入10个时钟脉冲,输出一个进位脉冲,因此进位输出信号可作为下一级计数器的时钟信号。在清零输入端(R)加高电平或正脉冲时,只有输出端Q0为高电平,其余各输出端均为低电平“0”。
为实现对发光二极管的驱动,将每一个译码输出端口接一只发光二极管,并将二极管串联限流电阻后接地。当译码端口Q0~Q9中任一端口为高电平,则对应的发光二极管点亮,如图4(左)所示。根据CD4017的功能,可发现其10个输出的高电平是相互排斥的,即任一时刻只有一只发光二极管点亮,因此可电路进一步简化为如图4(右)所示,从而简化电路设计。

在本电子钟设计中,每秒点亮一个发光二极管,循环点亮一周共需60个发光二极管,若用上述的6片CD4017实现驱动,显然电路复杂。为此我们选用两片CD4017和一片6反相器,采用“纵横双译码”技术,巧妙地实现60秒旋转译码驱动,其中一片接成10进制,一片接成6进制,实现6×10=60的功能,具体连接方法如图5所示。

将周期为1秒的输入脉冲作为其中一片CD4017的时钟脉冲,而此片的级联进位输出端(QC)作为另一片的时钟输入,并将Q6与复位端相连。在两片译码输出端交叉点上接入发光二极管,构成6×10矩阵。根据CD4017时序特点,在初始状态,作为高位(纵)的CD4017译码器输出端口Q0处于高平,经反相器反相后为低电平。当作为低位(横)的CD4017译码器输出端口Q0~Q9依次输出高电平后,则对应的二极管LD1~LD10依次点亮;此后由于QC端的进位,高位CD4017译码输出端口Q1输出高电平,反相后输出低电平,当低位的CD4017译码输出端口Q0~Q9依次输出高电平后,二极管LD11~LD20依次点亮。如此往复,直至高位Q6向复位端输入高电平,CD4017复位,60秒循环点亮重新开始。
2.1.2 时分显示部件
由于系统要显示的内容较简单,显示量不多,所以选用数码管既方便又经济。LED有共阴极和共阳极两种。二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻,如图6所示。

众所周知,LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。所谓软件译码,即由单片机软件完成从数字到显示码的转换。从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。各段码位与显示段的对应关系如表1。
表1 各段码位的对应关系

注:(1)本表所列各字符的显示段码均为小数点不亮的情况。
   (2)“空白”字符即没有任何显示。
根据AT89C2051单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管。将AT89C2051的P1.0~P1.7分别与共阳数码管的a~g及dp相连,高电平的位对应的LED数码管的段暗,低电平的位对应的LED数码管的段亮,这样,当P0口输出不同的段码,就可以控制数码管显示不同的字符。如:当P0口输出的段码为1100 0000,数码管显示的字符为0。
数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式。为节省端口及降低功耗,本系统采用动态扫描显示方式。动态扫描显示方式需解决多位LED数码管的“段控”和“位控”问题,本电路的“段控”(即要显示的段码的控制)通过P0口实现;而每一位的公共端,即LED数码管的“位控”,则由P3口控制。这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。在这一瞬时,只有这一位在显示,其他几位则暗。在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开关”状态。
系统的时分显示部件由47段共阳LED数码管构成,前两只用于时的显示,后两只用于分的显示。值得一提的是,在设计中需要实现时与分之间的两个闪烁点,为此,将第三只LED数码管倒置摆放,这样就形成了两个很自然的闪烁点。与此同时,为了能使两点显示能够形象的表示时钟“秒”的变化,设计时,将两个点由P1.7单独控制,每隔一秒使P1.7发送一个正脉冲,从而实现了两个点的闪烁显示,闪烁周期为一秒。
2.2 系统程序的设计
本系统的软件系统主要可分为主程序和定时器中断程序两大模块。在程序过程中,加入了抗干扰措施。下面对部分模块作介绍。
2.1.1 系统主程序设计
主程序的功能是完成系统的初始化,在显示时间之前,对系统是否停电状态进行检测;若停电,将系统进入低功耗状态,用电池电压维持单片机计时工作,但此时不显示时间,用节省用电;若不停电,则将时分发送显示。程序流程如图7所示。
2.2.2 中断程序设计
中断程序(如图8所示)完成时间计数,时间调整,误差消除等功能。中断采用AT89C2051内部T0中断实现,定时时间为125ms,当时间到达125ms×8,1分钟时,分计数缓冲器MINBUFFER增加1,到达1小时,则时计数缓冲器HOURBUFFER增加1,并将分、时的个位、十位放入显示缓冲器。当分计数缓冲器和时计数缓冲器分别到达60min24h时,则对它们清零,以便从新计数。在中断设计中,还通过软件实现了累计误差消除功能,使整个系统时间的精确度得到保证。

3 结束语
上述电子钟,无论在外观上还是功能上都实现了较为完善的设计。特别值得一提的是本系统在精度上的设计,突破传统的方法,对可能产生的积累误差采用“抵消法”,从而有效地降低了时间误差。
由于计数时产生的积累误差所导致的时间误差,是所有的电子计时系统共同存在的问题。但在目前市场上的电子时钟产品,如计算机中的时钟,手机中的时钟等并没有有效的采取消除误差的措施。本系统设计的消除积累误差来减少时间误差的软件方法,并不需要任何的硬件,因此在不增加成本的情况下,可以普遍用于所有的电子时钟产品。



附录主要程序清单
  1. ALARMHBUFF2  EQU 77H             ;闹铃时间的时十位计时绶冲
  2.         ALARMHBUFF1  EQU 76H             ;闹铃时间的时个位计时绶冲
  3.         ALARMMBUFF2  EQU 75H             ;闹铃时间的分十位计时绶冲
  4.         ALARMMBUFF1  EQU 74H             ;闹铃时间的分个位计时绶冲
  5.         HBUFF2       EQU 73H             ;时十位计时绶冲
  6.         HBUFF1       EQU 72H             ;时个位计时绶冲
  7.         MBUFF2       EQU 71H             ;分十位计时绶冲
  8.         MBUFF1       EQU 70H             ;分个位计时绶冲
  9.         DP           EQU 6FH             ;控制数码管点的亮暗
  10.         NUM          EQU 78H   ;前四秒还是后四秒计数
  11.         SBUFF        EQU 79H   ;秒十进制计时绶冲(低四位对应个位,高四位对应十位)
  12.         MBUFF        EQU 7AH            ;分十进制计时绶冲
  13.         HBUFF        EQU 7BH            ;时十进制计时绶冲
  14.         ALARMMBUFF   EQU 7CH           ;闹铃时间的分十进制计时绶冲
  15.         ALARMHBUFF   EQU  7DH           ;闹铃时间的时十进制计时绶冲
  16.         NUMT1   EQU  67H;用于控制时间调整时按键p3.2一次按下时,计数器T1中断的次数
  17.         NUMT2   EQU  68H;用于控制时间调整时按键p3.3一次按下时,计数器T1中断的次数
  18.         KEYNUMT1     EQU 69H         ;用于存储NUMT1已经计数到第几个半秒
  19.         KEYNUMT2     EQU 6AH         ;用于存储NUMT1已经计数到第几个半秒
  20.         STOREKEYNUMT2  EQU 6BH   ;用于存储当前KEYNUMT1的值,以和下次做比较,看是否有变化
  21.         STOREKEYNUMT1  EQU 6CH     ;用于存储当前KEYNUMT2的值,以和下次做比较,看是否有变化
  22.         ORG   0000H
  23.         AJMP  START
  24.         ORG   000BH
  25.         MOV   TH0 ,  #0BH    ;设置计数初值,R4用来存储低位的初值
  26.         MOV   TL0 , R4
  27.         AJMP  INTERT0
  28.         ORG   001BH
  29.         AJMP  INTERT1
  30.         ORG   0040H
  31. START:  MOV   NUMT1 , #00H
  32.         MOV   NUMT2 , #00H
  33.         MOV   KEYNUMT1 , #00H
  34.         MOV   KEYNUMT2 , #00H
  35.         MOV   STOREKEYNUMT2   , #00H
  36.         MOV   STOREKEYNUMT1   , #00H
  37.         MOV   NUM , #8
  38.         MOV   DPTR ,  #TAB
  39.         MOV   ALARMHBUFF , #18H       ;置闹铃时间初始值为18:55
  40.         MOV   ALARMMBUFF , #55H
  41.         MOV   ALARMHBUFF2, #01H
  42.         MOV   ALARMHBUFF1, #08H
  43.         MOV   ALARMMBUFF2 , #05H
  44.         MOV   ALARMMBUFF1 , #05H
  45.         MOV   HBUFF2, #01H            ;置闹钟时间为18:53
  46.         MOV   HBUFF1, #08H
  47.         MOV   MBUFF2 , #05H
  48.         MOV   MBUFF1 , #03H
  49.         MOV   HBUFF ,  #18H
  50.         MOV   MBUFF ,  #53H
  51.         MOV   SBUFF ,  #3CH            ;置初始秒为60,计时时减
  52.         MOV   TCON ,  #05H             ;下降沿触发
  53.         MOV   TMOD ,  #11H        ;初始化定时器,T0,T1  16位计时
  54.         MOV   TH0 ,  #0BH         ;设置计数初值,125ms计时
  55.         MOV   TL0 ,  #0DBH
  56.         MOV   TH1 , #3CH     ;T1置初值,进行100ms计时,用于调整时间
  57.         MOV   TL1 , #0B0H
  58.         MOV   IE , #82H       ;开T0中断
  59.         SETB  PT0             ;T0中断优先级最高
  60.         SETB  TR0            ;允许T0计数
  61.         SETB   P3.2
  62.         SETB   P3.3
  63. START1:MOV    A , HBUFF     ; 显示时,7点以前及21点以后亮度调暗
  64.         SUBB  A , #7H
  65.         JC     START2
  66.         MOV   A , HBUFF
  67.         SUBB   A, #21H
  68.         JNC   START2
  69.         ACALL DISPLAY
  70.         ACALL ZDBS
  71.         AJMP  START3
  72. START2:ACALL   NIGHTDISPLAY
  73. START3:MOV   A ,ALARMHBUFF             ;检测是否是定闹时间
  74.         CJNE A , HBUFF , START4
  75.         MOV  A , ALARMMBUFF
  76.         CJNE A , MBUFF ,START4
  77.         MOV  C, DP                 ;若是定闹时间,则利用dp的值来决定蜂鸣
  78.         MOV  P3.2, C
  79.         MOV  A , SBUFF
  80.         JNZ   START1               ;若还没到1分钟,则继续蜂鸣
  81.         SETB  P3.2
  82. START4:JNB    P3.2,ADJUSTTIME1     ;循环等待中断,并检测是否键按下,若是,则进入相应程序
  83.         JNB   P3.3,ADJUSTTIME2
  84.         AJMP  START1
  85.         AJMP  START1
  86.       ;****************
  87.       ;*int0中断子程序*
  88.       ;****************
  89. ADJUSTTIME1:NOP
  90.         MOV   KEYNUMT1  ,#00H
  91.         MOV   TH1 , #3CH                       ;T1置初值,进行100ms计时,用于调整时间
  92.         MOV   TL1 , #0B0H
  93.         SETB  ET1                              ;开T1中断
  94.         SETB  PT1                              ;设T1中断优先级最高
  95.         SETB  TR1                              ;允许T1计时
  96.         MOV   STOREKEYNUMT1 , KEYNUMT1        ;存储当前次KEYNUMT1的值
  97. TIME1_1:ACALL  DISPLAY
  98.         MOV   A , KEYNUMT1
  99.         CJNE  A , STOREKEYNUMT1,TIME1_2   ;若当前KEYNUMT1的值与上一次的值不等,则时间加1分,否则继续循环,等等至半分钟
  100.         AJMP  TIME1_3
  101. TIME1_2:MOV    STOREKEYNUMT1 , KEYNUMT1   ;加1后存储当前的KEYNUMT1的值
  102.         ACALL ADDBUFF0                   ;分加1
  103. TIME1_3:JNB    P3.2,TIME1_1        ;若p3.2已关,则退出增时,否则继续循环
  104.         CLR   ET1
  105.         CLR   PT1
  106.         CLR   TR1
  107.         AJMP  START1
  108. ;********************
  109. ;*****时间增1分******
  110. ;********************
  111. ADDBUFF0:MOV   A , MBUFF         ; 若按键小于1s,则分增1
  112.         ADD   A , #1
  113.         DA    A
  114.         MOV   MBUFF , A
  115.         ANL   A , #0FH
  116.         MOV   MBUFF1 , A
  117.         MOV   A , MBUFF
  118.         SWAP  A
  119.         ANL   A , #0FH
  120.         MOV   MBUFF2 , A
  121.         MOV   A ,  MBUFF
  122.         CJNE  A , #60H ,  ADDBUFF1
  123.         MOV   MBUFF , #00H
  124.         MOV   MBUFF2 , #00H
  125.         MOV   MBUFF1 , #00H
  126.         MOV   A , HBUFF                      ;时增1
  127.         ADD   A , #1
  128.         DA    A
  129.         MOV   HBUFF , A
  130.         ANL   A , #0FH
  131.         MOV   HBUFF1 , A
  132.         MOV   A , HBUFF
  133.         SWAP  A
  134.         ANL   A , #0FH
  135.         MOV   HBUFF2 , A
  136.         MOV   A , HBUFF
  137.         CJNE  A , #24H , ADDBUFF1     ;若没到24小时,则不必初值置0
  138.         MOV   HBUFF , #00H
  139.         MOV   HBUFF2 , #00H
  140.         MOV   HBUFF1 , #00H
  141. ADDBUFF1:RET
  142. ;*********************************
  143. ;*int1中断子程序******************
  144. ;*********************************     
  145.       
  146. ADJUSTTIME2:NOP
  147.         ACALL DL100MS
  148.         MOV   C , P3.3
  149.         JC    TIME2_6            ;如果(P3.3按键<100ms以上)  则不做处理
  150.         MOV   KEYNUMT2 , #00H    ;否则进入定闹设置
  151.         MOV   STOREKEYNUMT2 , KEYNUMT2   ;记录当前NUMT2的数据,以看下次有没改变
  152. TIME2_1:NOP
  153.        MOV    TH1 , #3CH        ;T1置初值,进行100ms计时,用于调整时间
  154.         MOV   TL1 , #0B0H
  155.         SETB  ET1               ;开T1中断
  156.         SETB  PT1               ;设T1中断优先级最高
  157.         SETB  TR1               ;允许T1计时
  158. TIME2_2:ACALL  ALARMDISPLAY
  159.         MOV   A , KEYNUMT2
  160.         CJNE  A , STOREKEYNUMT2 ,TIME2_3
  161.         AJMP  TIME2_4
  162. TIME2_3:MOV    STOREKEYNUMT2 , KEYNUMT2
  163.         MOV   A , ALARMMBUFF              ; 若按键小于1s,则分增1
  164.         ADD   A , #1
  165.         DA    A
  166.         MOV   ALARMMBUFF , A
  167.         ANL   A , #0FH
  168.         MOV   ALARMMBUFF1 , A
  169.         MOV   A , ALARMMBUFF
  170.         SWAP  A
  171.         ANL   A , #0FH
  172.         MOV   ALARMMBUFF2 , A
  173.         MOV   A ,  ALARMMBUFF
  174.         CJNE  A , #60H ,  TIME2_4
  175.         MOV   ALARMMBUFF , #00H
  176.         MOV   ALARMMBUFF2 , #00H
  177.         MOV   ALARMMBUFF1 , #00H
  178.         MOV   A , ALARMHBUFF                        ;时增1
  179.         ADD   A , #1
  180.         DA    A
  181.         MOV   ALARMHBUFF , A
  182.         ANL   A , #0FH
  183.         MOV   ALARMHBUFF1 , A
  184.         MOV   A , ALARMHBUFF
  185.         SWAP  A
  186.         ANL   A , #0FH
  187.         MOV   ALARMHBUFF2 , A
  188.         MOV   A , ALARMHBUFF
  189.         CJNE  A , #24H , TIME2_4      ;若没到24小时,则初值不必置0
  190.         MOV   ALARMHBUFF , #00H
  191.         MOV   ALARMHBUFF2 , #00H
  192.         MOV   ALARMHBUFF1 , #00H
  193. TIME2_4:NOP
  194.         JNB   P3.3,TIME2_2             ;若按键已经未按,则退出循环
  195.         CLR   ET1
  196.         CLR   TR1
  197.         MOV   KEYNUMT2 , #00H
  198.         MOV   NUMT2 , #00H
  199.         MOV   R2 , #10             ; 直到p3.3  20s钟内都是未按,此时复原数据,即退出设置
  200. TIME2_7:MOV    R1 , #200                          
  201. TIME2_5:ACALL  ALARMDISPLAY
  202.         ACALL DL1MS
  203.         JNB   P3.3 , TIME2_1
  204.         DJNZ  R1 , TIME2_5
  205.         DJNZ  R2 , TIME2_7
  206. TIME2_6:CLR   ET1
  207.         CLR   PT1
  208.         CLR   TR1
  209.         LJMP  START1
  210. ;***********************************
  211. ;**T1中断子程序*********************
  212. ;***********************************
  213. INTERT1:NOP
  214.         MOV   TH1 , #3CH      ;T1置初值,进行100ms计时,用于调整时间
  215.         MOV   TL1 , #0B0H
  216.         PUSH  ACC
  217.         PUSH  PSW
  218.         CLR   ET0
  219.         CLR   ET1              ;关T1中断
  220.         MOV   A , NUMT1
  221.         INC   A
  222.         MOV   NUMT1 , A        ;中断一次则相应的增加NUMT1
  223.         CJNE  A , #5 ,  INTERT1NEXT     ;每中断五次,即半秒,都增加KEYNUMT1
  224.         MOV   A ,KEYNUMT1
  225.         INC   A
  226.         MOV   KEYNUMT1 , A
  227.         MOV   NUMT1 , #00H       ;NUMT1已经是5了,则处理过KEYNUMT1后,重置NUMT1
  228. INTERT1NEXT:NOP
  229.         MOV   A , NUMT2          ;中断一次则相应的增加NUMT1
  230.         INC   A
  231.         MOV   NUMT2 , A
  232.         CJNE  A, #5,ENDINTERT1   ;每中断五次,即半秒,都增加KEYNUMT1
  233.         MOV   A ,   KEYNUMT2
  234.         INC   A
  235.         MOV   KEYNUMT2 , A
  236.         MOV   NUMT2 , #00H       ;NUMT1已经是5了,则处理过KEYNUMT1后,重置NUMT1
  237. ENDINTERT1:SETB   ET1
  238.         SETB  ET0
  239.         POP   ACC
  240.         POP   PSW
  241.         RETI
  242.      ;**************
  243.      ;** 整点报时**
  244.      ;**************
  245. ZDBS:   MOV   A , MBUFF                  ;在整点时,响半秒
  246.         JNZ   ZDBSEND
  247.         MOV   A , SBUFF
  248.         CJNE  A , #3CH , ZDBSEND
  249.         CLR   P3.2
  250.         ACALL DL0FIVE
  251.         SETB  P3.2
  252. ZDBSEND:RET
  253.      ;**************
  254.      ;**定闹显示子程序**
  255.      ;**************
  256. ALARMDISPLAY:MOV  P1 ,#0FFH                   ;使时的十位亮
  257.         MOV   A , ALARMHBUFF2
  258.         MOVC  A ,  @A+DPTR
  259.         SETB  ACC.7
  260.         MOV   P1 ,  A
  261.         CLR   P3.0
  262.         ACALL DL1MS
  263.         SETB  P3.0
  264.         MOV   A , ALARMHBUFF1               ;使时的个位亮
  265.         MOVC  A ,  @A+DPTR
  266.         MOV   C ,  DP
  267.         MOV   ACC.7 ,  C
  268.         MOV   P1 ,  A
  269.         CLR   P3.1
  270.         ACALL DL1MS
  271.         SETB  P3.1
  272.         MOV   A ,ALARMMBUFF2              ;使分的十位亮
  273.         MOVC  A ,  @A+DPTR
  274.         MOV   C ,  DP
  275.         MOV   ACC.7 ,  C
  276.         MOV   P1 ,  A
  277.         CLR   P3.4
  278.         ACALL DL1MS
  279.         SETB  P3.4
  280.         MOV   A , ALARMMBUFF1       ;使时的个位亮
  281.         MOVC  A ,  @A+DPTR
  282.         SETB  ACC.7
  283.         MOV   P1,A
  284.         CLR   P3.5
  285.         ACALL DL1MS
  286.         SETB  P3.5
  287.         RET
  288. ;********************************
  289. ;**晚上显示子程序****************
  290. ;********************************    ;降低显示的占空比,数码管进入节能
  291. NIGHTDISPLAY:  NOP
  292.         MOV   P1 ,#0FFH
  293.         MOV   A , HBUFF2
  294.         MOVC  A ,  @A+DPTR
  295.         SETB  ACC.7
  296.         MOV   P1 ,  A
  297.         CLR   P3.0
  298.         ACALL DL1MS                 ;亮1ms
  299.         SETB  P3.0
  300.         ACALL DL1MS
  301.         ACALL DL1MS                 ;暗2ms
  302.         MOV   A , HBUFF1
  303.         MOVC   A , @A+DPTR
  304.         MOV   C ,  DP
  305.         MOV   ACC.7 ,  C
  306.         MOV   P1 ,  A
  307.         CLR   P3.1
  308.         ACALL DL1MS
  309.         SETB  P3.1
  310.         ACALL DL1MS
  311.         ACALL DL1MS
  312.         MOV   A ,MBUFF2
  313.         MOVC  A ,  @A+DPTR
  314.         MOV   C ,  DP
  315.         MOV   ACC.7 ,  C
  316.         MOV   P1 ,  A
  317.         CLR   P3.4
  318.         ACALL DL1MS
  319.         SETB  P3.4
  320.         ACALL DL1MS
  321.         ACALL DL1MS
  322.         MOV   A , MBUFF1
  323.         MOVC  A ,  @A+DPTR
  324.         SETB  ACC.7
  325.         MOV   P1,A
  326.         CLR   P3.5
  327.         ACALL DL1MS
  328.         SETB  P3.5
  329.         ACALL DL1MS
  330.         ACALL DL1MS
  331.         RET
  332.      ;**************
  333.      ;**显示子程序**
  334.      ;**************
  335. DISPLAY:MOV   P1 ,#0FFH
  336.         MOV   A , HBUFF2
  337.         MOVC  A ,  @A+DPTR
  338.         SETB  ACC.7
  339.         MOV   P1 ,  A
  340.         CLR   P3.0
  341.         ACALL DL1MS
  342.         SETB  P3.0
  343.         MOV   A , HBUFF1
  344.         MOVC  A ,  @A+DPTR
  345.         MOV   C ,  DP
  346.         MOV   ACC.7 ,  C
  347.         MOV   P1 ,  A
  348.         CLR   P3.1
  349.         ACALL DL1MS
  350.         SETB  P3.1
  351.         MOV   A ,MBUFF2
  352.         MOVC  A ,  @A+DPTR
  353.         MOV   C ,  DP
  354.         MOV   ACC.7 ,  C
  355.         MOV   P1 ,  A
  356.         CLR   P3.4
  357.         ACALL DL1MS
  358.         SETB  P3.4
  359.         MOV   A , MBUFF1
  360.         MOVC  A ,  @A+DPTR
  361.         SETB  ACC.7
  362.         MOV   P1,A
  363.         CLR   P3.5
  364.         ACALL DL1MS
  365.         SETB  P3.5
  366.         RET
  367. TAB:    DB 88H,0BBH,94H,91H,0A3H ; 0 1 2 3 4
  368.         DB 0C1H,0C0H,9BH,80H,81H ; 5 6 7 8 9
  369.      ;**************
  370.      ;***延时程序***
  371.      ;**************
  372. DL1MS:  MOV   R6 ,  #20                  ;延时1ms
  373. DL11:   MOV   R7 ,  #25
  374. DL12:   DJNZ  R7 ,  DL12
  375.         DJNZ  R6 ,  DL11
  376.         RET
  377. DL100MS:MOV    R6 , #200                 ;延时100ms
  378. DL100MS1:MOV   R7 , #250
  379. DL100MS2:DJNZ  R7 , DL100MS2
  380.          DJNZ R6 ,  DL100MS1
  381.          RET
  382. DL11S:  MOV   R5 , #10
  383. DL1S0:  MOV   R6 ,  #200              ;延时1s   10*250*200
  384. DL1S1:  MOV   R7 ,  #250
  385. DL1S2:  DJNZ  R7 ,  DL1S2
  386.         DJNZ  R6 ,  DL1S1
  387.         DJNZ  R5 , DL1S0
  388.         RET
  389. DL0FIVE:MOV    R5 , #5
  390. DL0:    MOV   R6 ,  #100                          ;延时0.5s
  391. DL1:    MOV   R7 ,  #250
  392. DL2:    DJNZ  R7 ,  DL2
  393.         DJNZ  R6 ,  DL1
  394.         DJNZ  R5 , DL0
  395.         RET
  396.      ;**************
  397.      ;*T0中断子程序*
  398.      ;**************
  399. INTERT0:PUSH   ACC
  400.         PUSH  PSW
  401.         CLR   ET0                            ;关T0中断
  402.         MOV   A , SBUFF
  403.         CJNE  A ,#028H,  SET1
  404.         MOV   R4 , #0DCH                    ;后四十秒的初值
  405. SET1:  DJNZ  NUM , ENDINTT0               ;若还没到1s,则退出该次中断
  406.         MOV   NUM , #8                     ;设置NUM初值
  407.         CPL   DP
  408.         DJNZ  SBUFF , ENDINTT0             ; 若还没到60s,则退出该次中断
  409.         MOV   SBUFF , #03CH
  410.         MOV   R4 , #0DBH                   ;前20秒的初值
  411.         ACALL ADDBUFF0
  412. ENDINTT0:MOV    A , NUM
  413.         CJNE  A , #04H ,  ENDT0OUT         ;0.5秒的时候dp取反
  414.         CPL   DP
  415. ENDT0OUT:POP   PSW
  416.         POP   ACC
  417.         SETB  ET0
  418.         RETI
  419. END

复制代码


回复

使用道具 举报

ID:1 发表于 2019-6-1 03:08 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表