在本文中,单片机开发工程师分享了一个基于8051单片机开发的湿度计,这个方案比较简单,以供单片机初学者学习。
湿度传感器也称为湿度计,在本单片机方案中,其电路可以以5%的精度感测20%至95%的相对湿度(RH),湿度信息可以显示在16×2 LCD显示屏上。另外,在本单片机方案中,还提供了一个继电器,也就是说当湿度超过某个跳变点时,该继电器将被激活,执行某些操作。
一、DHT11湿度传感器
DHT11是一款低成本的湿度兼温度传感器,具有数字输出。电容法用于感测湿度,而热敏电阻用于测量温度。传感器可以以5%的分辨率感测20%至95%的相对湿度。温度测量最高可达50°C,分辨率为2°C。与单片机的通信是通过单线进行的。下图为基本的通信方案:
与DHT11传感器的来回通信非常容易。DHT11的引脚2连接到单片机的端口引脚。连接方案如下图所示,DHT11的数据引脚(引脚2)需要一个外部10K上拉电阻。
其通信协议原理如下,单片机首先将宽度为18mS的低电平信号发送到DHT11。收到此信号后,单片机拉起通信线,等待DHT11的响应。它最多需要2到40uS。然后DHT11拉低通讯线,并保持低电平80usS。然后DHT11拉高线路,并保持高电平80uS。然后DHT将线拉低50uS,下一个高脉冲将成为数据的第一位。数据以8位突发发送。脉冲串的每个高脉冲表示一个数据信号。数据位之间的50uS低信号只是间隔。数据位的逻辑通过测量其宽度来确定。26至28uS宽的脉冲表示“低”,而70uS宽的脉冲表示“高”。简单来说窄于50uS的脉冲可被视为“低”,宽于50us的脉冲可被视为“高”。数据脉冲串的前8位代表相对湿度的整数值,后8位代表相对湿度的十进制值,后8位代表温度数据的整数值,后8位代表十进制值对于DHT11,十进制值始终为零,我们仅在此方案中测量相对湿度。因此,我们只需要关注数据的前8位,这是相对湿度数据的组成部分。下图显示了湿度传感器的电路图。后8位代表相对湿度的十进制值,后8位代表温度数据的整数值,后8位代表温度数据的十进制值,对于DHT11,十进制值始终为零,我们正在测量仅在此方案中的相对湿度。因此,我们只需要关注数据的前8位,这是相对湿度数据的组成部分。下图显示了湿度传感器的电路图。后8位代表相对湿度的十进制值,后8位代表温度数据的整数值,后8位代表温度数据的十进制值,对于DHT11,十进制值始终为零,我们正在测量仅在此方案中的相对湿度。因此,我们只需要关注数据的前8位,这是相对湿度数据的组成部分。下图显示了湿度传感器的电路图。因此,我们只需要关注数据的前8位,这是相对湿度数据的组成部分。下图显示了湿度传感器的电路图。因此,我们只需要关注数据的前8位,这是相对湿度数据的组成部分。下图为湿度传感器的电路图:
湿度传感器DHT11连接到8051单片机的P3.1。R8拉起DHT11和8051之间的通信线。该继电器由单片机的P2.0驱动。晶体管Q1切换继电器。R0是上拉电阻,R7限制Q1的基极电流。D5只是一个续流二极管。LCD显示器的数据线连接到单片机的端口0。控制线RS,R/E和E分别连接到单片机的P2.7,P2.6和P2.5引脚。R4设置显示的对比度。R5限制流过背光LED的电流。C9是一个旁路电容器。C8、C10和X1与时钟电路相关联。C11、R6和S2构成复位电路。
二、源代码
RS EQU P2.7
RW EQU P2.6
E EQU P2.5
ORG 000H
MOV DPTR,#LUT
SETB P3.5
CLR P2.0
MOV TMOD,#00100001B
MOV TL1,#00D
ACALL DINT
ACALL TEXT1
MAIN: MOV R1,#8D
SETB P3.5
CLR P3.5
ACALL DELAY1
SETB P3.5
HERE:JB P3.5,HERE
HERE1:JNB P3.5,HERE1
HERE2:JB P3.5,HERE2
LOOP:JNB P3.5,LOOP
RL A
MOV R0,A
SETB TR1
HERE4:JB P3.5,HERE4
CLR TR1
MOV A,TL1
SUBB A,#50D
MOV A,R0
JB PSW.7, NEXT
SETB ACC.0
SJMP ESC
NEXT:CLR ACC.0
ESC: MOV TL1,#00D
CLR PSW.7
DJNZ R1,LOOP
ACALL DINT
ACALL TEXT1
ACALL LINE2
ACALL TEXT2
ACALL HMDTY
ACALL CHECK
ACALL DELAY2
LJMP MAIN
DELAY1: MOV TH0,#0B9H
MOV TL0,#0B0H
SETB TR0
HERE5: JNB TF0,HERE5
CLR TR0
CLR TF0
RET
DELAY2:MOV R1,#112D
BACK:ACALL DELAY1
DJNZ R1,BACK
RET
CHECK:MOV A,R0
MOV B,#65D
SUBB A,B
JB PSW.7,NEXT1
ACALL TEXT3
SETB P2.0
SJMP ESC1
NEXT1:ACALL TEXT4
CLR P2.0
ESC1:CLR PSW.7
RET
CMD: MOV P0,A
CLR RS
CLR RW
SETB E
CLR E
ACALL DELAY
RET
DISPLAY:MOV P0,A
SETB RS
CLR RW
SETB E
CLR E
ACALL DELAY
RET
HMDTY:MOV A,R0
MOV B,#10D
DIV AB
MOV R2,B
MOV B,#10D
DIV AB
ACALL ASCII
ACALL DISPLAY
MOV A,B
ACALL ASCII
ACALL DISPLAY
MOV A,R2
ACALL ASCII
ACALL DISPLAY
MOV A,#“%”
ACALL DISPLAY
RET
TEXT1: MOV A,#“H”
ACALL DISPLAY
MOV A,#“y”
ACALL DISPLAY
MOV A,#“g”
ACALL DISPLAY
MOV A,#“r”
ACALL DISPLAY
MOV A,#“o”
ACALL DISPLAY
MOV A,#“m”
ACALL DISPLAY
MOV A,#“e”
ACALL DISPLAY
MOV A,#“t”
ACALL DISPLAY
MOV A,#“e”
ACALL DISPLAY
MOV A,#“r”
ACALL DISPLAY
RET
TEXT2: MOV A,#“R”
ACALL DISPLAY
MOV A,#“H”
ACALL DISPLAY
MOV A,#“ ”
ACALL DISPLAY
MOV A,#“=”
ACALL DISPLAY
MOV A,#“ ”
ACALL DISPLAY
RET
TEXT3: MOV A,#“ ”
ACALL DISPLAY
MOV A,#“ ”
ACALL DISPLAY
MOV A,#“O”
ACALL DISPLAY
MOV A,#“N”
ACALL DISPLAY
RET
TEXT4:MOV A,#“ ”
ACALL DISPLAY
MOV A,#“O”
ACALL DISPLAY
MOV A,#“F”
ACALL DISPLAY
MOV A,#“F”
ACALL DISPLAY
RET
DINT:MOV A,#0CH
ACALL CMD
MOV A,#01H
ACALL CMD
MOV A,#06H
ACALL CMD
MOV A,#83H
ACALL CMD
MOV A,#3CH
ACALL CMD
RET
LINE2:MOV A,#0C0H
ACALL CMD
RET
DELAY: CLR E
CLR RS
SETB RW
MOV P0,#0FFH
SETB E
MOV A,P0
JB ACC.7,DELAY
CLR E
CLR RW
RET
ASCII: MOVC A,@A+DPTR
RET
LUT: DB 48D
DB 49D
DB 50D
DB 51D
DB 52D
DB 53D
DB 54D
DB 55D
DB 56D
DB 57D
END