赞助论坛
  • 16471阅读
  • 0回复

数码管时钟电路的设计 [复制链接]

楼层直达
liyan  
发帖
60
精华
0
金币
105
威望
1
贡献
4
好评
0
注册
2009-09-09
楼主    liyan 发表于: 2009-09-14 08:42:47 
[post] ;功能说明 数码管时钟电路的设计
      ORG   0000H     ;程序执行开始地址
      LJMP   START     ;跳到标号START执行
      ORG   0003H     ;外中断0中断程序入口
      RETI           ;外中断0中断返回
      ORG   000BH     ;定时器T0中断程序入口
      LJMP   INTT0       ;跳至INTT0执行
      ORG   0013H     ;外中断1程序入口
      RETI           ;外中断1中断返回
      ORG   001BH     ;定时器T1中断程序入口
      LJMP   INTT1     ;跳至INTT1执行
      ORG   0023H     ;串行中断程序入口地址
      RETI           ;串行中断程序返回
;主程序
START:   MOV   R0,#70H     ;清70H~7AH共11个内存单元
      MOV   R7,#0BH     ;
CLEARDISP: MOV   @R0,#00H
      INC   R0
      DJNZ   R7,CLEARDISP
      MOV   20H,#00H     ;清20H(标志用)
      MOV   7AH,#0AH     ;放入熄灭符数据
      MOV   TMOD,#11H   ;设T0,T1为16位定时器
      MOV   TL0,#0B0H   ;50MS定里初值(T0计时用)
      MOV   TH0,#3CH     ;50MS定里初值
      MOV   TL1,#0B0H   ;50MS定里初值(T1闪烁定时用)
      MOV   TH1,#3CH     ;50MS定里初值
      SETB   EA         ;总中断开放
      SETB   ET0       ;允许T0中断
      SETB   TR0       ;开启T0定时器
      MOV   R4,#14H     ;1S定时用初值(50MS*20)
START1: LCALL   DISPLAY     ;调用显示子程序
      JNB   P3.7,SETMM1   ;P3.7口为0转时间调整程序
      SJMP   START1     ;P3.7口为1时跳回START1
SETMM1: LJMP   SETMM       ;转到时间调整程序SETMM
;1S计时程序
;T0中断服务程序
INTT0:   PUSH   ACC       ;累加器入栈保护
      PUSH   PSW       ;状态字入栈保护
      CLR   ET0       ;关T0中断允许
      CLR   TR0       ;关闭定时器T0
      MOV   A,#0B7H     ;中断响应时间同步修正
      ADD   A,TL0       ;低8位初值修正
      MOV   TL0,A       ;重装初值(低8位修正值)
      MOV   A,#3CH     ;高8位初值修正
      ADDC   A,TH0       ;
      MOV   TH0,A       ;重装初值(高8位修正值)
      SETB   TR0       ;开启定时T0
      DJNZ   R4,OUTT0     ;20次中断未到中断退出
ADDSS:   MOV   R4,#14H     ;20次中断到(1S)重初值
      MOV   R0,#71H     ;指向秒计时单元(71H~72H)
      ACALL   ADD1       ;调用加1程序(加1S操作
      MOV     A,R3       ;秒数据放入A(R3为2位十进制数组合)
      CLR   C         ;清进位标志
      CJNE   A,#60H,ADDMM ;
ADDMM:   JC     OUTT0       ;小于60S时中断退出
      ACALL   CLR0       ;大于或等于60S时对秒计时单元清0
      MOV   R0,#77H     ;指向分计时单元(78H~79H)
      ACALL   ADD1       ;分计时单元加1MIN
      MOV   A,R3       ;分数据放入A
      CLR   C         ;清进位标志
      CJNE   A,#24H,HOUR   ;
ADDHH: JC     OUTT0       ;小于60MIN时中断退出
      ACALL   CLR0       ;大于或等于60MIN时分计时单元清0
      MOV   R0,#79H     ;指向小时计时单元(78H~79H
      ACALL   ADD1       ;小时计时单元加1H
      MOV   A,R3       ;时数据放入A
      CLR   C         ;清进位标志
      CJNE   A,#24H,HOUR ;
HOUR:   JC     OUTT0       ;小于24H小时计时单元清0
      ACALL   CLR0       ;大于或等于60MIN时分时单元清0
OUTT0:   MOV   72H,76H     ;中断退出时将分,时计时单元数据移
      MOV   73H,77H     ;人对应显示单元
      MOV   74H,78H     ;
      MOV   75H,79H     ;
      POP   PSW       ;恢复状态字(堆栈)
      POP   ACC       ;恢复累加器
      SETB   ET0       ;开放T0中断
      RETI             ;中断返回
;闪动调时程序
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:   PUSH   ACC       ;中断现场保护
      PUSH   PSW       ;
      MOV   TL1,#0B0H   ;装定时器T1定时初值
      MOV   TH1,#3CH     ;
      DJNZ   R2,INTT1OUT   ;0.3S未到退出中断(50MS中断6次)
      MOV   R2,#06H     ;重装0.3S定时到对闪烁标志取反
      CPL   02H       ;0.3S定时到对闪烁标志取反
      JB     02H,FLASH1   ;02H位为0时正常显示
      MOV   72H,76H
      MOV   73H,77H
      MOV   74H,78H     ;
      MOV   75H,79H     ;
INTT1OUT: POP   PSW       ;恢复现场
      POP   ACC       ;
      SETB   ET0       ;
      RETI             ;中断退出      
FLASH1: JB     01H,FLASH2   ;01H位为1时,转小时熄灭控制
      MOV   72H,7AH     ;01H位为0时,熄灭符数据放入分
      MOV   73H,7AH     ;显示单元(74H~73H)
      MOV   74H,78H     ;
      MOV   75H,79H     ;
      AJMP   INTT1OUT     ;转中断退出
FLASH2: MOV   72H,76H     ;01H位为1时,熄灭符数据放入分
      MOV   73H,77H     ;显示单元(74H~75H)小时数据将不显示
      MOV   74H,7AH     ;
      MOV   75H,7AH     ;      
      AJMP   INTT1OUT     ;转中断退出
;加1子程序
ADD1:   MOV   A,@R0       ;取当前计时单元数据到A
      DEC   R0         ;指向前一地址
      SWAP   A         ;A中数据高4位与低4位交换
      ORL   A,@R0       ;前一地址中数据放入A中低4位
      ADD   A,#01H     ;A加1操作
      DA     A         ;十进制调整
      MOV   R3,A       ;移人R3寄存器
      ANL   A,#0FH     ;移入R3寄存器
      MOV   @R0,A       ;放回前一地址单元
      MOV   A,R3       ;取回R3中暂存数所据      
      INC   R0         ;指向当前地址单元
      SWAP   A         ;A中数据高4位与低4位交换
      ANL   A,#0FH     ;高4位变0
      MOV   @R0,A       ;数据放入当削地址单元中
      RET             ;子程序返回
           
;清零程序
;对计时单元复零用
CLR0:   CLR   A         ;清累加器
      MOV   @R0,A       ;清当前地址单元
      DEC   R0         ;指向前一地址
      MOV   @R0,A       ;前一地址单元清0
      RET             ;子程序返回
;时钟调整程序      
;当调时按键按下时进入此程序
SETMM:   CLR   ET0         ;关定时器T0中断
      CLR   TR0         ;关闭定时器T0
      LCALL   DL1S       ;调用1S延时程序
      JB     P3.7,CLOSEDIS ;键按下时间小于1S关闭显示(省电)
      MOV   R2,#06H     ;进入调时状态,闪烁定时初值
      SETB   ET1         ;允许T1中断
      SETB   TR1         ;开启定时器T1
SET2:   JNB   P3.7,SET1     ;P3.7口为0(键未释放)等待
      SETB   00H         ;键释放,分调整闪烁标志置1
SET4:   JB     P3.7,SET3     ;等待键按GH
      LCALL   DL05S       ;有键按下,延时0.5S
      JNB   P3.7,SETHH   ;按下时间大于0.5S转调小时状态
      MOV   R0,#77H     ;按下时间小于0.5S加1MIN操作
      LCALL   ADD1       ;调用加1子程序
      MOV   A,R3       ;取调整单元数据
      CLR   C         ;清进位标志
      CJNE   A,#60H,HHH   ;调整单元数据与60比较
HHH:   JC     SET4       ;调整单元数据小于60转SET4循环
      LCALL   CLR0       ;调整单元数据大于或等于60时清0
      CLR     C         ;清进位标志
      AJMP   SET4       ;跳转到SET4循环
CLOSEDIS: SETB   ET0         ;省电(LED不显示)状态,开T0中断
      SETB   TR0         ;开启T0定时器(开时钟)
CLOSE:   JB   P3.7,CLOSE     ;省电(LED不显示)状态,开T0中断
      LCALL   DISPLAY       ;有键按下,调显示子程序延时消抖
      JB     P3.7,WAITH     ;是干拢返回CLOSE等待
WAITH:   JNB   P3.7,WAITH     ;等待键释放
      LJMP   START1       ;返回主程序(LED数据显示亮)
SETHH: CLR   00H         ;分闪烁标志清除(进入调小时状态)
SETHH1: JNB   P3.7,SET5     ;等待键释放
      SETB   01H         ;小时调整标志置1
SET6:   JB   P3.7,SET7     ;等待按键下
      LCALL DL05S       ;有键按下延时0.5S
      JNB   P3.7,SETOUT   ;按下时间大于0.5S退出时间调整
      MOV   R0,#79H       ;按下时间小于0.5S加1H操作
      LCALL ADD1         ;调加1子程序
      MOV   A,R3         ;
      CLR   C           ;
      CJNE   A,#24H,HOUU   ;计时单元数据与24比较
HOUU:   JC   SET6         ;小于24转SET6循环
      LCALL CLR0         ;大于或等于24时清0操作
      AJMP   SET6         ;跳转到SET6循环
SETOUT: JNB   P3.7,SETOUT1   ;调时退出程序,等待键释放
    LCALL DISPLAY       ;延时消抖
    JNB   P3.7,SETOUT   ;是抖动,返回SETOUT再等待
    CLR   01H         ;消调小时标志
    CLR   00H         ;清调分标志
    CLR   02H         ;清闪烁标志
    CLR   TR1         ;关闭定时器T1
    CLR   ET1         ;关定时器T1中断
    SETB   TR0         ;开启定时器T0
    SETB   ET0         ;开定时器T0中断(计时开始)
    LJMP   START1       ;跳回主程序
SET1:   LCALL DISPLAY       ;键释放等待时调用显示程序(调分)
      AJMP   SET2         ;防止键按下时无时钟显示
SET3:   LCALL DISPLAY       ;等待调分按键时时钟显示用
      AJMP   SET4         ;
SET5:   LCALL DISPLAY       ;键释放等待时调用显示程序(调小时)
      AJMP   SETHH1       ;防止键按下时无时钟显示
SET7:   LCALL DISPLAY       ;等待调小时按键时时钟显示用
      AJMP   SET6         ;
SETOUT1: LCALL DISPLAY       ;退出时钟调整时键释放等待
      AJMP   SETOUT       ;防止键按下时无时钟显示
;显示程序
;显示数据在70H~75H单元内,用六位LED共阳数码管显示,P1口输出码数据,P3口作
;扫描控制,每个LED数码管亮1MS时间再逐放循环
DISPLAY: MOV   R1,#70H       ;指向显示数据首址
      MOV   R5,#0FEH     ;扫描字放入A
PLAY:   MOV   A,R5         ;扫描字放入A
      MOV   P2,A         ;从P3口输出
      MOV   A,@R1       ;取显示数据到A
      MOV   DPTR,#TAB     ;取段码表地址
      MOVC   A,@A+DPTR     ;查显示数据对应段码
      MOV   P0,A         ;段码放入P1口
      LCALL DL1MS       ;显示1MS
      INC   R1         ;指向下一地址
      MOV   A,R5         ;扫描控制字放入A
      JNB   ACC.5,ENDOUT   ;一次显示结束,P3口复位
      RL   A           ;A中数据循环左移
      MOV   R5,A         ;放回R5内
      AJMP   PLAY         ;跳回PLAY循环
ENDOUT: SETB   P2.5         ;一次显示结束,P3口复位
      MOV   P0,#0FFH     ;P1口复位
      RET             ;子程序返回
TAB:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表 0, 1, 2,3,4,5,6,7,8,9,不亮
;延时程序
;1MS延时程序.LED显示程序
DL1MS:   MOV   R6,#14H
DL1:   MOV   R7,#19H
DL2:   DJNZ R7,DL2
      DJNZ R6,DL1
      RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: ACALL DISPLAY
      ACALL DISPLAY
      ACALL DISPLAY
      RET
;延时程序,用作按键时间的长短判断
DL1S:   LCALL DL05S
      LCALL DL05S
DL05S:   MOV R3,#20H     ;8MSX32=0.256S
DL05S1: LCALL DISPLAY  
      DJNZ   R3,DL05S1
      RET
      END[/post]
本帖最近评分记录: 1 条评分