一、实验要求
(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