前言+ M: [2 x! G2 H. d9 t1 S/ b! S
今天主要讲到DHT11温湿度传感器的应用,该传感器适用于多个场景,用途比较广泛,主要用来测量温度和湿度,其实对于单纯测量温度我们可以直接采用dsb18b20温度传感器,但是注意引脚接法,之前我不注意接反了,结果烧的······一碰手都直接起泡哈哈,好了,废话不讲,进入主题1 h9 s+ `* Y/ m* G' |0 b
, k- G1 x# q5 Q) M! ?9 y+ {2 s9 Z7 J一、DHT11温湿度传感器
% v. o( P: v0 t ZDHT11传感器有四个接口,即VCC、GND、DATA、NC,那么首先要怎么接呢?其实这里面我们主要的就是接DATA这个口就行了,VCC、GND就不用多说了,NC端不接,悬空NC端即可,正常模块也是只有3个引脚引出来,所以只需要设定一个端口来与DATA互联就可以了! f- b! Y% V2 B( B' b# _& N
( x# u9 d. S" Y3 {) O, v% d3 K+ I) T
) m0 I% H2 b, g; J6 Z6 Y: a/ F& s0 w3 h/ n* c# L7 C; U1 i; e
我们发现实际上也就是如我上面所说的,它的四个引脚只需要利用三个就行了,而且该模块还有一块电源指示灯,当工作时会亮起。下面为原理图:
& M7 g+ G# Q, F$ P- T
6 F, u5 l% m- u$ F; @
# g0 |' `& B$ s& P7 h0 T, N8 f. k+ ?( F8 n
那么在这里DATA只要随意连上STM32上一端口(下面我用到了PA11),设置为推挽输出即可,就可以实现数据互联。
& M- c+ ^$ t# a6 K+ w
8 v4 Q1 r8 c; j9 S, X" \
1 E& ]+ c) J" J3 t+ a1 N 下面这里主要是对输出的流程的讲解,实际上如果看不懂也没事,后面可以通过代码加深对这几段话的理解! O" S1 G4 D) X& ~
f3 l5 Q0 `" h2 f6 _6 t, f
S9 a' @ V( k$ E% E; U& w8 ]) w1 l; y6 h5 l- D
二、实现测量主程序4 w) D; e6 h& C- L0 d
DHT11函数(wenshi.c)
1 R6 E& d" @( j9 R
# E. [- p. r4 t1 C d0 a- #include "delay.h"
* a; t+ R' k0 z( Q - #include "wenshi.h", | z3 c( b+ j$ @3 J% d
- ( a% k- C! B' [4 c9 h c0 N1 f3 e* L
- #define DT GPIO_Pin_11# o( s8 X- z" ^ V( G/ u
- 4 W: K$ s. o) ^2 K8 Z
- //复位DHT11
4 i0 ~" e/ S' C% `4 @ - void DHT11_Rst(void)
- _) R& S: U( @0 I2 @" } - { 3 g1 U% d: S- k% Z" }9 w
- DHT11_IO_OUT(); //SET OUTPUT. u- G6 X. Y/ Q5 n
- DHT11_DQ_OUT=0; //拉低
/ F9 ]; R& H G( V2 Q; t - delay_ms(20); //拉低延时至少18ms
7 Y1 u7 s2 s. b( t4 h - DHT11_DQ_OUT=1; //DQ=1,拉高 2 t7 N: b) @% Z( e$ V7 ]
- delay_us(30); //拉高延时至少20~40us: Z8 r6 T$ I K* ~/ }8 k6 n
- }& Y2 S2 A/ W8 v
- ! Z( q X; e& h4 ? t, A0 A) b
- //检测回应7 y7 _+ v4 J& L& i+ Y% x6 K6 S( ^
- //返回1:检测错误
r+ Z& _& }9 u* h t' K2 K - //返回0:检测成功
8 @# h$ |; G F" {* N+ s- v6 H - u8 DHT11_Check(void) 0 \7 E& A* [, J+ [
- { ' R, W/ p5 z% e5 ]$ f
- u8 retry=0;; z6 V; y; T& J1 z5 h
- DHT11_IO_IN();//SET INPUT , y# {! S( h5 l. E
- while (DHT11_DQ_IN&&retry<100)//DHT11拉低40~80us" _2 u) W& Z& ~$ W0 D7 O
- {" o: M( v. M- X; u; O; X' w
- retry++;4 F7 K3 n2 F" z6 D
- delay_us(1);- t/ a& Y2 G7 f
- }; $ b3 C! F$ v3 `" Z
- if(retry>=100)return 1;
w: |/ ]8 a. Q; T. M7 ^ - else retry=0;: P$ m1 w' f2 q$ H! w
- while (!DHT11_DQ_IN&&retry<100)//DHT11再次拉高40~80us4 J; z* X7 `% T( _# A# w
- {0 @! ^# }# f) S" ^4 U& T
- retry++;
4 o* @( E) B3 {1 Y4 F$ w2 |/ @ d - delay_us(1);/ p4 N) _6 H' w9 X
- };
z M0 x/ F+ G3 |! u+ n+ U - if(retry>=100)return 1; / o, f) F" ~) g- {; C
- return 0;
0 v' e3 T- E3 h - }
[% Z1 ?* N( a4 {3 N! f* H
# r/ w: W. r, |8 d2 { Z2 s- //读取一个位Bit8 K7 u8 B7 i2 m% w9 |5 _
- //返回1或0" g* s$ Y, O, c, r; E9 s0 R
- u8 DHT11_Read_Bit(void) $ R2 G# Z' s/ r) j x; `5 e0 u
- {
3 ?; q. a1 ?# c( @ - u8 retry=0;
' ~5 ?; p$ ?* h" q - while(DHT11_DQ_IN&&retry<100)//等待变低电平/ W! {5 U; k( p" W
- {4 v0 i2 e3 K9 c# G) i8 k* K) S
- retry++;9 t4 T% q7 s1 q. z, t
- delay_us(1);: ?: D% e, ~4 Q) ^8 t4 v
- }
8 U! o2 v. |) p/ P0 c3 E - retry=0;
# o# ]2 s% c+ h! z9 D5 `0 a - while(!DHT11_DQ_IN&&retry<100)//等待变高电平
6 t. q( k% ^7 Z9 } - {/ S2 T* m# q& L' A& {: @
- retry++;
' V7 M. \6 o6 |+ y$ V, d; y1 j& B* U - delay_us(1);
$ z6 Z9 q1 W, \! c - }2 T$ `; r+ _% a- m
- delay_us(40);//等待40us% S. h: O( ~7 L* F
- if(DHT11_DQ_IN)return 1;
! {/ v* S# a2 }3 L$ c9 _ - else return 0;
: _, s# q' p: z U# d8 u$ q' p - }
) X3 L2 Z4 A3 N6 t
- V+ n: R9 x# _- //读取一个字节
3 X; H6 } e6 d2 i5 g; J, r v1 K - //返回读到的数据* M* j( F. K5 U! o
- u8 DHT11_Read_Byte(void) : R6 l0 i0 _+ b7 c+ g
- { * Y# L& |* S) S" S" `3 Y; K4 `
- u8 i,dat;! d$ S2 f, x1 Q# j1 w) {8 w& Q1 @5 W
- dat=0;# f3 K0 a' r5 I
- for (i=0;i<8;i++)
& ?2 `) z7 g+ r- O - {1 p0 T8 m- L: S3 Q
- dat<<=1; ( }" W: E# P- u
- dat|=DHT11_Read_Bit();3 L3 C& h4 K' L1 h) A4 L( w8 K$ s
- }
+ C1 h6 f2 h0 u0 ^$ ]# _' z0 ^ - return dat;
& y9 i4 x) s5 L' s( j7 g3 s( M - }
+ y K- _ o+ _7 T
9 q$ X: a2 \( P" A1 |- //DHT11读取一次数据
+ Q/ |# d& d: L! q - //temp:温度(范围:0~50°)
) X: y- ^" J$ Y6 F @1 V; u - //humi:湿度(范围:20%~90%)
9 t* U/ w& ]& s* H! B - //tem:温度小数位
! u* \, C8 v5 l- O$ p - //hum:湿度小数位% G+ v8 H! i# s# ]( m% m/ W
- u8 DHT11_Read_Data(u8 *temp,u8 *humi,u8 *tem,u8 *hum) % T# u* ?9 i, u* i3 I9 s
- { 0 X+ E: U5 e$ y, R0 F# L9 b
- u8 buf[5];% }, D3 B0 c; ?; ~( |- E
- u8 i;
$ b% n) @6 }7 F% \ - DHT11_Rst();
4 G" N& H3 B$ O# l- x - if(DHT11_Check()==0)0 `/ ]5 g x, {
- {
5 O) `) |1 z3 w* O/ c - for(i=0;i<5;i++)//读取40位字节
$ \ s( w; w0 S- z$ T0 E | - {* f) S' }: c1 W/ }
- buf<i>=DHT11_Read_Byte();
9 z; j1 V# m' _ ]) W) |5 e4 T - }6 R+ N- c: g+ s7 T
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
' L$ [% h9 s' U3 d5 _' u - {+ y2 J9 o1 G" [' \: G- d) ^
- *humi=buf[0];
" u' y7 Z5 y( c. Y8 @ - *hum=buf[1];
8 u7 N+ a! V* w) \! h* m+ X7 [% \, i - *temp=buf[2];
8 A; t2 r4 o# O+ w7 @ - *tem=buf[3];
; l8 b4 J, L9 P' g' W - }4 a' i" i' y. J9 e6 b5 C5 K
- }. M$ U: ]% Y+ M) b1 d0 @8 r) P
- else return 1;
' l; n/ E" v. s, [" [* j - return 0; ; f( @; j: p4 |$ W
- }4 W& S8 e6 W7 C4 Z1 {4 K
5 v0 R& f* c* E6 s8 t- //初始化DHT11,同时检测是否连接上DHT11,PA11初始化- }& J) v3 o5 l4 [# }. @
- 7 f6 s7 y; g9 B; x" f
- u8 DHT11_Init(void)
& K# t" |! ~( r6 o% l, e% H7 a! k - { 9 E) B) R2 J6 j# r4 U+ L6 x9 R1 U4 \( ^
- GPIO_InitTypeDef GPIO_InitStructure; # g9 Z% D& _, j7 B4 D
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 2 I% h# r7 I; b$ L8 A9 m7 y$ _
- GPIO_InitStructure.GPIO_Pin = DT; //PA114 V+ S. @7 s! ^ h
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出. ?5 e L/ t# R
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
1 K3 [; Q& @2 e9 X8 v - GPIO_Init(GPIOA, &GPIO_InitStructure); # q: J$ G8 K0 B$ e1 H1 w
- GPIO_SetBits(GPIOA,DT); # r2 e# @6 r% r5 j( w
-
4 S2 d% s) X# K - DHT11_Rst();
7 V; d5 b: L9 l! T1 ^. v$ J% G - return DHT11_Check();
/ w, Y u9 a5 Q5 N' e - }</i>
复制代码
& h+ d) Z |- m/ i8 G* F/ g* y N! e5 Z4 ^
主函数(main.c)& n6 e) a, D! I3 i @: ~' l
i& y+ z& R, u/ k8 X, U
- #include "led.h"6 d, C: [0 w& c/ Y3 R! Q1 y
- #include "delay.h"
, {2 o$ G* ?) ?- t2 y n: G- f - #include "key.h"
$ k3 z) a; S. _: e9 d - #include "sys.h"- Q6 c6 s! ]. W' |; L T
- #include "lcd.h"
5 X0 C& _* M+ g+ h9 i+ | - #include "usart.h"
3 e. C9 Z$ p/ y$ C; r/ k - #include "wenshi.h"3 m1 w( t$ U a4 S1 J, u
- - H1 Z, R0 j' ]6 m
- u8 temp;
9 l- J" r5 h+ R- ]2 g5 I - u8 humi;
+ r. J$ s: U) A% H1 q" P - u8 tem;' q# f! ~. Z) D0 z2 Y
- u8 hum;/ ^5 @! O3 S' l- u4 E3 }; ?* x% ?' P* X
1 J: G9 c5 o6 ~7 N7 H4 l- 1 J% s! T" t9 u w
- int main(void)
3 W6 z8 q) `: l6 o7 o0 p1 g8 j9 Z - { ( j: f# n9 {! X
. E0 ]: S( ?) i( L9 f- delay_init();
* ^5 ]5 f" `; y& M6 W - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 6 _- F8 ~2 I& _5 |- c& M+ ^1 f# S6 V
- uart_init(115200); 9 m2 J4 U8 L: X6 u% F! {: F
- LED_Init(); //LED初始化! K8 T$ P! a$ A8 W z0 p) i
- LCD_Init(); //LCD初始化0 O$ e+ E c* p+ j3 Q1 {
- POINT_COLOR=RED; ; T7 s* v, f! \6 R3 r' s1 _+ v
- while(DHT11_Init())0 ^9 L+ \& L% ?8 Q$ C: m1 F( S
- {
5 w6 |. S; M+ P2 L - printf("DHT11 Error \r\n");
I1 K/ m0 Z+ Z - LCD_ShowString(20,20,210,16,16,"DHT11 Error"); h( V0 A! w) r4 \2 O3 E, x( _: d$ A
- delay_ms(1000);
( e2 U( B- S$ _% [ - }
* ~$ Q* G6 c7 H* k# g- \4 a - V) w9 |- s0 L& A
- while (1)( C O8 h/ o3 T
- {
8 D$ ^1 H- h1 C: _1 H- W - DHT11_Read_Data(&temp,&humi,&tem,&hum);//取地址& P& D. q) H' N3 E$ m) U
- 8 A8 Y2 e8 U# Q3 x% r# t8 i
- LCD_ShowString(20,40,210,16,16,"temp:"); //分别显示所要显示的温度、湿度
8 R: `- |2 l% h: a! ]- D- ~ - LCD_ShowString(20,70,200,16,16,"humi:");
, b1 m. m I: n* p' o - LCD_ShowString(90,40,110,8,16,".");: z0 p* u: i" E* g% L
- LCD_ShowString(90,70,100,8,16,".");; T1 P6 E0 Q# Q1 F# M
- LCD_ShowNum(70,40,temp,2,16);' s4 V) |+ F, @& x
- LCD_ShowNum(70,70,humi,2,16);, k( {- j+ u% x1 b
- LCD_ShowNum(95,40,tem,2,16);
- k; B" M7 _2 F - LCD_ShowNum(95,70,hum,2,16);( y0 l3 |8 n3 D
- LED0=!LED0;
) M0 a0 [; P+ d4 Q - delay_ms(1000);1 |3 t4 n) O6 {5 e2 S5 U
- }1 ^- L5 H1 ?+ i% \0 w! W* b
- }<i style="background-color: rgb(255, 255, 255);"> </i>
复制代码
1 \ i! f( J K. hLCD的代码就不列出来了,主要函数以及注释基本上已经到位了,希望对大家有所帮助!
y. M8 F8 u9 }% B* _2 _9 F* d: O, B: L( x `
三、测试结果
* L3 k* i/ s+ z8 s3 K6 L% X下图 为测试结果:* e& l( n. g- @/ J2 l( |
1 q: u' r- U! X! J G4 f* O
. d8 y9 y) R# f, ^6 Y& N
5 a+ M% F- Y0 a1 W7 A四、总结5 s; T/ V6 u6 {; ]7 q
写到这里就接近尾声了,老规矩肯定不能忘哈哈,于晏老哥的话后面依旧续上,那么这里总结就再啰里啰嗦几句吧,DHT11是一款比较入门级且又十分耐用的温湿度检测模块,咱们要用到基本上学习期间也是在单片机上的运用学习+ S! | Z% U9 s. q3 J+ n* x! ~. }* _
" T% T+ Q- F, C+ t/ f2 K" }- T/ W' V- {
* }% Y3 s5 `' ? |