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

📄 text1.asm

📁 基于ds18b20的温度测量 串口该并口74ls164数码显示
💻 ASM
字号:
	LED_SDA	BIT	P0.0
	LED_CLK	BIT	P0.1
	TEMP	BIT	P2.0


	COM1	BIT	P0.2
	COM2	BIT	P0.3
	COM3	BIT	P0.4
	COM4	BIT	P0.5
	COM5	BIT	P0.6
	COM6	BIT	P0.7
	HTEMP	EQU	32H
	LTEMP	EQU	33H

;***********************************主程序********************************************
	ORG	0000H
	AJMP	MAIN

	ORG	0030H
MAIN:	
	LCALL	RESET			;要求给18B20复位
	MOV	A,#0CCH			;跳过匹配
	LCALL	WRITE
	MOV	A,#44H			;启动温度转换
	LCALL	WRITE
	LCALL	RESET			;要求给18B20复位
	MOV	A,#0CCH			;跳过匹配
	LCALL	WRITE
	MOV	A,#0BEH			;读18B20的内容的命令
	LCALL	WRITE
	LCALL	READ
	LCALL	CHTEMP			;处理温度
	LCALL	DISP
	AJMP	MAIN

;********************************RESET**********************************************
RESET:
	CLR	TEMP
	MOV	R4,#240			;延时480US,最小值为480
	DJNZ	R4,$
	SETB	TEMP			;释放总线
	MOV	R3,#30			;设置112~60US的延时
	DJNZ	R3,$					
					;延时16US,等待18B20的回应
CHECK:	JNB	TEMP,SETF		;判断18B20是否做出回应,等待时间为60-240US回应则将P1口的灯点亮
	MOV	R4,#60
	DJNZ	R4,CHECK
	CLR	P3.1			;否则将启动蜂鸣器报警,将灯熄灭
	MOV	P1,#0FFH
	SETB	TEMP
	SJMP	RESET
SETF:	MOV	P1,#00H
	SETB	P3.1
	MOV	R3,#120			;延时240US,最小值为60
D2:	DJNZ	R3,D2
	RET

;******************************************WRITE**********************************************
WRITE:	MOV 	R2,#8			;一共8位数据
	CLR 	C
LOOP1:	CLR 	TEMP			;在此后的15~60US内18B20将会对总线采样
	MOV 	R3,#8			;延时15US	 				
	DJNZ 	R3,$

	RRC 	A
	MOV 	TEMP,C				
	MOV 	R3,#22			;延时45US,数据已经送到总线,应该等待,直到下降沿出现后的60US
	DJNZ 	R3,$
	SETB 	TEMP

	DJNZ	R2,LOOP1
	SETB 	TEMP
	RET
;**********************************************  READ  *************************************************
READ:
	MOV	R4,#2 			; 将温度高位和低位从DS18B20中读出
	MOV	R1,#31H 		; 低位存入31H(TEMPER_L),高位存入30H(TEMPER_H),先读的是低字节
RE00:
	MOV	R2,#8			;数据一共有8位
	CLR	C			;清除C的内容  
RE01:
	
	SETB	TEMP
	NOP
	NOP
	CLR	TEMP
	MOV	R3,#8
	DJNZ	R3,$			;延时15秒
	NOP
	NOP
	NOP
	SETB	TEMP
	MOV	C,TEMP			;主机采样
	
	MOV 	R3,#23			;延时45秒
	DJNZ 	R3,$

	RRC 	A
	DJNZ 	R2,RE01	
	MOV	@R1,A			;低8位读完,存入31H
	
	DEC 	R1
	DJNZ	R4,RE00			;高8读完,寸28H
	RET

;**************************************CHTEMP****************************
CHTEMP:
	MOV	A,31H			;字节0的内容放在31H
	ANL 	A,#0F0H			;屏蔽小数部分
	SWAP 	A			;高低字节交换
	MOV 	R7,A

	MOV 	A,30H			;字节1的内容放在30H
	ANL 	A,#0FH			;屏蔽S
	SWAP 	A
	ORL 	A,R7
	MOV 	HTEMP,A			;整数部分BCD
	
	MOV 	A,31H			
	ANL 	A,#0FH			;SI低字节的低4位,即小数部分
	MOV 	DPTR,#DOTTAB		;将小数部分模拟转换为相应的BCD码
	MOVC 	A,@A+DPTR
	MOV 	LTEMP,A			;小数部分的BCD
	RET

	
;****************************************显示程序*********************************************
DISP:	
	LP1:	MOV 	R6,#255			;Display 255 times

LP2:	MOV	A,HTEMP			;处理整数部分
	MOV	B,#10
	DIV	AB
	MOV 	DPTR,#TAB		;显示十位
	MOVC	A,@A+DPTR
	LCALL	SEND
	CLR	COM1
	LCALL	DL1MS
	SETB	COM1
	
	MOV	DPTR,#DAB		;显示个位							
	MOV	A,B	
	MOVC	A,@A+DPTR
	LCALL	SEND
	CLR	COM2
	CALL	DL1MS
	SETB	COM2

	MOV	A,LTEMP			;处理小数部分
	MOV	B,#10
	DIV	AB
	MOV 	DPTR,#TAB		;显示小数部分
	MOV	A,B
	MOVC 	A,@A+DPTR
	LCALL	SEND
	CLR	COM3
	LCALL	DL1MS
	SETB	COM3
			
	DJNZ	R6,LP2
	RET

;-------------Emulate SBUF SEND BYTE---------------
SEND:
	CLR	C
	MOV	R7,#08H
DUP:	RLC	A
	MOV	LED_SDA,C
	CLR	LED_CLK
	SETB	LED_CLK
	DJNZ	R7,DUP
	RET
;--------------DELAY 1MS----------------------
DL1MS:
	MOV 	R7,#125	
	DJNZ	R7,$
	RET
TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H		;不带小数点0~9
DAB:	DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H		;带小数点


;******************************小数的显示模拟取值***********************************

DOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H,05H,05H,06H
	DB 06H,07H,08H,08H,09H,09H
	END

⌨️ 快捷键说明

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