您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

带闹钟智能电子钟

[日期:2008-05-11 ] [来源:网络 作者:佚名] [字体: (投递新闻)
以一片AT89C2051单片机为主体,其显示数据从P3.0-P3.7口输出,P1口输出对应的六位位选信号。电子钟程序设计时使用了T0作为计时,T1为调整时显示用。只要对程序稍加更改,可以很容易的实现8路定时功能。
电子钟只用一个轻触式按键来完成所有的设置。为了使闹钟音量足够大,采用了PNP型三极管8550来驱动蜂鸣器,驱动电阻用1K的,蜂鸣器为5V小型蜂鸣器。若用NPN来驱动蜂鸣器音量要小一点。LED数码管位驱动用8850,电子钟采用自制的3A开关电源供电。如图1。供电效率高,可和7-24V的直流电源直接连接,电子钟工作电流20MA左右。
               图1  LM2576做的3A电源
电子钟功能
一、时间显示:
六位LED数码管显示时间,按24小时制分别显示“时时:分分:秒秒”,最小单位为秒。精确度5秒/月(与晶振有关,可加电容调整)。
二.走时调整:
长按按键0。5秒钟以上,可以进入闹钟和时间设置状态,按“闹钟分”、“闹钟时”、“走时分”、“走时时”的顺序进行设置。
设置方法为:
1、  走时和闹钟调整:
走时状态,长按按键0。5秒钟以上后松开按键,“闹钟分”以0。3秒的速度闪烁显示,再次按下按键不要松开,“闹钟分”会快速的从00到59之间变化,从而达到快速设定时间的目的。当显示到需要的时间时松开按键,会自动进入到设置“闹钟时”的状态,可以同样的方法设置“闹钟时”。当松开按键后此时有两种选择,一是长按按键退出闹钟设置状态,返回到正常走时;二是短按一下按键进入继续设置时间的状态。 设置方法相同。
注意:为了对只要设置闹钟时不影响电子钟的走时精确度,在设置闹钟的时候,秒钟位走时不停止,正常显示,但对闹钟设置无任何影响。在进入走时设置后自动把秒设置为00秒,以确保可以在设置后从00秒开始走时,有利于提高我们调时的准确性。
2、  闹钟开关设置:只要短按一下按键即可开启或关闭闹钟。
走时状态,短按一下按键可以查询闹钟时间,约显示两秒钟后,自动设置闹钟开关。其中00为闹钟关闭状态、01为闹钟开启状态。设置完毕自动退出。
注意:如果原来闹钟为开启状态则关闭闹钟,反之,开启闹钟。第一次通电工作时默认为闹钟开启。
硬件电路实现
电路如图2所示,因有秒钟位,末设置秒点闪烁,如果要秒位可在VCC与数码管的DP之间接一个1K电阻即可达到12:00显示的效果。
                                  图2  电子钟原理图
电路所用的元件较少,根据实际情况可以调整R8的阻值来改变数码管亮度。
本人所做的实物如图3、图4所示。
图3         实物图
图4        实物图
源程序
源程序如下:      ORG       0000H              ;程序开始入口
                  LJMP      START
                  ORG       0003H              ;外中断0中断程序入口
                  RETI
                  ORG       000BH              ;定时器T0中断程序入口
                  LJMP      INTT0              ;跳至INTTO执行
          ORG       0013H              ;外中断1中断程序入口
          RETI
          ORG       001BH              ;定时器T1中断程序入口
          LJMP      INTT1
          ORG       0023H              ;串行中断程序入口地址
                  RETI
;---------------主程序----------------------;
             START:MOV     R0,#70H             ;70给R0,清70-7FH显示内存
                   MOV     R7,#0FH
         CLEARDISP:MOV     @R0,#00H            ;0给R0中的数为地址的内存中存放(70H)
                   INC     R0
                   DJNZ    R7,CLEARDISP
                   MOV     78H,#2              ;默认时间为12:00,闹钟5:00
                   MOV     79H,#1
                   MOV     74H,#2              ;防止上电时数码管显示00小时
                   MOV     75H,#1
                   MOV     66H,#1              ;中断退出时66H为1时,分、时计时单元数据移入显存标志
                   MOV     68H,#1              ;上电默认闹钟开状态
                   MOV     7DH,#6              ;闹钟时十位
                   MOV     7CH,#3
                   MOV     69H,#0
                   MOV     7AH,#0AH            ;放入"熄灭符"数据
                   MOV     TMOD,#11H           ;设T0、T1为16位定时器
                   MOV     TL0,#0B0H           ;50MS定时初值(T0计时用)
                   MOV     TH0,#3CH
                   SETB    EA                  ;总中断开放
                   SETB    ET0                 ;允许T0中断
                   SETB    TR0                 ;T0定时器开始计时
                   MOV     R4,#14H             ;1秒定时用初值(50MS×20)
           START1:LCALL   DISPLAY             ;显示子程序
                   LCALL   BEEP                ;闹钟查询
                   JNB      P1.7,SETTIME        ;P1.7口为0时转时间调整程序
                   JMP     START1              ;P1.7口为1时跳回START1
;-----------------------时间闹钟调整系统--------------------------;
             NFLAG:MOV          A,68H           ;设置闹钟开关状态
                   CJNE         A,#1,BEE68
                   MOV          68H,#0
                   JMP          E6
             BEE68:MOV          68H,#1
                E6:MOV          66H,#8          ;中断退出66H不为1时分、时计时单元数据移入显存标志
                   MOV          72H,7BH
                   MOV          73H,7CH
                   MOV          74H,7DH
                   MOV          75H,7EH
                   LCALL        DDL
                   LCALL        DDL
                   MOV          72H,68H
                   MOV          73H,69H
                   MOV          74H,7AH
                   MOV          75H,7AH
                   LCALL        DDL
                   LCALL        DDL
                   MOV          66H,#1
                   LJMP       START1
           SETTIME:LCALL        DDL
                   JB             P1.7,NFLAG     ;键按下时间小于1秒,设置闹钟开关状态并查看闹钟时间,不关走时,确保准确,大于1秒调时
                   MOV          TL1,#0B0H      ;T1闪烁定时初值
                   MOV          TH1,#3CH
                   MOV          R2,#06H        ;进入调时状态,赋闪烁定时初值
                   MOV          66H,#8         ;调闹钟时保持走时,关闭时钟显示数据
                   SETB         ET1            ;允许T1中断
                   SETB         TR1            ;开启定时器T1
              SET1:LCALL        DISPLAY        ;调用显示,防止键按下无显示
                   JNB          P1.7,SET1      ;P1.7口为0等待键释放
                   MOV       R5,#00H        ;清设置类型闪烁标志
             SETN1:INC         R5             ;闹钟分调整
              SET5:LCALL        DISPLAY
                   JB             P1.7,SET5
            SEETN1:LCALL        DDL            ;有键按下大于1秒分时间连续加(0.5秒加1),小于1秒转调时状态
                   JB             P1.7,SET6      ;键释放查询,键释放自动转调时
                   MOV               R0,#7CH
                   LCALL      ADD1
                   MOV               A,R3
                   CLR          C
                   CJNE        A,#60H,HHN1
              HHN1:JC            SEETN1
                   LCALL      CLR0
                   JMP          SEETN1
              SET6:INC         R5             ;闹钟时调整
             SEET6:LCALL        DISPLAY
                   JB          P1.7,SEET6
           SEETNH1:LCALL        DDL
                   JB             P1.7,SETF
                   MOV          R0,#7EH
                   LCALL        ADD1
                   MOV          A,R3
                   CLR          C
                   CJNE        A,#24H,HOUU1
             HOUU1:JC           SEETNH1
                   LCALL      CLR0
                    JMP       SEETNH1
              SETF:LCALL        DISPLAY
                   JB             P1.7,SETF
                   LCALL        DDL
                   JNB          P1.7,SETOUT     ;短按调时,长按退出
                   CLR          ET0
                   CLR          TR0
                   MOV       70H,#00H        ;设定后的时间从00秒开始走时
                   MOV       71H,#00H
                   INC         R5
              SET3:LCALL        DISPLAY
                   JB             P1.7,SET3
             SETMM:LCALL        DDL
                   JB             P1.7,SET4
                   MOV               R0,#77H
                   LCALL      ADD1
                   MOV               A,R3
                   CLR          C
                   CJNE        A,#60H,MMH
               MMH:JC          SETMM
                   LCALL      CLR0
                   AJMP         SETMM
              SET4:INC          R5
             SEET4:LCALL        DISPLAY
                   JB          P1.7,SEET4
             SETHH:LCALL        DDL
                   JB             P1.7,SETOUT1
                   MOV          R0,#79H
                   LCALL        ADD1
                   MOV          A,R3
                   CLR          C
                   CJNE        A,#24H,HOUU
              HOUU:JC           SETHH
                   LCALL      CLR0
                   AJMP       SETHH
           SETOUT1:SETB     ET0
                   SETB       TR0             ;计时开始
            SETOUT:MOV     R5,#00H         ;清设置类型闪烁标志
                   CLR        TR1             ;关闭T1
                   CLR        ET1             ;关T1中断
                   MOV          66H,#1
           SETOUT2:LCALL        DISPLAY
                   JNB          P1.7,SETOUT2
                   LJMP        START1
;--------------------------延时1秒钟-----------------------;
               DDL:MOV          18H,#36
              DDL0:MOV          17H,#239
              DDL1:LCALL        DISPLAY
                   DJNZ         17H,DDL1
                   DJNZ         18H,DDL0
                   RET
;----------------------------T0中断程序------------------------;
            INTT0: PUSH  ACC                   ;打包
                   PUSH  PSW
                   CLR   ET0
                   CLR   TR0
                   MOV   A,#0B7H
                   ADD   A,TL0
                   MOV   TL0,A
                   MOV   A,#3CH
                   ADDC  A,TH0
                   MOV   TH0,A
                   SETB  TR0
                   DJNZ  R4, OUTT0             ;20次中断未到中断退出
           ADDSS:  MOV R4,#14H               ;20次中断到(1秒)重赋初值
                   MOV         R0,#71H               ;指向秒计时单元(70-71H)
                   ACALL ADD1                  ;调用加1程序(加1秒操作)
                   MOV   A,R3                  ;秒数据放入A(R3为2位十进制数组合)
                   CLR   C                     ;清进位标志
                   CJNE  A,#60H,ADDMM
           ADDMM:  JC         OUTT01                ;小于60秒退出
                   ACALL CLR0                  ;等于或大于60秒清0
                   MOV  R0,#77H               ;指向分计时单元(76H-77H)
                   ACALL ADD1
                   MOV         A,R3
                   CLR   C
                   CJNE  A,#60H,ADDHH
            ADDHH: JC     OUTT0
                   ACALL CLR0
                   MOV  R0,#79H               ;指向小时计时单元(78H-79H)
                   ACALL ADD1
                   MOV   A,R3
                   CLR   C
                   CJNE  A,#24H,HOUR
             HOUR: JC    OUTT0
                   ACALL CLR0
            OUTT0: MOV   A,66H                 ;查询标志
                   CJNE  A,#1,OUTT01
                   MOV   72H,76H               ;中断退出时将分、时计时单元数据移入对应显示单元
                   MOV   73H,77H
                   MOV   74H,78H
                   MOV   75H,79H
            OUTT01:POP  PSW                   ;出栈
                   POP   ACC
                   SETB  ET0                   ;开放T0
                   RETI                        ;中断返回
;---------------------------加1程序--------------------------;
             ADD1: MOV          A,@R0          ;取当前计时单元数据到A
                   DEC          R0             ;指向前一地址
                   SWAP         A              ;A中数据高四位与低四位交换
                   ORL           A,@R0          ;前一地址中数据放入A中低四位
                   ADD           A,#01H         ;A加1操作
                   DA             A              ;十进制调整
                   MOV          R3,A           ;移入R3寄存器
                   ANL           A,#0FH         ;高四位变0
                   MOV                @R0,A          ;放回前一地址单元
                   MOV          A,R3           ;取回R3中暂存数据
                   INC            R0             ;指向当前地址单元
                   SWAP         A              ;A中数据高四位与低四位交换
                   ANL           A,#0FH         ;高四位变0
                   MOV          @R0,A          ;数据放入当削地址单元中
                   RET
             CLR0: CLR          C
                   CLR          A              ;清累加器
                   MOV               @R0,A          ;清当前地址单元
                   DEC         R0             ;指向前一地址
                   MOV               @R0,A          ;前一地址单元清0
                   RET                         ;子程序返回
;-------------------------调时闪烁程序----------------------;
INTT1:          PUSH    ACC
                PUSH    PSW
                MOV     TL1,#0B0H
                MOV     TH1,#3CH
                DJNZ    R2,INTT1OUT                ;0.3秒未到退出中断(50MS中断6次)
                MOV     R2,#06H               ;重装0.3秒定时用初值
                CPL     02H                    ;0.3秒定时到对闪烁标志取反
                JB      02H,FLASH1             ;02H位为1时显示单元"熄灭"
                MOV     A,R5
                CJNE    A,#01H,NL
                JMP     NNN1
             NL:CJNE    A,#02H,NL1
                LJMP    NNN1
            NL1:CJNE    A,#03H,NL2
                LJMP    NLL
            NL2:CJNE    A,#04H,INTT1OUT
                LJMP    NLL
            NLL:MOV     72H,76H
                MOV     73H,77H
                MOV     74H,78H
                MOV     75H,79H
                AJMP    INTT1OUT
           NNN1:MOV     72H,7BH
                MOV     73H,7CH
                MOV     74H,7DH
                MOV     75H,7EH
       INTT1OUT:POP     PSW                       ;恢复现场
                POP     ACC
                RETI                         ;中断退出
         FLASH1:MOV     A,R5
                CJNE    A,#01H,ML
                LJMP    MNN1
             ML:CJNE    A,#02H,ML1
                LJMP    MNN2
            ML1:CJNE    A,#03H,MN
                LJMP    MLL
             MN:CJNE    A,#04H,INTT1OUT
                LJMP    MHL
            MLL:MOV     72H,7AH
                MOV     73H,7AH               ;显示单元(72-73H),将不显示分数据
                MOV     74H,78H
                MOV     75H,79H
                AJMP    INTT1OUT
            MHL:MOV     72H,76H
                MOV     73H,77H
                MOV     74H,7AH               ;显示单元(74-75H),小时数据将不显示
                MOV     75H,7AH
                AJMP    INTT1OUT
           MNN1:MOV     72H,7AH
                MOV     73H,7AH               ;显示单元(72-73H),将不显示闹钟分数据
                MOV     74H,7DH
                MOV     75H,7EH
                AJMP    INTT1OUT
           MNN2:MOV     72H,7BH
                MOV     73H,7CH
                MOV     74H,7AH
                MOV     75H,7AH               ;显示单元(74-75H),闹钟小时数据将不显示
                AJMP    INTT1OUT
;-------------------------显示-------------------------------;
 DISPLAY:MOV    DPTR,#DISDATA
         MOV    A,70H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.0
         NOP
         NOP
         NOP
         SETB   P1.0
         MOV    A,71H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.1
         NOP
         NOP
         NOP
         SETB   P1.1
         MOV    A,72H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.2
         NOP
         NOP
         NOP
         SETB   P1.2
         MOV    A,73H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.3
         NOP
         NOP
         NOP
         SETB   P1.3
         MOV    A,74H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.4
         NOP
         NOP
         NOP
         SETB   P1.4
         MOV    A,75H
         MOVC   A,@A+DPTR
         MOV    P3,A
         CLR    P1.5
         NOP
         NOP
         NOP
         SETB   P1.5
         RET
    BEEP:MOV   A,68H           ;查询标志
         CJNE  A,#1,BEERE
         MOV   A,78H           ;查询闹钟时个位
         CJNE  A,7DH,BEERE
         MOV   A,79H           ;查询闹钟时十位
         CJNE  A,7EH,BEERE
         MOV   A,76H           ;查询闹钟分个位
         CJNE  A,7BH,BEERE
         MOV   A,77H           ;查询闹钟分十位
         CJNE  A,7CH,BEERE
      BB:CLR   P1.6
         LCALL DDL
         SETB  P1.6
         LCALL DDL
         JNB   P1.7,BEERR
   BEERE:RET
   BEERR:SETB  P1.6
         MOV   68H,#0
         LCALL DISPLAY
         JNB   P1.7,BEERR
         JMP   BEERE
 DISDATA:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,40H,50H,0FFH   ;0123456789空白
       END
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告