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

📄

📁 为汇编语言编写调试的18b20控制温度程序
💻
字号:
 ; name: temperature of the ds18b20
; creat by: carol.guo
; date : 2005/10/10

; 定义18B20的暂存存储器

TEMP_L    EQU    36H
TEMP_H    EQU    35H
TEMP_NUM  EQU    40H
tempdoth  equ    41h
tempdotl  equ    42h
DQ 	  EQU    P3.2
FLAG	  EQU   37H

; 定义595的io端口

ser  	  equ  p1.2
sclk	  equ  p1.3
rclk	  equ  p1.4


;定义计数器的个十百千位

a_bit	equ  30h; 
b_bit	equ  31h;
c_bit 	equ  32h;
d_bit	equ  33h;
delbuf	equ  34h;

;定义功能键
led     equ p1.1

k1 	equ p1.5
k2	equ p1.6
k3	equ p1.7

;定义24c01的信号线

sda  equ p3.7
scl  equ p1.0

ORG 0000H
AJMP MAIN
ORG 0020H

MAIN:
	mov  a,#00h
	mov  a_bit,a	;SHI WEI 
	mov  b_bit,a	;GE WEI
	mov  c_bit,a	;XIAO SHU WEI
	MOV  a,#0cH
	mov  d_bit,a	;温度标志符号
	LCALL DIS_TEMP
	

START:
	MOV SP,#60H
	LCALL GET_TEMP
	LCALL TEMP_COV
	LCALL DIS_TEMP
	SJMP START

GET_TEMP:
	CLR PSW.4
	SETB PSW.3 	;设置工作寄存器当前所在的区域 08H-0FH
	CLR EA 		;使18B20 一定要禁止一切中断产生
	CLR FLAG
	LCALL INITIAL  	;调用初始化子程序
	MOV A,#0CCH
	LCALL WRITE	;送入跳过ROM命令
	MOV A,#44H	
	LCALL WRITE	;送入温度转换命令
	LCALL DELAY1S
CHECK:
	LCALL INITIAL
	JB FLAG,NEXT
	LJMP CHECK
NEXT:
	LCALL DELAY10MS
	MOV A,#0CCH	;跳过ROM匹配
	LCALL WRITE
	MOV A,#0BEH	;发出读温度命令
	LCALL WRITE
	LCALL READ      ;读18B20的温度值
	MOV TEMP_L,A
	LCALL READ
	MOV TEMP_H,A
	SETB DQ
RET
	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;初始化子程序
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INITIAL:
	CLR EA
L0:
	CLR DQ		;DS18B20总线为低复位电平
	MOV R2,#200
L1:	
	CLR DQ
	DJNZ R2,L1	;总线复位电平保持400US
	SETB DQ
	MOV R2,#30	
L2:
	DJNZ R2,L2	;释放DS18B20总线保持60US
	CLR C		;清存在信号
	ORL C,DQ	
	JC L6		;存在么?存在C=0; C=1不存在调转
	MOV R6,#80	
L3:			
	ORL C,DQ	
	JC L4			
	DJNZ R6,L3	;持续检测存在信号240US 直到采样结束检测到DQ信号变高为止
	SJMP L0
L4:
	MOV R2,#240
	SETB FLAG
L5:
	DJNZ R2,L5

L6:	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;写18B20的子程序
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

WRITE:
	CLR EA
	MOV R3,#8	;写入DS18B20的BIT数,一个字节8个BIT
WR1:	
	SETB DQ
	MOV R4,#8
	RRC A		;把一个字节DATA(A)分成8个BIT环移给C
	CLR DQ		;开始写入18B20总线要处于复位状态
WR2:
	DJNZ R4,WR2	;保持16US
	MOV DQ,C	;给总线发送一个BIT
	MOV R4,#20	
WR3:
	DJNZ R4,WR3	;等待40US
	DJNZ R3,WR1	;写入下一个BIT
	SETB DQ		;重新释放总线

RET

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;读18B20的子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

READ:
	CLR EA
	MOV R6,#8
RE1:
	CLR DQ		;读前总线保持低电平
	MOV R4,#4
	NOP
	SETB DQ		;开始释放总线	
RE2:
	DJNZ R4,RE2	;保持8US
	MOV C,DQ	;从1820总线读得一个BIT
	RRC A		;把读得的位环移给A
	MOV R5,#30
RE3:
	DJNZ R5,RE3	;保持60US
	DJNZ R6,RE1	;读下一个字节	
	SETB DQ
RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 温度数据转换子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

TEMP_COV:
       MOV    A,#0F0H
       ANL    A,TEMP_L       
       SWAP    A
       MOV    TEMP_NUM,A             
       MOV    A,TEMP_H
       ANL    A,#07H
       SWAP    A
       ORL    A,TEMP_NUM
       MOV    TEMP_NUM,A        ; 保存变换后的温度数据
       MOV    A,TEMP_NUM
	MOV B,#0AH      	;数据处理子程序十位个位单独显示
	DIV AB
	MOV a_bit,A	        ;十位
	MOV b_bit,B            	;个位
        mov a,#0fh
	anl a,temp_l
	mov dptr,#temp_tab
	movc a,@a+dptr
	mov c_bit,a
       ret



;       mov  tempdoth,#00h
;       mov  tempdotl,#00h
;       lcall fenlidot 
;       mov b,#0ah
;	mov a,tempdoth
;	div ab
;	mov  b_bit,a
        RET
temp_tab:
         db 00h,01h,01h,02h,03h,03h,04h,04h,05h,05h,06h,07h,08h
	 db 08h,09h,09h
ret

 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
; fen li xiao shu 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
FenLiDot:
 mov a,Temp_l
 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 acc
 mov a,TempDotL
 add a,r5
 mov TempDotL,a
 mov a,TempDotH
 addc a,r4
 mov TempDotH,a
 pop acc
 ret	

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 74HC595显示子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
DIS_TEMP:
	data595:
        clr ser
        clr sclk
        clr rclk
        lcall delay10ms
        mov dptr,#table
        mov a,d_bit
        movc a,@a+dptr
        mov r7,#08h
data595d:
        rlc a
        mov ser,c
        lcall delay10ms
        setb sclk
        lcall delay10ms
        clr sclk
        lcall delay10ms
        djnz r7,data595d
        mov dptr,#table
        mov a,c_bit
	movc a,@a+dptr
        mov r7,#08h
data595c:
        rlc a
        mov ser,c
        lcall delay10ms
        setb sclk
        lcall delay10ms
        clr sclk
        lcall delay10ms
        djnz r7,data595c
        mov dptr,#table1
        mov a,b_bit
	movc a,@a+dptr
        mov r7,#08h
data595b: 
        rlc a
        mov ser,c
        lcall delay10ms
        setb sclk
        lcall delay10ms
        clr sclk
        djnz r7,data595b
	mov dptr,#table
	mov a,a_bit
	movc a,@a+dptr
        mov r7,#08h
data595a:
	rlc a
        mov ser,c
        lcall delay10ms
        setb sclk
        lcall delay10ms
        clr sclk
        djnz r7,data595a
        clr ser
        clr sclk
        setb rclk
        lcall delay10ms
        clr rclk

RET


;+++++++++++++++++++++++++++++++++++++++

;延时子程序

;+++++++++++++++++++++++++++++++++++++++

delay1S:
	mov r5,#20
d1:	mov r6,#248
	djnz r6,$
	djnz r5,d1
	ret
delay10ms:  
        mov delbuf,#18d
del1:
        nop
        nop
        djnz delbuf,del1

        ret


table: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh,0ffh,0ch,89h,7fh
;0 1 2 3 4 5 6 7 8 9 A b C d E F P H .
	
table1: db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h 
;0. 1. 2. 3. 4. 5. 6. 7. 8. 9.	
	
END 

⌨️ 快捷键说明

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