一、实验要求
(1)握码管的使用方式
(2)掌握DS18B20温度传感器的工作原理
(3)掌握单总线通信方式实现 MCU与DS18B20数据传输
二、设计思路
1.整体思路
通过编写数码管显示程序和单总线温度采集程序,结合温度传感报警,利用手指触碰传感器,当温度超过阈值时开启蜂鸣器报警。
2.流程图
3.主要模块设计思路及分析
(1)判断温度是否达到阈值
(2)蜂鸣器子程序
三、 实现效果
室温时显示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 0100H
VALUE:
DB 3FH, 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;共阴极
T0_INT:
MOV TH0, #swpH
MOV TL0, #swpL
PUSH ACC ;A进栈保护
LCALL ALARM ;判断是否达到温度阈值
JB 21H,dsl ;判断输出温度高位还是低位
MOV R1,42H ;高位温度放至R1
MOV DPTR, #100H
LCALL LOOP2 ;循环,使DPTR变为相应温度位的值,再通过查表形式获得对应温度段码
MOV A, #0H
MOVC A, @A+DPTR
MOV P0, A ;将高位温度传至P0
MOV P2, #1CH
POP ACC ;出栈ACC完成对ACC的保护
SJMP kkk
dsl:
MOV R1,43H ;低位温度放至R1
MOV DPTR, #100H
LCALL LOOP2
MOV A, #0H
MOVC A, @A+DPTR
MOV P0, A ;低位温度传至R2
MOV P2, #18H
POP ACC
LOOP2: ;将DPTR变至响应温度的值
DEC R1
INC DPTR
CJNE 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指向43H
DJNZ R2,OVER
LOOP:
LCALL DSWD ;调用读出温度子程序
SJMP LOOP
DSWD:
LCALL RSTSNR ;调用复位子程序
JNB F0,KEND ;未应答则跳转KEND
MOV R0,#0CCH ;跳过ROM匹配指令
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 ;温度命令BEH
LCALL SEND_BYTE ;发出一字节读温度命令
LCALL READ_BYTE ;读一字节的温度值
MOV WDLSB,A ;读一字节的温度值(低字节)
LCALL READ_BYTE ;读一字节的温度值
MOV WDMSB,A ;读一字节的温度值(高字节)
LCALL TRANS12 ;调用温度转换子程序
KEND:
SETB EA
RET
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 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 ;循环八次发送一个字节
RET
READ_BYTE:
MOV R5,#8 ;读一个字节的子程序
READ1:
LCALL READ
RRC A
DJNZ R5,READ1 ;循环八次读一个字节
MOV R0,A
RET
RSTSNR:
SETB DAT ;复位程序
NOP
NOP
CLR DAT
MOV R6,#250
DJNZ R6,$
MOV R6,#50
DJNZ R6,$
SETB DAT ;主机释放总线,IO口改为输入
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
CHCK0:
RET
WRITE_0:
CLR DAT ;写0子程序
MOV R6,#30
DJNZ R6,$
SETB DAT
RET
WRITE_1: ;写1子程序
CLR DAT
NOP
NOP
NOP
NOP
NOP
SETB DAT
MOV R6,#30
DJNZ R6,$
RET
READ: ;读一位数据子程序
SETB DAT
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
ALARM: ;判断温度是否达到阈值,设置温度阈值为30
MOV A, 43H
SUBB A, #00H
MOV A, 42H
SUBB A, #03H
JNC BUZZER
CLR C
RET
BUZZER: ;蜂鸣器响应子程序
MOV R1,#0FFH
CPL P2.5
LCALL DEL
RET