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

📄 ds1820.asm

📁 DS1820测温程序:此程序是由单片机控制的汇编程序
💻 ASM
字号:
			;***************
			;Ds18b20_program  2003-1-3
			;***************
			TemperL       EQU    8H
			TemperH       EQU    TemperL+1
			TemperDotL    EQU    TemperH+1
			TemperDotH    equ    TemperDotL+1
			TemperZer     equ    TemperDotH+1
			Led1	      equ    TemperZer+1
			led2	      equ    led1+1
			led3	      equ    led2+1
			DogL	      equ    Led3+1
			DogH	      equ    DogL+1
			SpData	      equ    22h
			
			DogX	      equ    0 ;4Min
			
			Ds18b20F      BIT    00H

			DQ            BIT    P3.7
		        led_1         bit p3.0
		        led_2         bit p3.1
		        led_3         bit p3.4
		        
		        key_f      bit p3.3
		        pnp1       bit p3.4
		        pnp2       bit p3.5
 	
			
			oRG  0000H;            ;
			     sJMP start            
			ORG  0003H;            ;
			     reti;
			ORG  000BH             ;
			     reti           ;
			ORG  0013H    
			     reti              ;
			ORG  001BH             ;
			     reti;aJMP T1        ;
			ORG  0023H             ;
			    RETI; AJMP RS_485             ;
;**************************************                      
start:   
	       MOV R7,#7fh       ;
		MOV R0,#1       ;
CR:             INC R0            ;
		MOV @R0,#0         ;
               djnz r7,cr        ;CLR RAM
                MOV SP,#SpData       ;
;*****************
;   MINI_Pragram
;*****************
;		mov Dogl,#DogX
		mov led1,#0fh
		mov led2,#ff_led
		mov led3,#ff_led
STAR_BI:
		CALL GetTemper
       		CALL TemperDo
		call led
		djnz DogL ,Star_bi
;		djnz DogH,Star_bi
		mov p1,#0ffh
		mov p3,#0ffh
		mov Pcon,#02
		sjmp Star_bi
;*******************
LED:            
		mov dptr,#led_asc
	;***************************led1
		mov a,led1
		movc a,@a+dptr
		call TurnAsc1
		mov p1,a
		clr led_1
		call timer_1ms
		setb led_1
	;*************************led2  
	led_led2:
		mov a,led2
		movc a,@a+dptr
		call TurnAsc
		mov p1,a
		clr  led_2
		call timer_1ms
		setb led_2
	;*************************led3  
	led_led3:
		mov a,led3
		movc a,@a+dptr
		call TurnAsc
		mov p1,a
		clr led_3
		call timer_1ms
		setb led_3
led_end:
		ret
;*************************
black     equ  1Ch
l_led     equ  11h
o_led     equ  15h
u_led     equ  1Bh
r_led     equ  18h
QQ_led    equ  1dh
p_led     equ  16h
a_led     equ  0ah
UU_led    equ  1ah
s_led     equ  19h
e_led     equ  0eh      
tt_led    equ  1fh
ff_led    equ  1eh
c_led     equ  0ch
h_led     equ  10h
b_led     equ  0bh
d_led     equ  0dh
f_led     equ  0fh                                                                                                                      
nn_led    equ  12h
n_led     equ  13h
cc_led    equ  2ah
oo_led    equ  15h			
rr_led    equ  16h
dot_led   equ  2bh	
;"bafgecdh"
;*********************************************
;       led=>  /   abcdefgh
led_asc:
		db 11111100B;0
		db 01100000B;1
		db 11011010B;2
		db 11110010B;3
		db 01100110B;4
		db 10110110B;5
		db 10111110B;6
		db 11100000B;7
		db 11111110B;8
		db 11110110B;9
		DB   11101110B;a=>A
		DB   00111110B;B=>B      
		DB   10011100B;C=>C      
		DB   01111010B;D=>D      
		DB   10011110B;E=>E      
		DB   10001110B;F=>F      
		DB   01101110B;H=>10H      
		DB   00011100B;L=>11H      
		DB   11101100B;N=>12H      
		db   00101010b;n=>13h
		db   11111100b;O=>14h
		dB   00111010B;o=>15H
		DB   11001110B;P=>16H
		DB   11100110B;Q=>17H
		DB   00001010B;r=>18H
		DB   10110110B;S=>19H      
		DB   01111100B;U=>1AH      
		DB   00111000B;u=>1BH      
		DB   00000000B;BLACK=>1CH
		DB   11111111B;8.=>1DH
		db   00000010b;-=>1Eh
		db   00011110b;t=>1Fh
		db 11111101B;0.=>20h
		db 01100001B;1.
		db 11011011B;2.
		db 11110011B;3.
		db 01100111B;4.
		db 10110111B;5.
		db 10111111B;6.
		db 11100001B;7.
		db 11111111B;8.
		db 11110111B;9.=>29h
;************* add 2002.12.10	
		DB   11101111B;a.=>A
		DB   00111111B;B.=>B      
		DB   10011101B;C.=>C      
		DB   01111011B;D.=>D      
		DB   10011111B;E.=>E      
		DB   10001111B;F.=>F      
		DB   01101111B;H.=>10H      
		DB   00011101B;L.=>11H      
		DB   11101101B;N.=>12H      
		db   00101011b;n.=>13h
		db   11111101b;O.=>14h
		dB   00111011B;o.=>15H
		DB   11001111B;P.=>16H
		DB   11100111B;Q.=>17H
		DB   00001011B;r.=>18H
		DB   10110111B;S.=>19H      
		DB   01111101B;U.=>1AH      
		DB   00111001B;u.=>1BH      
		DB   00000001B;BLACK.=>1CH
		DB   11111111B;8.=>1DH
		db   00000011b;-=>1Eh
		db   00011111b;t=>1Fh
		db 'li jie by 2002.12.24'	
;*************************************
timer_1ms:
		djnz b,$
		djnz b,$
		ret
;"bafgecdh"
;*********************************************
;       led=>  /   abcdefgh ,bafgecdh
TurnAsc:
		mov c,acc.0
		mov b.0,c
		mov c,acc.1
		mov b.4,c
		mov c,acc.2
		mov b.5,c
		mov c,acc.3
		mov b.3,c
		mov c,acc.4
		mov b.1,c
		mov c,acc.5
		mov b.2,c
		mov c,acc.6
		mov b.7,c
		mov c,acc.7
		mov b.6,c
		mov a,b
		ret		
;***************************
;abcdefgh=>bafhecdg
TurnAsc1:
		mov c,acc.0
		mov b.4,c
		mov c,acc.1
		mov b.0,c
		mov c,acc.2
		mov b.5,c
		mov c,acc.3
		mov b.3,c
		mov c,acc.4
		mov b.1,c
		mov c,acc.5
		mov b.2,c
		mov c,acc.6
		mov b.7,c
		mov c,acc.7
		mov b.6,c
		mov a,b
		ret		
;******************
;读出转换后的温度值
GetTemper:
	SkipDs18b20	equ 0cch
	StartDs18b20	equ 44h
	ReadDs		equ 0beh	
	;***************************
	SETB  DQ            ; 定时入口
   	call InitDs18b20
       	JB   Ds18b20F,S22
	ret
   S22:call Delay64uS
	MOV A,#SkipDs18b20        ; 跳过ROM匹配------0CC
        call WriteByteDs1820
        MOV  A,#StartDs18b20        ; 发出温度转换命令
        call WriteByteDs1820
        call DELAY1s
	call InitDs18b20
        JB   Ds18b20F,ABC
	ret
   ABC:call Delay64uS
       MOV  A,#SkipDs18b20        ; 跳过ROM匹配
       call WriteByteDs1820
       MOV  A,#ReadDs        ; 发出读温度命令
       call WriteByteDs1820
       call ReadDs18b20   ;READ_1820
       RET
;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
ReadByteDs1820:
       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的程序
WriteByteDs1820:
       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中读出两个字节的温度数据
ReadDs18b20:
	Call ReadByteDs1820
       	MOV  TemperL,A
	Call ReadByteDs1820
       	MOV  TemperH,A
        RET
        ;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
        JB    Ds18b20F,RE_CONFIG1    ; 若DS18B20存在,转RE_CONFIG1
        RET
RE_CONFIG1:
        MOV    A,#0CCH        ; 发SKIP ROM命令
        call    WriteByteDs1820
        MOV    A,#4EH        ; 发写暂存存储器命令
        call    WriteByteDs1820
        MOV    A,#00H        ; TH(报警上限)中写入00H
        ;call    WriteByteDs1820
        MOV    A,#00H        ; TL(报警下限)中写入00H
        ;call    WriteByteDs1820
        MOV    A,#7FH        ; 选择12位温度分辨率
        call    WriteByteDs1820
        RET
;------------------延时子程序
DELAY:
	MOV   R7,#00H
Dey1:
	call  led
	DJNZ  R7,Dey1
	RET
Delay500uS:
	MOV   R6,#00H
        DJNZ  R6,$
        RET
Delay64uS:
	MOV   R6,#20H
        DJNZ  R6,$
        RET
;-------------------将从DS18B20中读出的温度数据进行转换
;2^3,2^2,2^1,2^0,2^-1,2^-2,2^-3,2^4 ;L
;SSSSSSS2^6,2^5,2^4;H
;************************
TemperDo:
    	JB   Ds18b20F,Do1
        ret
do1:
	clr a
	mov TemperDotL,a
	mov TemperDotH,a
	mov TemperZer,a
	;*****************	
	mov a,TemperH
	jnb acc.7,ZhenData ;>0
	;<0
	mov a,TemperL
	cpl a
	add a,#01 ;cpl+1 
	mov TemperL,a
	mov a,TemperH
	cpl a
	addc a,#0
	mov TemperH,a
ZhenData:
	call FenLiDot	
	call FenLiZer
	call HexToLed
	call Led
	ret
;**********************	
FenLiZer:
	mov a,TemperL
	jnb acc.4,Fz1
	mov a,#01
	add a,TemperZer
	mov TemperZer,a
Fz1:
	mov a,TemperL
	jnb acc.5,Fz2
	mov a,#02
	add a,TemperZer
	mov TemperZer,a
Fz2:
	mov a,TemperL
	jnb acc.6,Fz3
	mov a,#04
	add a,TemperZer
	mov TemperZer,a
Fz3:
	mov a,TemperL
	jnb acc.7,Fz4
	mov a,#08
	add a,TemperZer
	mov TemperZer,a
Fz4:
	mov a,TemperH;!!!!
	jnb acc.0,Fz5
	mov a,#16
	add a,TemperZer
	mov TemperZer,a
Fz5:
	mov a,TemperH
	jnb acc.1,Fz6
	mov a,#32
	add a,TemperZer
	mov TemperZer,a
Fz6:
	mov a,TemperH
	jnb acc.2,Fz7
	mov a,#64
	add a,TemperZer
	mov TemperZer,a
Fz7:
	ret
;****************************
FenLiDot:
	mov a,TemperL
	jnb acc.3,Fen1 ;2^-1
	mov r5,#low(5000)
	mov r4,#High(5000)
	call Add2
Fen1:
	jnb acc.2,Fen2 ;2^-2
	mov r5,#low(2500)
	mov r4,#High(2500)
	call Add2
Fen2:
	jnb acc.1,Fen3 ;2^-3
	mov r5,#low(1250)
	mov r4,#High(1250)
	call Add2
Fen3:
	jnb acc.0,Fen4 ;2^-4
	mov r5,#low(625)
	mov r4,#High(625)
	call Add2
Fen4:
	ret
;****************
;TemperDorHL+r4r5=r2r3
;*****************
Add2:
	push a
	mov a,TemperDotL
	add a,r5
	mov TemperDotL,a
	mov a,TemperDotH
	addc a,r4
	mov TemperDotH,a
	pop a
	ret
;***********************
;  D=>BCD_16
;***********************
bcd_16: clr a    ;in:r3r2[16 bdata]
      mov r4,a  ;R6,r5,r4[5 bcddata]
      mov r5,a
      mov R6,a
      mov R7,#10h
lp0:  clr c
      mov a,r2
      rlc a
      mov r2,a
      mov a,r3
      rlc a
      mov r3,a
      mov a,r4
      addc a,r4
      da a
      mov r4,a
      mov a,r5
      addc a,r5
      da a
      mov r5,a
      mov a,R6
      addc a,R6
      da a
      mov R6,a
      djnz R7,lp0
      ret	
;************************
HexToLed:
	mov r3,TemperDotH
	mov r2,TemperDotL
	call Bcd_16   ;r3r2(in)=>r6r5r4(out)
	mov a,r5
	anl a,#0f0h
	swap a
	mov led3,a
	mov a,r5
	anl a,#0fh
	cjne a,#05,He1
	;>=0.5
He2:	
	inc led3
	sjmp He3	
He1:
	jnc He2
;******* Zer To Bcd
He3:
;***************************
	mov a,TemperZer
	mov b,#10
	div ab ;a.b
	mov led1,a
	jnz He4
	mov led1,#black
He4:
	mov a,b
	add a,#20h ;Add Dot
	mov led2,a
	ret
;***************
Delay1S:
	mov b,#130
Dela11:
	push b	
	call Led
	call Led
	pop b
	djnz b,Dela11
	ret
;-------------------DS18B20初始化程序
InitDs18b20:
        CLR    DQ
        MOV    R7,#80h
        DJNZ    R7,$        ; 延时
        SETB    DQ
        MOV    R7,#25h         ;
	DJNZ    R7,$
        SETB    Ds18b20F    ; 置标志位,表示DS1820存在
        JNB    DQ,TSR5
        CLR    Ds18b20F     ; 清标志位,表示DS1820不存在
        Jmp    TSR7
TSR5:
        MOV    R7,#06BH        ;200US
        DJNZ   R7,$        ; 延时
TSR7:
        SETB    DQ
        RET

⌨️ 快捷键说明

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