sys.h: @) J2 w5 p3 m! x* X4 w
- #ifndef _SYS_H_
! l, w9 r) Y( I/ p; K" V' A - #define _SYS_H_( m: h: u8 a, U9 H3 e3 D7 B2 E
* j4 ^6 F. n: V8 {- #include "main.h"
2 S! P( a1 E6 o4 B& k! h - & D# H% ^2 @& |/ X5 ~, X2 L% x. ?
- #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
$ d/ {# G j8 P9 W - #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
5 R6 G' t( P5 D - #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
* B' B c$ t- N c$ C6 Z1 n - 2 S; Y4 U# v1 Q9 u, i7 Q# E
- #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C 1 w- ]# ^1 r8 d, `
- #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C - s- G4 {, p; r8 g. c' [
- #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
6 g. {" @" C9 S G - #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C & _! Q3 P& v5 t' D
- #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C 5 k9 b# l8 t/ P6 A0 g4 a* s
- #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
9 c( h* q* k I- C# Q; R X - #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
4 t3 f6 F* ^ O& ?# i6 K7 F; z) _ - & O A. \% J- x( F, a8 A
- #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
. A0 d# w% M, v - #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 7 q& D0 R. B6 y2 ?+ z
- #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
* N c; A% {; {6 x7 c - #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
. W0 d- f0 M3 x( q0 b1 G0 N - #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
% [& S% x2 b U* C0 o: S - #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
6 T* U8 J5 X, P4 w7 R - #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
6 p9 A3 e, H- l# F4 k ?) a - / c% v* e% ?0 \+ G& _( ^/ r
- #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //4 \: s( c- f" Z4 Q
- #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //
' V9 @) n6 ^% d* K1 ? - : H- d# R7 G( L S
- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //
6 B& S8 \* u% R5 X i1 \ - #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //, {* X2 t7 \) m( W
- , v2 |; H8 l4 F/ L2 k
- #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //
1 P( [$ I- q$ u& q+ G# y7 R - #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //: N) h+ @# l" P# d) V( V
1 \9 o1 Z& v# i2 A$ P- #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //, }% \0 t" h9 M X0 w5 H& m% D
- #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //
1 L% F% U, P4 a" y5 u3 o" ? - ' r1 X( v, s; g! R4 I
- #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //
! N2 U$ a6 l% V* {! g6 T9 N; ~ - #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //
. f% Y$ Z. X' I. i9 l! I - . U3 V4 }+ t1 P- H
- #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //
$ a( Z( U0 n" Q/ J" ` v0 R - #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //
# n2 d, O3 x, O$ U8 X9 p2 ]7 }
4 U8 L1 G* \( y& V- #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //
* W1 T& w$ H% O6 P5 ~" h: a- F$ c* P - #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //
! M6 x3 H P+ [ - #endif
复制代码
; @1 Z3 D7 T6 T% T' [1 odht11.h& F+ m& R1 a* \: c) z- a$ n
- #ifndef __DHT11_H
( S. ]& ^4 a% C: I. A - #define __DHT11_H
$ T5 M) }5 B4 Z: D
5 H* h9 [" K& N4 z4 n3 q- #include "main.h"( a M2 \( l3 p7 y
- #include "sys.h"
( H" b& \2 V$ r3 V - / E8 F R d3 o1 c
- typedef uint8_t u8;
5 p- f6 ]7 ~8 K) J! t1 { - typedef uint16_t u16;
4 d$ @6 I% ]$ `: _( A3 u - typedef uint32_t u32;
5 t5 b) a. X8 I* e - 8 e% B0 Q6 |# D- t( B- M2 s. ~
- //IO方向设置
* U( m0 r9 T% H, c( w! e - #define DHT11_IO_IN() {IODHT22_GPIO_Port->CRH &= 0xFFFFF0FF; IODHT22_GPIO_Port->CRH |= 8 << 8;} // PC10 IN MODE
) @/ e4 u8 Y/ r# A* ] H - #define DHT11_IO_OUT() {IODHT22_GPIO_Port->CRH &= 0xFFFFF0FF; IODHT22_GPIO_Port->CRH |= 3 << 8;} // PC10 OUT MODE9 B! A# w, o. C0 m, v6 F
- 1 Z" ^7 a5 U' s# S" q: \
- IO操作函数
8 q/ B9 x6 e8 K6 I - #define DHT11_DQ_OUT PCout(10) //数据端口 PC10
- k2 f+ _- |5 m" F7 o' i/ |! i B - #define DHT11_DQ_IN PCin(10) //数据端口 PC10
/ r' f: v& \& y) ]2 m( B
+ y* h! c! w3 w6 R- u8 DHT11_Init(void);//初始化DHT11# P. {8 N, V z) G! G
- u8 DHT11_Read_Data(u8 *temp, u8 *humi); //读取温湿度
; e# e$ `+ i$ a' v - u8 DHT11_Read_Byte(void);//读出一个字节2 E0 i) W! W) X% M6 U
- u8 DHT11_Read_Bit(void);//读出一个位
7 g. g; h) i2 o' H - u8 DHT11_Check(void);//检测是否存在DHT11% ?# W4 I2 X, Q, {) S4 ?& t7 X
- void DHT11_Rst(void);//复位DHT11
( \2 x1 ]) _0 f3 ] - u8 DHT11_Read_Data_Float(float *temp,float *humi);
; i4 V P& C+ p# O* P/ D+ I1 Y# H - 7 ~9 s& |/ n+ b: O( c
- #endif
复制代码 $ y' X, N0 d/ r9 }9 H
dht11.c7 `& A; ]! U3 i$ f& `- }2 W
- #include "dht11.h"
- L8 w2 Y/ ^ P0 u) } - 5 R3 C; x5 m: M) G
- //复位DHT11
5 R* s% G) T- p0 Q! Q; d - void DHT11_Rst(void)
3 F- J* u- n2 @ - {
& {1 q" I& P9 b& q; ` p. w - DHT11_IO_OUT(); //SET OUTPUT0 f9 f7 Z; ]6 k+ _& {* K
- DHT11_DQ_OUT=0; //拉低DQ2 B) @( L I ]- n/ `- n) {2 U$ p
- delay_ms(20); //拉低至少18ms,(DHT22 500us), ?, |! I$ |' Z
- DHT11_DQ_OUT=1; //DQ=18 R! V$ w: b. w. }/ h( B
- delay_us(30); //主机拉高20~40us1 }, f) p0 ^/ u- ^8 G$ \' o: d
- }' g+ u$ g! t8 P/ I9 K' }
, l- Z4 U# X6 B/ B9 M- //等待DHT11的回应" G4 ?: x4 \# s1 q
- //返回1:未检测到DHT11的存在8 L- d/ Q+ ^" Z9 Z
- //返回0:存在, ?8 r; ?' v+ a& K G. {
- u8 DHT11_Check(void)
- T3 k8 k- |5 ]1 @ - {
8 z# n- o G! [5 c& N2 z - u8 retry=0;
n a# Z6 T1 ~ - DHT11_IO_IN();//SET INPUT
4 Q* N& A- W9 E - while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
3 |# D! Z5 h# Q - {
: d# G- S' o2 d - retry++;
" l" r9 F" Q$ ]" F - delay_us(1);" G# M1 ~6 a" X" a
- };2 o! \! o t# h: L
- if(retry>=100)return 1;
7 p6 l9 l' u+ s- Y - else retry=0;
! a: ]0 o6 A7 c7 q# s% E* N3 S& e - while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us, b; y# c5 G$ X" y
- { c. {# J! l& _$ u& f& ^
- retry++;8 s- _$ X3 h! M5 \8 G- p& I
- delay_us(1);' e1 d- D* _7 l" @7 _ s
- };
# n" C0 Q7 I# J% [& u5 ~4 \ - if(retry>=100)return 1;
9 z; Q( a. ^# J: Q - return 0;
; b8 X- c; C* M: e" Z; t - }
' j& I( b& U' Q* G! }) a - $ r+ {, h: n; e% m
- //从DHT11读取一个位* S# S. n+ _+ E/ p [% y. f
- //返回值:1/0
8 n9 o0 N. F7 e! P - u8 DHT11_Read_Bit(void)
, b# b5 o2 ^4 ? T - {
+ _' S# H. ~* b0 n7 H/ o4 Q. v% ^ - u8 retry=0;
8 v2 X0 i$ Q" \) u - while(DHT11_DQ_IN&&retry<100)//等待变为低电平: H8 H9 g. O) ?' }* `! I$ ]# y* b6 `, G
- { I( G# J) E6 {, t/ l4 P
- retry++;
) g) J4 k3 n# j! m. O - delay_us(1);) C0 a7 Z& w' y, b
- }
: M; v0 q K5 L9 B8 t - retry=0;
' E" ~& D% N+ S- m. b - while(!DHT11_DQ_IN&&retry<100)//等待变高电平
# W0 L e# @, ?$ _; x3 x; J7 x - {) u! d3 U; q2 I
- retry++;$ m1 u+ ?+ _# ~& F. `
- delay_us(1);
3 o- U: s, n: m4 Z6 o - }0 u. I/ ?+ F9 X$ j9 G& U8 B
- delay_us(40);//等待40us
5 t; q" u3 C: S/ [' k& R' B - if(DHT11_DQ_IN)return 1;* v5 t. v% a9 P/ O2 x" ?0 c
- else return 0;9 D" @& M# |% I7 s4 ], R
- }( w, r( ~* _$ e. D- }7 W! H$ W
2 E! p! J# R* i: r; A. h- //从DHT11读取一个字节: y% o+ Y( `, o* b9 p
- //返回值:读到的数据
$ A: U; X- U; e - u8 DHT11_Read_Byte(void)
- ]5 F$ V7 [, r1 e - {& i& }$ Q, A5 X9 v4 R& T
- u8 i,dat;
( p' o4 q0 S2 U3 c - dat=0;
$ \; N4 {- J! k - for (i=0; i<8; i++)
" B: E% r# L# A+ U' \ P# {4 ~ - {- _! |2 g" q! a }- O- Y9 b, J0 Q. N
- dat<<=1;" C' [2 o. V' x# q
- dat|=DHT11_Read_Bit();: f, ^ ]" ?6 P7 S4 x2 ~
- }
3 w3 k. _4 }- y - return dat;
j8 s8 o' [0 W# [$ B; T) [/ y - }& Y: r4 v& D' O- H9 N7 I' t
- \. n7 N, I, t) M- //从DHT11读取一次数据 K1 [% b) Y' i( V
- //temp:温度值(范围:0~50°)
1 O" t, p+ y/ o+ b5 |, a" P - //humi:湿度值(范围:20%~90%)
# V! Y3 B6 a. W+ T6 [ - //返回值:0,正常;1,读取失败5 W( J! N" h/ K+ p
- u8 DHT11_Read_Data(u8 *temp,u8 *humi)
0 b8 T) H( S, m* w4 ]$ r4 R - {1 } \* v* S. f0 `+ G
- u8 buf[5];
- V" k3 D7 Q/ D% b$ K; G( U5 `$ C - u8 i;; k# c; q1 Z' ]
- DHT11_Rst();
% T b2 K: e, G1 L - if(DHT11_Check()==0)
# \7 T2 C) z% W- q3 m1 i - {; u+ Q3 f* Y) Y- ~8 }9 W
- for(i=0; i<5; i++) //读取40位数据1 N$ Y. f j1 c/ A! z
- {
( }5 J5 D3 |% s3 } w3 C2 D) g - buf<i>=DHT11_Read_Byte();( Y4 ]! @1 X I
- }
, B( x5 t8 o ^0 E3 S- G+ s - if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])1 ]7 }) m$ i3 ~- E' L5 f
- {
' Y# G0 ]0 `# i) M5 x1 S - *humi=buf[0];9 }- V4 e, V, O0 k; v
- *temp=buf[2];
; u; X1 r5 a; o4 I5 j - }
+ x+ J5 H9 y% N+ B5 ] - } else return 1;% ~8 `% v' _! k% b
- return 0;
( `* _& B' `! {+ o$ d - }/ s: t( ]" G* T5 r) K8 n" x
1 c4 @7 k5 T" @- u8 DHT11_Read_Data_Float(float *temp,float *humi)" S3 u6 n, ]# G. F& L8 E# ]% v" c
- {; S) Y. \0 c9 E3 _1 O6 Q
- u8 buf[5];$ K# {, T) n7 |( ^5 H$ }
- u8 i;
, G! z# y6 N- m! e5 ~: K& v; I - DHT11_Rst();( D: F" {: t# G) ?
- if(DHT11_Check()==0)
D. \7 }5 t5 L/ J( K - {" Y* |+ `* {* Z+ J% i+ n/ [
- for(i=0; i<5; i++) //读取40位数据
7 E; W6 K7 f: L" o - {# |. Q6 A3 W0 W; V% X5 U3 d
- buf<i>=DHT11_Read_Byte();0 g& N. _) S/ I
- }* N G6 ^! Y" q
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
' t& }6 F( Q* p' u - {+ M1 R1 H1 q1 f( h2 {3 f3 c S
- *humi=((buf[0] << 8) + buf[1]) / 10.0;
- t% I0 ~& w2 @' N/ [' g/ g - *temp=((buf[2] << 8) + buf[3]) / 10.0;- [ ^1 E! t8 U: E
- }
2 E7 Z7 O% d! e5 V1 h! U - } else return 1;
% O+ T9 L$ u! a5 }6 g2 r. b- v$ D - return 0;
: R! W4 C4 v \1 S$ z1 G - }
3 y0 w2 e* S9 b4 D5 f N5 | - ) w6 \" r' {- C2 s' D
- //初始化DHT11的IO口 DQ 同时检测DHT11的存在& x4 N0 f* c" p% o
- //返回1:不存在
! v2 m* d$ p1 Z9 ?" {- \, e/ X* L - //返回0:存在
) T1 t8 \+ T5 w7 F' S& j0 H - u8 DHT11_Init(void)
- j# Q- L1 D! w# u7 r - {
0 m6 [# {5 f9 ?; X7 ] - u8 ret = 1;
( x+ g0 H$ z% B# S) ] - DHT11_Rst(); //复位DHT11
, v: G& s2 C8 w# ? - ret = DHT11_Check();
: k9 B9 h1 F. `2 \! K - printf("dht11 init %s. \r\n", ret == 0 ? "ok" : "failed");& Q& ]* c% V& f5 e
- return ret;: W6 Q9 d4 M5 y+ R6 {( I- ]$ `
- }</i></i>
复制代码 x. k: A$ g3 N" U: g- @
|