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

📄 ds18b20.asm

📁 达盛单片机试验箱
💻 ASM
字号:
;单总线读写操作
;温度传感器DS1820 的汇编程序
;一次数据传输为四步:初始化、传送ROM命令、传送RAM命令、数据交换
;当命令者检测到器件存在时首先发送1个ROM命令
;1、读ROM(总线上只有一个器件时读出序列号)2、匹配ROM(总线上有多个时寻址器件)
;3、查找ROM(系统首次启动后识别总线上的各器件)4、跳过R0M(总线上只有一个器件时
;可跳过读ROM直接向器件发送命令)5、超速匹配ROM 6、超速跳过 ROM 7、条件查找 ROM
;总线信号:初始化、写1、写0、读信号
TEMPER_L 		DATA 	36H					;温度寄存器的低位
TEMPER_H 		DATA	35H					;温度寄存器的高位
TEMPER_NUM 		DATA 	60H					;保存温度值
FLAG 			BIT 	00H					;器件是否存在的标志位,器件存在由软件置1,否则清0
DQ	 			BIT 	P1.0	

				ORG		0000H
				
				AJMP	START
;
;*****************************************************************************
;				/*主程序*/													 *
;*****************************************************************************		
;	
				ORG		0030H
				
START: 			MOV 	SP,#70H
				CALL 	GET_TEMPER			;读取温度值
				CALL 	TEMPER_COV			;读取转换后的温度值
				MOV		R0,A
				CALL	DISP
				CALL	DELAY
				AJMP	START
;
;*****************************************************************************
;				/*取得温度子程序*/											 *
;*****************************************************************************
;
GET_TEMPER:		SETB 	DQ 
				CALL	CHECK				; 
				MOV 	A,#0CCH 			; 跳过ROM匹配(当总线上只有一个器件时可跳过读ROM命令)
				CALL 	DSWRITE				; 写入命令
				MOV 	A,#44H 				; 发出温度转换命令
				CALL 	DSWRITE
				NOP
				CALL 	DELAY
				CALL 	DELAY
				CALL	CHECK	
				MOV 	A,#0CCH 			; 跳过ROM匹配
				CALL 	DSWRITE	
				MOV 	A,#0BEH 			; 发出读温度命令
				CALL 	DSWRITE
				CALL 	DSREAD				;读取温度的低位
				MOV		R0,#TEMPER_L
				MOV		@R0,A				;存入TEMPER_L
				CALL	DSREAD				;读取温度的低位
				DEC		R0					;存入TEMPER_H
				MOV		@R0,A
				RET
;
;*****************************************************************************
;	/*读DS18B20的程序,从DS18B20中读出一个字节的数据*/						 *
;*****************************************************************************
;	
DSREAD:			MOV 	R2,#8
READ1:			CLR 	C
				SETB 	DQ
				NOP
				NOP
				CLR 	DQ
				NOP
				NOP
				NOP
				SETB 	DQ
				MOV 	R3,#01
				DJNZ 	R3,$
				MOV 	C,DQ
				MOV 	R3,#23
				DJNZ	R3,$
				RRC 	A
				DJNZ 	R2,READ1
				RET
;
;*****************************************************************************
;				/*写DS18B20序子程序*/									     *
;*****************************************************************************		
;	
DSWRITE:		MOV 	R2,#8
				CLR 	C
WRITE1:			CLR 	DQ
				MOV 	R3,#6				;延时12US
				DJNZ 	R3,$
				RRC		A
				MOV 	DQ,C
				MOV 	R3,#23				;46US
				DJNZ 	R3,$
				SETB 	DQ
				NOP
				DJNZ 	R2,WRITE1
				SETB 	DQ
				RET
;
;*****************************************************************************
;				/*温度转换程序*/											 *
;*****************************************************************************		
;	
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			;D3为1则加1,为0则舍去
TEMPER_COV1:	MOV 	A,TEMPER_H			; 高位
				ANL 	A,#07H				;温度寄存器的高字节只有后3位有效
				SWAP 	A
				ORL 	A,TEMPER_NUM		; 拼装
				MOV 	TEMPER_NUM,A 		; 保存变换后的温度数据
				CALL 	BIN_BCD
				RET
;	
;*****************************************************************************
;				/*检查器件是否存在子程序*/									 *
;*****************************************************************************		
;	
CHECK:			CALL 	DSINIT				; 初始化
				JB 		FLAG,CHECK1			; 检查标志位判断器件是否存在
				AJMP 	CHECK 				; 若DS18B20不存在则继续检测
CHECK1:			CALL 	DELAY1
				RET		
;		
;*****************************************************************************
;				/*BCD码转换子程序*/											 *
;*****************************************************************************			
;	
BIN_BCD:		MOV 	DPTR,#TEMP_TAB
				MOV 	A,TEMPER_NUM
				MOVC 	A,@A+DPTR
				MOV 	TEMPER_NUM,A
				RET
;				
;*****************************************************************************
;				/*初始化子程序程序*/
;初始化时序是由总线发出一个复位信号,然后由器件发							 *
;出一个应答信号,表示该器件存在,并准备好开始工作
;*****************************************************************************		
;
DSINIT:			SETB 	DQ
				NOP
				CLR 	DQ					;总线发一个复位信号
				MOV 	R0,#80H
				DJNZ 	R0,$				; 延时
				SETB 	DQ					;拉高总线准备检测
				MOV 	R0,#25H 			;延时
				DJNZ 	R0,$
				JNB 	DQ,INIT2			;检测是否有应答信号,有应答信号跳转
				AJMP 	INIT3 				; 延时
INIT2:			SETB 	FLAG 				; 置标志位,表示DS1820存在
				AJMP 	INIT4
INIT3:			CLR 	FLAG 				; 清标志位,表示DS1820不存在
				AJMP 	INIT5
INIT4:			MOV 	R0,#6BH 		
				DJNZ 	R0,$				; 延时
INIT5:			SETB 	DQ					;拉高总线
				RET
;				
;*****************************************************************************
;				/*配置程序*/												 *
;*****************************************************************************			
;	
RE_CONFIG:		JB 		FLAG,RE_CONFIG1		; 若DS18B20存在,转RE_CONFIG1
				RET
RE_CONFIG1:		MOV 	A,#0CCH 			; 发SKIP ROM命令
				CALL 	DSWRITE
				MOV 	A,#4EH 				; 发写暂存存储器命令
				CALL 	DSWRITE
				MOV 	A,#00H 				; TH(报警上限)中写入00H
				CALL 	DSWRITE
				MOV 	A,#00H 				; TL(报警下限)中写入00H
				CALL 	DSWRITE	
				MOV 	A,#7FH 				; 选择12位温度分辨率
				CALL	DSWRITE	
				RET		
;		
;*****************************************************************************
;				/*显示子程序*/												 *
;*****************************************************************************
;
DISP:			MOV		A,R0				;转换结果低位
				ANL		A,#0FH
				ACALL	DSEND				;显示
				MOV		A,R0
				SWAP	A
				ANL		A,#0FH				;转换结果高位
				ACALL	DSEND				;显示
				RET

DSEND:			MOV		DPTR,#SGTB1
				MOVC	A,@A+DPTR			;取字符
				MOV		SBUF,A
				JNB		TI,$
				CLR		TI		
				RET
;	
;*****************************************************************************
;				/*延时程序*/												 *
;*****************************************************************************	
;		
DELAY:			MOV		R7,#00H
DELAY0:			MOV		R6,#00H
				DJNZ	R6,$
				DJNZ	R7,DELAY0
				RET

DELAY1: 		MOV 	R7,#20H				
				DJNZ 	R7,$
				RET
;	
;*****************************************************************************
;				/*字符编码*/												 *
;*****************************************************************************
;				
SGTB1:     		DB	     03H         		;0
	   			DB	     9FH         		;1
	   			DB	     25H         		;2
			  	DB	     0DH         		;3
			  	DB	     99H          		;4
			 	DB	     49H          		;5
			 	DB	     41H          		;6
			   	DB	     1FH         		;7
			   	DB	     01H          		;8
			   	DB	     09H          		;9
			   	DB	     11H          		;A
			   	DB	     0C1H          		;B
			   	DB	     63H         		;C
			   	DB	     85H         		;D
			  	DB	     61H         	 	;E
			   	DB	     71H        	 	;F
			   	DB	     00H				

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

				END

⌨️ 快捷键说明

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