一、实验要求
(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
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |