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

📄 main.asm

📁 51 单片机支持ds18b20测温电路和源程序
💻 ASM
字号:
DAT 	BIT P3.7 ;数据通信口
swpH    equ  0d2H
swpL    equ  0ffH
WDLSB 	DATA 30H ;读出的温度低字节
WDMSB 	DATA 31H ;读出的温度高字节
;***************************************************************
	ORG 0000H
	LJMP MAIN
	ORG 000BH
	LJMP TMR0   ;定时显示,用定时器0

;********************************************************
;定时显示子程序
TMR0:  
 MOV TH0,#swpH ;定时器10MS中断
MOV TL0,#swpL
 JB 21H,dsl;用于高低位轮流显示
MOV P0,42H;高位
ORL P0,#00100000B
 sjmp kkk
dsl:	
MOV P0,43H;低位
ORL P0,#00010000B
kkk: 
  cpl 21H
RETI

;主程序:
MAIN: 
TOINIT: 
;定时器0的初始化
 CLR EA
 MOV TMOD,#01H
 MOV TH0,#swpH ;定时器10MS中断
MOV TL0,#swpL
 SETB EA
SETB ET0
 SETB TR0
;***********************************************************       
;清显示缓冲	
  MOV R2,#2
MOV R0,#42H ;
OVER:
  MOV @R0,#00H; 
INC R0
DJNZ R2,OVER
	
LOOP: 
LCALL DSWD ;调用读出DS18B20温度程序        
SJMP LOOP

;**********************************************************
DSWD:
	LCALL RSTSNR;调用复位程序
	JNB F0,KEND ;如果没有应答,返回主程序
	MOV R0,#0CCH
	LCALL SEND_BYTE ;跳过ROM匹配
	MOV R0,#44H ;发出温度转换命令
	LCALL SEND_BYTE
	SETB EA
	MOV 48H,#1 ;延时75ms以上准备读
SS2: 
	MOV 49H,#255
SS1:
 	MOV 4AH,#255
SS0: 
	DJNZ 4AH,SS0
	DJNZ 49H,SS1
	DJNZ 48H,SS2
	CLR EA
	LCALL RSTSNR
	JNB F0,KEND
	MOV R0,#0CCH ;跳过ROM匹配
	LCALL SEND_BYTE
	MOV R0,#0BEH ;发出读温度命令
	LCALL SEND_BYTE
	LCALL READ_BYTE
	MOV WDLSB,A
	LCALL READ_BYTE
	MOV WDMSB,A
	LCALL TRANS12
KEND:  	
	SETB EA
	RET
;**********************************************************
;温度转换程序(只取整数) ,30H=LSB,31H=MSB;
TRANS12:
    MOV A,30H
	ANL A,#0F0H
	MOV 3AH,A
	MOV A,31H
	ANL A,#0FH
	ORL A,3AH
	SWAP A
	MOV B,#10
	DIV AB
	;MOV 42H,A
	MOV 43H,B ;
	mov b,#10
	div ab
	mov 42H,B
	mov 41H,A
	RET
;*************************************************
SEND_BYTE: ;发送一个字节程序
	MOV A,R0
	MOV R5,#8
SEN3:   CLR C
	RRC A
	JC SEN1
	LCALL WRITE_0
	SJMP SEN2
SEN1:   LCALL WRITE_1
SEN2:   DJNZ R5,SEN3 ; 循环8次,写一个字节
	RET
;*************************************************
;读一个字节程序
READ_BYTE: 
	MOV R5,#8
READ1:  LCALL READ
	RRC A
	DJNZ R5,READ1 ; 循环8次,读一个字节
	MOV R0,A
	RET
	;*************************************************
;复位程序,如果复位置位F0,没有就复位F0
RSTSNR: SETB DAT
	NOP
	NOP
	CLR DAT
	MOV R6,#250 ;主机发复位脉冲持续3μs×200=600μs
	DJNZ R6,$
	MOV R6,#50
	DJNZ R6,$
	SETB DAT ;主机释放总线,口线改为输入
	MOV R6,#15
	DJNZ R6,$
	CALL CHCK ;调用应答检查程序
	MOV R6,#60
	DJNZ R6,$
	SETB DAT
	RET
	;*************************************************
CHCK: 	MOV C,DAT
	JC RST0
	SETB F0 ;检测到信号,置位F0
	SJMP CHCK0
RST0:   CLR F0 ;未准备好F0复位
CHCK0:  RET
;*************************************************
;写0
WRITE_0: 
	CLR DAT
	MOV R6,#30
	DJNZ R6,$
	SETB DAT
	RET
;*************************************************
;写1
WRITE_1: 
	CLR DAT 
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB DAT
	MOV R6,#30
	DJNZ R6,$
	RET
;*************************************************
;读一位数据程序
READ: 	SETB DAT ;先复位至少1US产生读起始信号
	NOP
	NOP
	CLR DAT
	NOP
	NOP
	SETB DAT ;置位DAT准备接收数据
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV C,DAT
	MOV R6,#23
	DJNZ R6,$
	RET
;**********************************************
;13毫秒延时子程序
DELAY10:MOV R4,#20
D2:     MOV R5,#30
        DJNZ R5,$
        DJNZ R4,D2
        RET

        end

⌨️ 快捷键说明

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