找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1119|回复: 0
打印 上一主题 下一主题
收起左侧

求大神帮我看看这个单片机汇编程序为什么时钟不会走?

[复制链接]
跳转到指定楼层
楼主
ID:456856 发表于 2018-12-27 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有 大神帮我看一下这个程序里的时钟为什么不会走啊

;定义区
       ;18B20参数区
      FLAG1 BIT 00H          ; FLAG1:标志位,为"1"时表示检测到DS18B20
      TEMPER_NUM EQU 50H  ; TEMPER_NUM:保存读出的温度数据
      T_DISBF  EQU 37H    ;温度显示缓冲区 37H/38H
      SET_MIN  EQU 39H    ;39H
      SET_HOU  EQU 3AH    ;3BH
      TEMPER_L EQU 36H     ;温度的低位
      TEMPER_H EQU 35H     ;温度的高位
      TEMP EQU 34H          ;临时存放温度数据的单元
      SJGW EQU 30H          ;存放显示温度的个位数
      SJSW EQU 31H          ;存放显示温度的十位数
      GW BIT P2.1             ;个位显示片选开关
      SW BIT P2.0             ;十位显示片选开关
      DQ BIT P1.3             ; DQ:DS18B20的数据总线接脚
     
          ;计时参数区
      DIS_SEC EQU 40H   ;40,41H
      DIS_MIN EQU 42H    ;42,43H
      DIS_HOU EQU 44H    ;44,45H
      ;计时单元
          DIS_CNT   EQU 2EH
      SECOND  EQU 46H
      MINUT   EQU 47H
      HOUR    EQU 48H
      CNT50MS  EQU 49H
      CNT0_5S  EQU 4AH
      CNT_NUM  EQU 10   ;10x50MS=0.5S
      CNT_05   EQU 2    ;2x0.5=1S
       ; 计数初值  延时50MS,常数3CB0H
       TIMING_H  EQU 3CH
       TIMING_L  EQU 0B0H
           
           SEC_M EQU 41H          ;倒计时分钟
           DIS_BUF EQU 38H
           SECOND1 EQU 43H
                ;3CH加热时间
                ;3DH粉碎
                ;4CH温度十位
   
;PROGRAM
        ORG 0000H
        LJMP MAIN
        ORG 001BH
        LJMP PR_T0
                ORG 000BH
                JMP T0_INTR
                ORG 0003H
        LJMP PINT0
        ORG 0013H
        LJMP PINT1
                              
        ORG 0030H
MAIN:   MOV SP,#60H
        MOV R0,#30H
        MOV R2,#32
CLEAR:  MOV A,#00
        MOV @R0,#00
        INC R0
        DJNZ R2,CLEAR   ;缓冲区清0

                MOV DIS_CNT,A
        MOV TEMPER_NUM,A
        MOV TEMPER_L,#00
        MOV TEMPER_H,#00
        ACALL INIT_1820  ;18B20初始化
                MOV HOUR,#22H
                MOV MINUT,#11H
        MOV CNT50MS,#CNT_NUM
        MOV CNT0_5S,#CNT_05
        MOV TMOD,#01H
        MOV TH0,#TIMING_H
        MOV TL0,#TIMING_L
        SETB EA
        SETB ET0
        SETB TR0
                CLR IT0                                        ;外部中断
        CLR IT1
        MOV IE,#85H
        MOV IP,#00H
                //CLR P1
LOOP:      CALL SCAN_KEY
                     MOV A,R5
           CJNE A,#08H,C1                           ;按下键九跳转到时钟自动校正
           LJMP FUN_0
C1:         CJNE A,#00H,C2                           ;按下键一跳转到模式一
            LJMP  MOD1
C2:         CJNE A,#01H,C3                           ;按下键二跳转到模式二
            LJMP  MOD2
C3:                CJNE A,#02H,C4                           ;按下键三进入自定义加热、粉碎时间
            LJMP  JIAYI1
C4:         NOP
                   CALL TEMPER
           CALL DISPLY
           LJMP LOOP
;/////////////////////////////////
;键盘程序
SCAN_KEY:  MOV P2,#0EH
           MOV A,P2
           ANL A,#0EH
           XRL A,#0EH
           JZ NO_KEY
           ACALL DELAY
           MOV P2,#0EH
           MOV A,P2
           ANL A,#0EH
           XRL A,#0EH
           JZ NO_KEY
           MOV R2,#11011111B
SCAN:      MOV A,R2
           MOV P2,A
           MOV A,P2
           ANL A,#00001110B
           MOV R3,A
           CJNE A,#0EH,KEY_PRSD
           MOV A,R2
           RL A
           MOV R2,A
           XRL A,#11111110B
           JNZ SCAN
KEY_PRSD:  MOV A,R2
           ANL A,#11100000B
           ORL A,R3
           MOV R4,A
           MOV R5,#00H
           MOV DPTR,#KEY_TAB
CAL_VAL:   MOV A,R5
           MOVC A,@A+DPTR
           XRL A,R4
           JZ FIXED
           INC R5
           SJMP CAL_VAL
FIXED:     MOV A,P2
           ANL A,#0EH
           XRL A,#0EH
           JNZ FIXED
           ACALL DELAY
           MOV A,P2
           ANL A,#0EH
           XRL A,#0EH
           JNZ FIXED
                     RET                  
NO_KEY:    MOV R5,#0FFH
           RET
KEY_TAB:
DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH
;/////////////////////////////////
;设置时间
FUN_0:    MOV SET_MIN,47H;取时间  
          MOV SET_HOU,48H;   
LP3:      CALL  SCAN_KEY
          MOV A,R5
                  CJNE A,#01H,N1
                  LJMP MINP
N1:       CJNE A,#02H,N2
          LJMP HOUP
N2:       CJNE A,#03H,N3
          LJMP ENTER
N3:       CALL DIS_SET
                  MOV  A,DIS_CNT
                  JMP  LP3
                  
                  
        
      
MINP:     MOV A, SET_MIN;   分+1
          ADD A,#01
          DA A
          MOV SET_MIN,A
                  MOV 47H,A
          CJNE A,#60H, CONT1
          MOV SET_MIN,#0
CONT1:    CALL DIS_SET
          JMP  LP3
HOUP:     MOV A, SET_HOU;   时+1
          ADD A,#01
          DA A
          MOV SET_HOU,A
                  MOV  48H,A
          CJNE A,#24H, CONT2
          MOV SET_HOU,#0
CONT2:    CALL DIS_SET
          JMP  LP3
ENTER:    JMP  C3
;///////////////////////////
;工作模式1
MOD1:       MOV R0,#DIS_BUF                                   ;加热状态
            MOV R3,#08
                        CLR A                                                                                                                                 
CLRBUF:     MOV @R0,A
                        INC R0
            DJNZ R3,CLRBUF  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;自定义时间
                        MOV SECOND1,#20    ;溢出20次为1秒
                        MOV A,4CH
                        CJNE A,#02H,LIPPP
                    LJMP ALARMZC                        ;调用显示程序
LIPPP:      LJMP REDDO
XYB:        MOV R0,#DIS_BUF                                         ;粉碎时间
            MOV R3,#08
                        CLR A                                                                                                                                 
CLRBUF1:    MOV @R0,A
                        INC R0
            DJNZ R3,CLRBUF1  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化        ; T0初始化
                        SETB P3.5
                        CLR P3.4
                        CLR P3.7
                        CLR P3.6
                        MOV SEC_M,21H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                    LCALL REDDO1                        ;调用显示程序
XYB1:                MOV R0,#DIS_BUF                                        ;加热时间
            MOV R3,#08
                        CLR A
CLRBUF2:    MOV @R0,A
                        INC R0
            DJNZ R3,CLRBUF2  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                    LCALL REDDO2                        ;调用显示程序
XYB2:                MOV R0,#DIS_BUF                                   ;粉碎时间
            MOV R3,#08
                        CLR A
CLRBUF3:    MOV @R0,A
                        INC R0
            DJNZ R3,CLRBUF3  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化        ; T0初始化
                        SETB P3.5
                        CLR P3.4
                        CLR P3.7
                        CLR P3.6
                        MOV SEC_M,21H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                    LCALL REDDO3                ;调用显示程序
XYB3:      MOV R0,#DIS_BUF                                        ;加热时间
            MOV R3,#08
                        CLR A                                                                                                                                 
CLRBUF4:    MOV @R0,A
                        INC R0
            DJNZ R3,CLRBUF4  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                    LCALL REDDO4
XYB4:                CLR P3.4                                                  ;完成后声光报警
                           CLR P3.5
                        CLR P3.6
                        CLR P3.7
           LCALL ALARMZC
                   CALL DL10MS
                        LJMP LOOP
;///////////////////////////
;工作模式2
MOD2:      
            MOV R0,#DIS_BUF                                                  ;加热模式
            MOV R3,#08
                        CLR A                                                                                                                                 
CCLRBUF:     MOV @R0,A
                        INC R0
            DJNZ R3,CCLRBUF  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                   LCALL RREDDO                        ;调用显示程序
XXYB:       MOV R0,#DIS_BUF                                                         ;粉碎模式
            MOV R3,#08
                        CLR A                                                                                                                                 
CCLRBUF1:            MOV @R0,A
                        INC R0
            DJNZ R3,CCLRBUF1  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化        ; T0初始化
                        SETB P3.5
                        CLR P3.4
                        CLR P3.7
                        CLR P3.6
                        MOV SEC_M,21H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                    LCALL RREDDO1                        ;调用显示程序
XXYB1:                MOV R0,#DIS_BUF                                                          ;加热模式
            MOV R3,#08
                        CLR A
CCLRBUF2:   MOV @R0,A
                        INC R0
            DJNZ R3,CCLRBUF2  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                   LCALL RREDDO2                        ;调用显示程序
XXYB2:                MOV R0,#DIS_BUF                                                                ;粉碎模式
            MOV R3,#08
                        CLR A
CCLRBUF3:   MOV @R0,A
                        INC R0
            DJNZ R3,CCLRBUF3  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化        ; T0初始化
                        SETB P3.5
                        CLR P3.4
                        CLR P3.7
                        CLR P3.6
                        MOV SEC_M,21H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                   LCALL RREDDO3                ;调用显示程序
XXYB3:                                                                                                       ;加热模式
            MOV R0,#DIS_BUF
            MOV R3,#08
                        CLR A                                                                                                                                 
CCLRBUF4:     MOV @R0,A
                        INC R0
            DJNZ R3,CCLRBUF4  ; 淸显示缓冲区
                        ACALL INI_T0        ; T0初始化
                        SETB P3.7
                        CLR P3.6
                        CLR P3.5
                        CLR P3.4
                        MOV SEC_M,20H  ;分值
                        MOV SECOND1,#20    ;溢出20次为1秒  
                   LCALL RREDDO4
XXYB4:                CLR P3.4                                                                          ;完成后声光报警
                           CLR P3.5
                        CLR P3.6
                        CLR P3.7
           LCALL ALARMZC
                   CALL DL10MS
                        LJMP LOOP
///////////////
;TIAOJIE时间加一                                                                                ;自定义加热粉碎时间
JIAYI1: MOV 20H,#00H
        MOV 21H,#00H
JIA1:        LCALL  SCAN_KEY
                MOV A,R5
                CJNE A,#00H,O1
                INC 20H
                MOV A,20H                  
                MOV R2,#00H
                LCALL DISSS
                CJNE A,#09H,JIA1
                LJMP JNINE
O1:     CJNE A,#01H,O2
        INC 21H
                MOV A,21H                  
                MOV R2,#01H
                LCALL DISSS
                CJNE A,#09H,JIA1
                LJMP JNINE1
O2:     CJNE A,#02H,JIA1
        LJMP LOOP
JNINE:SUBB A,#09H
      MOV 20H,A
      LJMP JIA1
JNINE1:SUBB A,#09H
      MOV 21H,A
      LJMP JIA1
///////////////////////////////
;显示子程序
;显示缓冲区地址:(R0)
;位控(R2)
DIS:     MOV DPTR, #SEG_TAB
         MOV A,@R0
         MOVC A,@A+DPTR
         MOV P0,A    ;输出
         NOP
         NOP
         MOV A,R2
         MOV P1,A                                ;片选
         NOP
         NOP
         RET
DL10MS:  MOV R5,#10
DL1:     MOV R6,#20
DL:      NOP
         NOP
         NOP
         DJNZ R6,DL
         DJNZ R5,DL1
         RET
SEG_TAB: DB     3FH ;0
         DB     06H ;1
         DB     5BH ;2
         DB       4FH ;3
         DB       66H ;4
         DB       6DH ;5
         DB       7DH ;6
         DB       07H ;7
         DB       7FH ;8
         DB       6FH ;9
         DB       77H ;A
         DB       7CH ;B
         DB       39H;C
               
         DB       00H ;BLANK
;//////////////////////////////
;  BCD分离子程序
;  待转换的数放在(R2)中
;  转换结果放在(R0)指出的单元中
BCDS:  MOV A, R2
       ANL A,#00001111B
       MOV @R0,A
       INC R0
       MOV A,R2
       ANL A,#11110000B
       SWAP A
       MOV @R0,A
       RET
;////////display///////////////
DISPLY: ;MOV R2, SECOND;  取秒值
        ;MOV R0, #DIS_SEC
        ;CALL BCDS
        MOV R2, MINUT;  取分值
        MOV R0, #DIS_MIN
        CALL BCDS
        MOV R2, HOUR;  取时值
        MOV R0, #DIS_HOU
        CALL BCDS
                MOV R2,TEMPER_NUM;  取温度值
        MOV R0,#T_DISBF
        CALL BCDS
        MOV R0,#T_DISBF
        MOV R2,#11111101B   ;温度个位
        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#11111100B   ;温度十位
        CALL DIS
        CALL DL10MS
        
        MOV R0,#DIS_MIN
        ;MOV R2,#00100000B   ;秒个位
        ;CALL DIS
        ;CALL DL10MS
        ;INC R0
        ;MOV R2,#00010000B   ;秒十位
        ;CALL DIS
        ;CALL DL10MS
        ;INC R0
        MOV R2,#11111011B   ;分个位
        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#11111010B   ;分十位
        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#11111001B   ;时个位
        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#11111000B   ;时十位
        CALL DIS
        CALL DL10MS
        RET
;//////////////////////////////////         0
TEMPER: ACALL RE_CONFIG
      ACALL GET_TEMPER
      CAll TEMPER_COV
      RET
;初始化程序
INIT_1820: SETB DQ
       NOP
       CLR DQ       ;主机发出延时540us的复位低脉冲
       MOV R0,#36
       LCALL DELAY
       SETB DQ      ;然后拉高数据线
       NOP
       NOP
       MOV R0,#36
TSR2: JNB DQ,TSR3     ;等待DS18B20的回应
       DJNZ R0,TSR2
       LJMP TSR4;     延时
TSR3: SETB FLAG1;     置标志位,表示DS1820存在
      LJMP TSR5
TSR4: CLR FLAG1;      清标志位,表示DS1820不存在
      LJMP BBQ
TSR5: MOV R0,#06BH;   200us
TSR6: DJNZ R0,TSR6;    复位成功!时序要求延时一段时间
BBQ: SETB DQ
          RET
/////////////////////////////////////////////; 重新写DS18B20暂存存储器设定值
RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1
           RET
RE_CONFIG1:MOV A,#0CCH;  发SKIP ROM命令
           LCALL WRITE_1820
           MOV A,#4EH;  发写暂存存储器命令
           LCALL WRITE_1820
           MOV A,#00H;  不 TH(报警上限)中写入00H
           LCALL WRITE_1820
           MOV A,#00H;   TL(报警下限)中写入00H
           LCALL WRITE_1820
           MOV A,#1FH;   选择9位温度分辨率
           LCALL WRITE_1820
           RET
///////////////////////////////////////; 读出转换后的温度值
GET_TEMPER: SETB DQ; 定时入口
            LCALL INIT_1820
            JB FLAG1,TSS2
            RET; 若DS18B20不存在则返回
TSS2:       MOV A,#0CCH; 跳过ROM匹配
            LCALL WRITE_1820
            MOV A,#44H; 发出温度转换命令
            LCALL WRITE_1820
            MOV R0,#50;等待A/D转换结束,12位的话750us
            LCALL DELAY
            LCALL INIT_1820
            MOV A,#0CCH; 跳过ROM匹配
            LCALL WRITE_1820
            MOV A,#0BEH; 发出读温度命令
            LCALL WRITE_1820
            LCALL READ_18200
            MOV TEMPER_NUM,A; 将读出的温度数据保存
            RET
//////////////////////////////////////////////////////; 读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820: MOV R2,#8
             RE1: CLR C
                 SETB  DQ
                 NOP
                 NOP
                 CLR DQ
                 NOP
                 NOP
                 NOP
                 SETB DQ
                 MOV R3,#7
                 DJNZ R3,$
                 MOV C,DQ
                 MOV R3,#23
                 DJNZ R3,$
                 RRC A
                 DJNZ R2,RE1
                 RET
//////////////////////////////////////; 写DS18B20的程序
WRITE_1820: MOV R2,#8
                  CLR C
             WR1: CLR DQ
                  MOV R3,#6
                  DJNZ R3,$
                  RRC A
                  MOV DQ,C
                  MOV R3,#23
                  DJNZ R3,$
                  SETB DQ
                  NOP
                   DJNZ R2,WR1
                   SETB DQ
                  RET
////////////////////////////////////////////// ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:     MOV R4,#2; 将温度高位和低位从DS18B20中读出
                MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
            RE00:MOV R2,#8
            RE01:CLR C
                 SETB DQ
                 NOP
                 NOP
                 CLR DQ
                 NOP
                 NOP
                 NOP
                 SETB DQ
                 MOV R3,#7
                 DJNZ R3,$
                 MOV C,DQ
                 MOV R3,#23
                 DJNZ R3,$
                 RRC A
                 DJNZ R2,RE01
                 MOV @R1,A
                 DEC R1
                 DJNZ R4,RE00
                 RET
////////////////////////////////////////; 将从DS18B20中读出的温度数据进行转换
      TEMPER_COV:   MOV A,#0F0H
                    ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
                    SWAP A
                    MOV TEMPER_NUM,A
                    MOV A,TEMPER_L
                    JNB ACC.3,TEMPER_COV1; 四舍五入去温度值
                    INC TEMPER_NUM
      TEMPER_COV1:  MOV A,TEMPER_H
                    ANL A,#07H
                    SWAP A
                    ORL A,TEMPER_NUM
                    MOV TEMPER_NUM,A; 保存变换后的温度数据
                    LCALL BIN_BCD
                    RET
/////////////////////////////////////////; 将16进制的温度数据转换成压缩BCD码
      BIN_BCD: MOV DPTR,#TEMP_TAB
               MOV A,TEMPER_NUM
               MOVC A,@A+DPTR
               MOV TEMPER_NUM,A
      RET
  TEMP_TAB:   DB 00H,01H,02H,03H,04H,05H,06H,07H
              DB 08H,09H,10H,11H,12H,13H,14H,15H
              DB 16H,17H,18H,19H,20H,21H,22H,23H
              DB 24H,25H,26H,27H,28H,29H,30H,31H
              DB 32H,33H,34H,35H,36H,37H,38H,39H
              DB 40H,41H,42H,43H,44H,45H,46H,47H
              DB 48H,49H,50H,51H,52H,53H,54H,55H
              DB 56H,57H,58H,59H,60H,61H,62H,63H
              DB 64H,65H,66H,67H,68H,69H,70H,71H
                  DB 72H,73H,74H,75H,76H,77H,78H,79H
              DB 80H,81H,82H,83H,84H,85H,86H,87H
              DB 88H,89H,90H,91H,92H,93H,94H,95H
              DB 96H,97H,98H,99H
////////////////////////////////////////////////////////////////
; 延时子程序
;为保证DS18B20的严格I/O时序,需做较精确的延时
;在DS18B20操作中,用到的延时有15us、90us、270us、540us、750us
;因为这些延时均为15us的倍数,因此可编写一个DELAY15(n)函数
DELAY:
LOOP0:MOV R1,#06H
LOOP1:DJNZ R1,LOOP1
       DJNZ R0,LOOP0
       RET
//////////////////////////////////////////////;500毫秒延时子程序
           DELAY500:MOV R4,#248
          DA222:MOV R5,#248
                DJNZ R5,$
                DJNZ R4,DA222
                RET               
;///////////////////////////////////////////
DIS_SET: MOV R2,MINUT;   调分设置值
          MOV R0, #DIS_MIN
          CALL BCDS
          MOV R0, #DIS_MIN
          MOV R2,#11111011B   ;分个位
          CALL DIS
          CALL DL10MS
          INC R0
          MOV R2,#11111010B   ;分十位
          CALL DIS
          CALL DL10MS
          MOV R2,HOUR;   调时设置值
          MOV R0, #DIS_HOU
          CALL BCDS
          MOV R0, #DIS_HOU
          MOV R2,#11111001B   ;时个位
          CALL DIS
          CALL DL10MS
          INC R0
          MOV R2,#11111000B   ;时十位
          CALL DIS
          CALL DL10MS
        MOV R2, SECOND;  取秒值
        MOV R0, #DIS_SEC
        CALL BCDS
        MOV R0,#DIS_SEC
        MOV R2,#1111101B   ;秒个位
        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#1111100B   ;秒十位
        CALL DIS
        CALL DL10MS
        CALL DL10MS
        RET
;//////////////////
DLL:      MOV R6,#01H
DELX:     MOV R7,#0FFH
DELX0:    NOP
          NOP
          NOP
          DJNZ R7,DELX0
          DJNZ R6,DELX0
          RET
;中断处理程序
        ;ORG 0200H
PR_T0:  PUSH ACC
        PUSH PSW
        MOV TH0,#TIMING_H
        MOV TL0,#TIMING_L
        DJNZ CNT50MS,CONT
        MOV CNT50MS,#CNT_NUM; 1S OVER, RELOAD COUNTER NUMBER
        CPL  P1.7
        DJNZ CNT0_5S,CONT
        MOV CNT0_5S,#CNT_05; 1秒到
        MOV A,SECOND       ;秒处理
        ADD A,#01H
        DA A
        MOV SECOND, A
        CJNE A, #60H,CONT   ;秒处理结束
        MOV SECOND,#00     ;分处理
        MOV A,MINUT
        ADD A,#01H
        DA A
        MOV MINUT, A
        CJNE A, #60H,CONT  ;分处理结束
        MOV MINUT,#00
         MOV A,HOUR
        ADD A,#01H
        DA A
        MOV HOUR, A
        CJNE A, #24H,CONT  ;分处理结束
        MOV HOUR,#00
CONT:   POP PSW
        POP ACC
        RETI
                  /////////////////////////////////////////
ALARMZC:                                                   ;声光报警
      MOV R0,#10         
LOOP5:      MOV A,#06H
      MOV P1,A           
      LCALL DL1S
      LCALL DL1S         
      INC A
      MOV P1,A            
      LCALL DL1S         
      LCALL DL1S                  
      DJNZ R0, LOOP5
          MOV P1,#00H                                                                                                                                                         
      LJMP LOOP                  
/////////////////////////////////////////
DSPLY1: MOV R0,#20H      
        MOV R2,#00H               
REDO:ACALL DISP         
          INC R2         
         MOV A, R2         
         INC R0
         XRL A, #06H         
         JNZ REDO         
         RET
DSPLY2: MOV R0,#25H  
        MOV R2,#03H
        REDO2:ACALL DISP
        INC R2
        MOV A, R2
        INC R0
        XRL A, #06H
        JNZ REDO2
        RET
DISP: MOV P1,R2                  
      MOV DPTR,#LED_SEG            
      MOV A ,@R0
      MOVC A ,@A+DPTR         ;字形码
      MOV P0,A                 
      LCALL DL1MS         
      RET
DL1MS: MOV R1,#200  
DL2:NOP
         NOP
         NOP
         DJNZ R1,DL2
         RET
LED_SEG:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
/////////////////////////////////////
DL1S:MOV R1,#250
DDL1:MOV R2,#250
DOQ: NOP
     NOP
         NOP
         NOP
         NOP
         NOP
     DJNZ R2,DOQ
         DJNZ R1,DDL1
         RET
/////////////////////////////////////////////////倒计时加热23H
LOOOP6:LCALL DL1S   
       MOV A,27H        
       CJNE A,#09H,GOON1        
           MOV 27H,#00H
       MOV  A,26H                  
           CJNE A,#05H,GOON2         
           MOV 26H,#00H
       INC 25H                     
           RET   
GOON1:INC 27H                 
  RET
GOON2:INC 26H         
  RET
//========================               
REDDO:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        //ACALL ALARM
                        LCALL DDXXWD                        ;YOU BUG显示温度
                        LJMP XYB
                        //LCALL JIARE
                        MOV A,SEC_M
                        CJNE A ,#00,REDDO
                        LJMP XYB
REDDO1:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,REDDO1
                        LJMP XYB1
REDDO2:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,REDDO2
                        LJMP XYB2
REDDO3:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,REDDO3
                        LJMP XYB3
REDDO4:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,REDDO4
                        LJMP XYB4
////////////////////////////////////
RREDDO:                MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        LCALL DDXXWD                        ;YOU BUG显示温度
                        MOV A,TEMPER_NUM
                        CJNE A,#27H,UU
                        LJMP  XXYB
UU:                        MOV A,SEC_M
                        CJNE A ,#00,RREDDO
                        LJMP XXYB
RREDDO1:    MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,RREDDO1
                        LJMP XXYB1
RREDDO2:        MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        LCALL DDXXWD                        ;YOU BUG显示温度
                        MOV A,TEMPER_NUM
                        CJNE A,#27H,UU1
UU1:                MOV A,SEC_M
                        CJNE A ,#00,RREDDO2
                        LJMP XXYB2
RREDDO3:        MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        MOV A,SEC_M
                        CJNE A ,#00,RREDDO3
                        LJMP XXYB3
RREDDO4:        MOV A,#01H                  
                        MOV R2,#00H
                        LCALL DISS                           ;显示模式一
            ACALL TIM_VAL
                        ACALL DISPLAYY                        ;显示倒计时
                        LCALL DDXXWD                        ;YOU BUG显示温度
                        MOV A,TEMPER_NUM
                        CJNE A,#27H,UU2
                        LJMP XXYB4
UU2:                MOV A,SEC_M
                        CJNE A ,#00,RREDDO4
                        LJMP XXYB4
                        //========================
;显示1位子程序
;R2中存放显示位置,A中存放显示字符信息
DISS:        MOV DPTR,#SEG_TAB
            MOVC A,@A+DPTR
            MOV P0,A
            NOP
            MOV A,R2
            MOV P1,A
            INC A
            MOV R2,A
            ACALL DEL10
                        MOV P0,#00
                        MOV P2,#00
                        ACALL DEL10
                        RET
DISSS:        MOV DPTR,#SEG_TAB
            MOVC A,@A+DPTR
            MOV P0,A
            NOP
            MOV A,R2
            MOV P1,A
            INC A
            MOV R2,A
            ACALL DL1S
                        MOV P0,#00
                        MOV P2,#00
                        ACALL DL1S
                        RET
DISS1:        MOV DPTR,#SEG_TAB
            MOVC A,@A+DPTR
            MOV P0,A
            NOP
            MOV A,R2
            MOV P1,A
            ACALL DEL10
                        ACALL DEL10
                        RET
//========================
//延时
DEL10:      MOV R7,#20
DEL01:      MOV R6,#20
DEL:        NOP
            NOP
            NOP
            DJNZ R6,DEL
            DJNZ R7,DEL01
            RET//========================                       
//显示6位子程序
DISPLAYY:        MOV R0,#DIS_BUF
                        MOV R2,#01H
DISPLYY1:        MOV A,@R0
                        ACALL DISS
                        INC R0
                        MOV A,R2
                        XRL A,#04H
                        JNZ DISPLYY1
                        RET
                        //========================
//定时器初始化
INI_T0:        MOV TMOD,#00000001B                ;方式1,定时
                MOV TH0,#3CH   ;12MHz晶振,定时50ms,X=3CB0H
                MOV TL0,#0B0H
                SETB EA
                SETB ET0
                SETB PT0
                SETB TR0
                RET
//========================分离高低4位
SBCD:        MOV B,#10H
                DIV AB
                MOV @R0,A
                INC R0
                MOV @R0,B
                RET

//========================秒值分离并存显示缓冲区
TIM_VAL:    MOV R0,#DIS_BUF
                        INC R0
                        MOV A,SEC_M
                        ACALL SBCD
                        RET                       
//========================中断处理程序(计秒程序)                       
T0_INTR:        PUSH ACC
                        PUSH PSW
                        MOV TH0,#3CH   ;12MHz晶振,定时50ms,X=3CB0H
                        MOV TL0,#0B0H
                        DJNZ SECOND1,GOON
                        MOV SECOND1,#20
                        MOV A,#9AH
            CLR C                        ;采用十进制数计秒
                        SUBB A,#01
                        ADD A,SEC_M
                        DA A
                        MOV SEC_M,A
                        CJNE A,#99H,GOON
                        MOV SEC_M,#00H
                        MOV A,#9AH
  
GOON:                POP PSW
                        POP ACC
                        RETI
//========================               
;7段码显示字模表
DDXXWD: LCALL TEMPER                                                ;单独显示温度
            MOV R2,TEMPER_NUM;  取温度值
        MOV R0,#T_DISBF
        CALL BCDS
        MOV R0,#T_DISBF
        MOV R2,#11111101B   ;温度个位

        CALL DIS
        CALL DL10MS
        INC R0
        MOV R2,#11111100B   ;温度十位
                MOV 4CH,R2
        CALL DIS
        CALL DL10MS
                RET
ALARM1:                                                   ;声光报警
LOOP55:MOV R0,#20         
      MOV A,#06H
      MOV P1,A           
      LCALL DL10MS
      LCALL DL10MS         
      INC A
      MOV P1,A            
      LCALL DL10MS         
      LCALL DL10MS                    
      DJNZ R0, LOOP55         
      RET
DL100MS:MOV R5,#100
DEL1:MOV R6,#200
DEL0:NOP
     NOP
         NOP
         DJNZ R6,DEL0
         DJNZ R5,DEL1
         RET
///////////////////////////////////////////////////////////中断
//ORG 0600H
PINT0:PUSH ACC
      PUSH PSW
          SETB RS0
          MOV R1,#05
          CLR P3.4
          CLR P3.5
          CLR P3.6
          CLR P3.7   
      MOV P1,#06H         
      LCALL DL100MS
      LCALL DL100MS         
   
      MOV P1,#07H           
      LCALL DL100MS         
      LCALL DL100MS           
          POP PSW
          POP ACC
          RETI
PINT1:
      PUSH ACC
      PUSH PSW         
          SETB RS0
          CLR P3.6        
           CLR P3.7         
       CLR P3.5
           CLR P3.4           //LCALL ALARM1                          
           POP PSW
           POP ACC         
           RETI
                  END



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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