⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 采用数字温度计18B20
💻 ASM
字号:
XC  BIT 00H ;调时标志位
XT  BIT 01H ;测温标志位
XS  BIT 02H ;闪烁标志位
XU  BIT 03H
XD  BIT 04H
FLAG1 BIT 06H ;是否检测到DS18B20标志位
DIS EQU 30H	  ;显示缓冲
MSEC EQU 39H  ;计时缓冲区
SEC  EQU 3AH
MIN  EQU 3BH
HOUR EQU 3CH
TEM_H  EQU 28H
TEM_L  EQU 29H
T_1   EQU  40H
T_2   EQU  41H
T_3   EQU  42H
T_4   EQU  43H
ORG  0000H
AJMP START
ORG  000BH
AJMP INT_0
ORG  0030H
START:  MOV R7,#26H
        MOV R0,#1FH
        CLR A
S1:     MOV @R0,A
        INC R0
        DJNZ R7,S1
        MOV SP,#60H
		MOV DPTR,#TABLE
		MOV TMOD,#01H
		MOV TH0,#03CH
		MOV TL0,#0B0H
        SETB EA
        SETB ET0
		SETB  TR0
  
MAIN:   LCALL KEY  ;检测标志位判断工作模式
        JB XC,CD
        JB XT,TD
        lCALL CLOCK
		LCALL DISPLAY
		AJMP MAIN
CD:     CLR TR0
        CLR XC
        MOV P3,#0BFH
        MOV R0,#SEC
CD1:    LCALL KEY
        LCALL FLASH
        JNB XC,CD1
        CLR XC
        SETB TR0
        MOV P3,#0FFH
        AJMP MAIN
TD:     CLR P3.7
        LCALL GET_TEMPER
        MOV  A,TEM_L
        ANL A,#0F0H
        SWAP A
        MOV TEM_L,A
        MOV A,TEM_H
        ANL A,#0FH
        SWAP A
        ORL TEM_L,A
TD3:    LCALL TOBCD
        LCALL T_DISPLAY
        CLR XT
        SETB P3.7
        AJMP MAIN
TOBCD:  CLR A
        MOV R2,#08H
        MOV R3,A
TO1:    MOV A,TEM_L
        RLC A
        MOV TEM_L,A
        MOV A,R3
        ADDC A,R3
        DA A
        MOV R3,A
        DJNZ R2,TO1
        RET
T_DISPLAY: MOV A,R3
           ANL A,#0FH
           MOV DIS+2,A
           MOV A,R3
           ANL A,#0F0H
           SWAP A
           MOV DIS+3,A
           MOV DIS,#0CH
           MOV DIS+1,#0DH
           MOV DIS+4,#0BH
           MOV DIS+5,#0BH
           MOV DIS+6,#0BH
           MOV DIS+7,#0BH
           MOV R3,#200
T_D1:      LCALL DISPLAY
           DJNZ R3,T_D1
           RET
KEY:
        JB P3.2,KEY1
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        JB P3.2,KEY1
		SETB XC

KEY1:   JB P3.3,KEY2
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        JB P3.3,KEY2
        SETB XT

KEY2:   JB P3.5,KEY3
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
		JB P3.5,KEY3
		SETB XD
  
KEY3:   JB P3.4,KEY_DONE
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
        LCALL DISPLAY
		JB P3.4,KEY_DONE
		SETB XU
KEY_DONE: RET
TAN:
       JB XU,TAN1
       JB XD,TAN2
       AJMP TAN4
TAN1:  INC R0
       CLR XU
       CJNE R0,#3DH,TAN4
       MOV R0,#SEC
       AJMP TAN3
TAN2:  CLR XD
       MOV A,@R0
       ADD A,#01H
       DA A
       CJNE R0,#3CH,TAN5
       CJNE A,#24H,TAN3
       MOV A,#00H
TAN5:  CJNE A,#60H,TAN3
       MOV A,#00H
TAN3:  MOV @R0,A
TAN4:  RET
FLASH: JB XD,F3
       MOV 44H,@R0
       MOV R5,#20
       MOV @R0,#0BBH
       LCALL KEY
F1:    LCALL CLOCK
       LCALL DISPLAY
       DJNZ R5,F1
       MOV @R0,44H
F3:    MOV R5,#20
F2:    LCALL CLOCK
       LCALL DISPLAY
       LCALL KEY
       LCALL TAN
       DJNZ R5,F2
       RET
DISPLAY:  MOV A,#01H
		MOV R1,#DIS   
DIS1:   MOV P2,A
        PUSH ACC
        MOV A,@R1
        MOVC A,@A+DPTR
        MOV P0,A
        LCALL DELAY
        POP ACC
        RL A
        INC R1
        CJNE R1,#38h,DIS1
RET

;**********************************时间送显示子程序
CLOCK: PUSH PSW
       PUSH ACC
       MOV A,SEC
       ANL A,#0FH
       MOV DIS,A
       MOV A,SEC
       SWAP A
       ANL A,#0FH
       MOV DIS+1,A
       MOV DIS+2,#0AH
       MOV A,MIN
       ANL A,#0FH
       MOV DIS+3,A
       MOV A,MIN
       ANL A,#0F0H
	   SWAP A
       MOV DIS+4,A
       MOV DIS+5,#0AH
       MOV A,HOUR
       ANL A,#0FH
       MOV DIS+6,A
       MOV A,HOUR
       ANL A,#0F0H
	   SWAP A
       MOV DIS+7,A
       POP ACC
       POP PSW
       RET

		
;**********************************计时程序
INT_0:  PUSH PSW   ;保护现场
        PUSH ACC
        MOV  A,#0B0H  ;初值加上当前TL0值校正时间
        ADD  A,TL0
        MOV  TL0,A
        MOV  TH0,#3CH
        INC MSEC
        MOV A,MSEC
        CJNE A,#20,DONE
        MOV MSEC,#00H
        MOV A,SEC
        ADD A,#01H
        DA  A       ;进制转换
        MOV SEC,A
        CJNE A,#60H,DONE
        MOV SEC,#00H
        MOV A,MIN
        ADD A,#01H
        DA  A
        MOV MIN,A
        CJNE A,#60H,DONE
        MOV MIN,#00H
        MOV A,HOUR
        ADD A,#01H
        DA  A
        MOV HOUR,A
        CJNE A,#24H,DONE
        MOV HOUR,#00H
DONE:   POP ACC
        POP PSW
		RETI

DELAY:  MOV R7,#50
D1:     MOV R6,#25
		DJNZ R6,$
		DJNZ R7,D1
		RET
DELAY1:MOV   R3, #0
DLOOP: DJNZ  R3, DLOOP
       DJNZ  R2, DELAY1
       RET

;************************温度读取程序

INIT_1820:            ; 这是DS18B20复位初始化子程序
     SETB  P1.0
     NOP
     CLR   P1.0
     MOV   R1,#3      ;主机发出延时537微秒的复位低脉冲

TSR1:MOV   R0,#107
     DJNZ  R0,$
     DJNZ  R1,TSR1
     SETB  P1.0       ;然后拉高数据线
     NOP
     NOP
     NOP
     MOV   R0,#25H
TSR2:JNB   P1.0,TSR3  ;等待DS18B20回应
     DJNZ  R0,TSR2
     LJMP  TSR4       ; 延时
TSR3:SETB  FLAG1      ; 置标志位,表示DS1820存在
     LJMP  TSR5
TSR4:CLR   FLAG1      ; 清标志位,表示DS1820不存在
     LJMP  TSR7
TSR5:MOV   R0,#117
TSR6:DJNZ  R0,TSR6    ; 时序要求延时一段时间
TSR7:SETB  P1.0
     RET
GET_TEMPER:           ; 读出转换后的温度值
     SETB  P1.0
     LCALL INIT_1820  ;先复位DS18B20
     JB    FLAG1,TSS2
     RET              ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:MOV A,#0CCH      ; 跳过ROM匹配
     LCALL WRITE_1820
     MOV A,#44H       ; 发出温度转换命令
     LCALL WRITE_1820
     LCALL DELAY1     ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
     LCALL INIT_1820  ;准备读温度前先复位
     MOV   A,#0CCH    ; 跳过ROM匹配
     LCALL WRITE_1820
     MOV   A,#0BEH    ; 发出读温度命令
     LCALL WRITE_1820
     LCALL READ_18200 ; 将读出的温度数据保存到35H/36H
     RET
WRITE_1820:           ;写DS18B20的子程序(有具体的时序要求)
     MOV   R2,#8      ;一共8位数据
     CLR   C
WR1: CLR   P1.0
     MOV   R3,#6
     DJNZ  R3,$
     RRC   A
     MOV   P1.0,C
     MOV   R3,#23
     DJNZ  R3,$
     SETB  P1.0
     NOP
     DJNZ  R2,WR1
     SETB  P1.0
     RET
READ_18200:           ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
     MOV   R4,#2      ; 将温度高位和低位从DS18B20中读出
     MOV   R1,#29H    ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:MOV   R2,#8      ; 数据一共有8位
RE01:CLR   C
     SETB  P1.0
     NOP
     NOP
     CLR   P1.0
     NOP
     NOP
     NOP
     SETB  P1.0
     MOV   R3,#9
RE10:DJNZ  R3,RE10
     MOV   C,P1.0
     MOV   R3,#23
RE20:DJNZ  R3,RE20
     RRC   A
     DJNZ  R2,RE01
     MOV   @R1,A
     DEC   R1
     DJNZ  R4,RE00
     RET
TABLE:	   
   DB  0C0H        ;"0" 
   DB  0F9H        ;"1"
   DB  0A4H        ;"2"
   DB  0B0H        ;"3"
   DB   99H        ;"4"
   DB   92H        ;"5"
   DB   82H        ;"6"
   DB  0F8H        ;"7"
   DB   80H        ;"8"
   DB   90H        ;"9"
   DB   0BFH       ;'-'
   DB   0FFH        ;熄灭
   DB  0c6H          ;"C"
   DB  09CH         ;"'"
END	    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -