欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 关于汇编语言与程序设计——单总线温度采集与显示的应用

关于汇编语言与程序设计——单总线温度采集与显示的应用

2025/5/9 10:48:38 来源:https://blog.csdn.net/m0_73185872/article/details/147803097  浏览:    关键词:关于汇编语言与程序设计——单总线温度采集与显示的应用

一、实验要求

(1)握码管的使用方式

(2)掌握DS18B20温度传感器的工作原理

(3)掌握单总线通信方式实现 MCU与DS18B20数据传输

二、设计思路

1.整体思路

  通过编写数码管显示程序和单总线温度采集程序,结合温度传感报警,利用手指触碰传感器,当温度超过阈值时开启蜂鸣器报警。

2.流程图

3.主要模块设计思路及分析

1判断温度是否达到阈值

(2)蜂鸣器子程序

三、 实现效果

T0子程序设置高低位温度

查表转换温度值

判断温度是否达到阈值:设置阈值为30度,达到则跳转蜂鸣器报警

蜂鸣器子程序

实现效果:

室温时显示26度

当升温至30度则会报警

四、总结

在这次实验中,我学习了如何通过DS18B20温度传感器来采集和显示温度。我了解到,DS18B20是一种常用的数字温度传感器,它可以通过单总线通信方式与MCU进行数据传输。这种方式相比于传统的模拟温度传感器,具有更高的精度和可靠性。

在实验过程中,我遇到了一些困难,例如如何正确地连接编码器和DS18B20传感器,以及如何编写相应的程序来读取和显示温度。最开始当达到设置的阈值时,蜂鸣器不会报警响应,在询问同学后我添加了一个DEL子程序来控制蜂鸣子程序的响应。

附录:

DAT		BIT		P3.7  ;定义DQ线
swpH	EQU		0D2H	
swpL	EQU		0EFH	
WDLSB	DATA	30H		;定义温度低字节
WDMSB	DATA	31H		;定义温度高字节
ORG		0000H
LJMP	MAIN
ORG		000BH
LJMP	T0_INT
ORG		0100HVALUE:	DB 3FH, 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;共阴极
T0_INT: MOV	TH0, #swpHMOV	TL0, #swpLPUSH ACC 		 ;A进栈保护LCALL ALARM 		 ;判断是否达到温度阈值JB	21H,dsl 	 ;判断输出温度高位还是低位MOV	R1,42H		 ;高位温度放至R1MOV DPTR, #100HLCALL LOOP2 	 ;循环,使DPTR变为相应温度位的值,再通过查表形式获得对应温度段码MOV A, #0HMOVC A, @A+DPTRMOV P0, A		 ;将高位温度传至P0MOV P2, #1CHPOP ACC 		 ;出栈ACC完成对ACC的保护SJMP kkk
dsl:MOV R1,43H		 ;低位温度放至R1MOV DPTR, #100HLCALL LOOP2MOV A, #0HMOVC A, @A+DPTRMOV P0, A		 ;低位温度传至R2MOV P2, #18HPOP ACC 		
LOOP2:				 ;将DPTR变至响应温度的值DEC R1INC DPTRCJNE R1, #0FFH, LOOP2 RET
kkk:CPL	21H 			;21H取反RETI 				;中断返回
MAIN:CLR EA				;关中断MOV TMOD,#01H		;设置T0初始化MOV TH0,#swpH		;装入定时器10ms中断的定时常数MOV TL0,#swpL		;SETB EA		  		;开中断SETB ET0	  		;允许定时器T0中断SETB TR0	  		;启动定时器T0计数MOV R2,#2			;MOV R0,#42H			;2个显示缓冲单元42H和43H清0
OVER:			  MOV @R0,#00H		INC R0				;指针R0指向43HDJNZ R2,OVER
LOOP:				LCALL DSWD			;调用读出温度子程序SJMP LOOP
DSWD:LCALL RSTSNR		;调用复位子程序JNB F0,KEND			;未应答则跳转KENDMOV R0,#0CCH   		;跳过ROM匹配指令LCALL SEND_BYTE	 	;发送一字节跳过ROM匹配命令MOV R0,#44H	   		;温度转换命令LCALL SEND_BYTE		;发送一字节温度转换指令SETB EAMOV 48H,#1		 	;延时75ms以上准备读
SS2:MOV 49H,#255
SS1:MOV 4AH,#255
SS0:DJNZ 4AH,SS0		DJNZ 49H,SS1DJNZ 48H,SS2CLR EALCALL RSTSNRJNB F0,KENDMOV R0,#0CCH		 ;跳过ROM匹配命令LCALL SEND_BYTEMOV R0,#0BEH	 	 ;温度命令BEHLCALL SEND_BYTE		 ;发出一字节读温度命令LCALL READ_BYTE	 	 ;读一字节的温度值MOV WDLSB,A			 ;读一字节的温度值(低字节)LCALL READ_BYTE	 	 ;读一字节的温度值MOV WDMSB,A			 ;读一字节的温度值(高字节)LCALL TRANS12	 	 ;调用温度转换子程序
KEND:SETB EARET
TRANS12:		  MOV A,30H			 ;温度转换子程序ANL A,#0F0HMOV 3AH,AMOV A,31HANL A,#0FHORL A,3AHSWAP AMOV B,#10DIV ABMOV 43H,BMOV B,#10DIV ABMOV 42H,BMOV 41H,ARETSEND_BYTE:MOV A,R0			 ;发送一个字节的子程序MOV R5,#8
SEN3:CLR CRRC AJC SEN1LCALL WRITE_0SJMP SEN2
SEN1:LCALL WRITE_1
SEN2:DJNZ R5,SEN3		 ;循环八次发送一个字节 RETREAD_BYTE:MOV R5,#8			 ;读一个字节的子程序
READ1:LCALL READRRC ADJNZ R5,READ1		 ;循环八次读一个字节MOV R0,ARET
RSTSNR:SETB DAT			 ;复位程序NOPNOPCLR DATMOV R6,#250			 DJNZ R6,$MOV R6,#50DJNZ R6,$SETB DAT			 ;主机释放总线,IO口改为输入MOV R6,#15DJNZ R6,$CALL CHCK			 ;调用应答子程序MOV R6,#60DJNZ R6,$SETB DATRET
CHCK:MOV C,DATJC RST0SETB F0				 ;检测到信号置为F0SJMP CHCK0
RST0:CLR F0				 
CHCK0:RET
WRITE_0:CLR DAT				 ;写0子程序MOV R6,#30DJNZ R6,$SETB DATRET
WRITE_1:				 ;写1子程序CLR DATNOPNOPNOPNOPNOPSETB DATMOV R6,#30DJNZ R6,$RETREAD:					 ;读一位数据子程序SETB DATNOPNOPCLR DATNOPNOPSETB DAT			 ;置位DAT准备接收数据NOPNOPNOPNOPNOPNOPNOPMOV C,DATMOV R6,#23DJNZ R6,$RETALARM:					;判断温度是否达到阈值,设置温度阈值为30MOV A, 43HSUBB A, #00HMOV A, 42HSUBB A, #03H	   JNC BUZZER 			CLR CRETBUZZER: 				;蜂鸣器响应子程序MOV R1,#0FFHCPL P2.5LCALL DELRET

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词