sys.h
5 e. j" g5 F: B5 J" T6 f- #ifndef _SYS_H_; {+ B5 Z1 h8 A" c# A w
- #define _SYS_H_
1 p9 U7 [* h3 O# r0 l - 9 p. v- ? o& R0 H8 b1 h$ }
- #include "main.h"
6 d$ w* P3 N4 U- e. [1 z! m - 9 R) i9 Q; N$ U; d) A7 v
- #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))2 v3 K% ?! o) g1 [
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))& ~4 D& O: I) K1 V% Q8 a
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
( h' N: A. g+ l0 R; l
; n' L2 Y; c9 ]; C1 p* ^( U- #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C # F p7 ?( ?9 S8 g4 }
- #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
/ m) e: m6 C6 d: R7 j* y - #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C 3 {. C$ ^: b- w F% j5 b+ f
- #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
# r+ T% L# r* B - #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
5 I: F* d$ ?4 F- ` - #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
* _$ K }" J; D! G - #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
2 ^7 M0 f4 l( u2 L& S" ~2 ~8 U9 y
; p \ Q, T( W' ~: s. a! y" R& ~- #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
$ V- C+ C3 ~1 Z/ X8 u" ~5 r; v - #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 " r5 O+ G2 w. o/ y% n1 n
- #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 ' L$ |5 y2 |+ T9 o% H( d
- #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
& J. c5 g7 I- s: h - #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
$ J' I, i) U, h8 Z+ s$ x - #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 : H! I w/ D0 K; o% U2 m; U
- #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 1 L. ^: S0 Y. ~( `
- 2 S4 z, K! l0 x3 w
- #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //' x" r0 O, o/ E3 S3 d, o
- #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //1 K2 _- T: v* A' p8 H: q; z3 X
- . o7 G: _! Y- s3 S, i r+ r1 e
- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //! n' q" |. b4 ]. X. H
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //* P/ H T+ G; z' L' \& s
0 B3 P; p4 [7 ^* u; x- #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //
4 S; X+ k2 |% E/ `/ u- ^& m A* n - #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //2 u* H I/ U/ g5 Y/ }
# \' I: W( l/ K$ q# q& ~- #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //
1 Z; ?: y- T9 t' d1 _& z - #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //
. {8 [; T4 M' H Q" D* W3 \( s" N3 d - ' t; N) x3 C# L
- #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //
" R6 D p2 [0 z) J2 K$ d. }6 j - #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //
. X7 L# T3 W/ J6 _) c8 \) f2 Z - 7 n: E1 B/ k5 w* x$ r
- #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //1 S" p0 \5 u, j: e
- #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //
0 p8 q/ R- P4 N3 a+ E6 T' }9 z. f
I+ r7 x( P1 s1 o' |$ E; E' r+ N3 S- #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //
1 ?% B9 L5 L! ~5 r - #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //0 W6 R% Q0 [2 y! u; ?$ Z% U
- #endif
复制代码
; z9 I/ T+ X2 h$ ?3 Kdht11.h
: ~2 i6 X; O# v6 _+ R- #ifndef __DHT11_H
: P" E$ O) e7 d. l - #define __DHT11_H" ] m& i1 P; n ^6 [
- + l- S" _+ C# Z* n
- #include "main.h"2 W- [) f8 U+ H* G! G$ Z
- #include "sys.h"
) e+ G4 ?" a+ f) M - ; ?, C; a% _+ I
- typedef uint8_t u8;
7 `" [( n1 C- v' B4 n5 ^. | J( }$ h+ h - typedef uint16_t u16;
0 i& h' j4 w* F - typedef uint32_t u32;( D3 Y x5 j9 V
- & X2 v, s6 e9 `8 h$ R) {
- //IO方向设置
: a$ c& `+ E/ \. b) B$ H8 P& z - #define DHT11_IO_IN() {IODHT22_GPIO_Port->CRH &= 0xFFFFF0FF; IODHT22_GPIO_Port->CRH |= 8 << 8;} // PC10 IN MODE
7 r2 H0 Q( f( i0 { - #define DHT11_IO_OUT() {IODHT22_GPIO_Port->CRH &= 0xFFFFF0FF; IODHT22_GPIO_Port->CRH |= 3 << 8;} // PC10 OUT MODE+ |: n- i+ |; Y8 S
- ' b+ V8 q1 I" K5 C. l
- IO操作函数2 P! ~: Q/ r% |( B( @0 X) u! j$ Y
- #define DHT11_DQ_OUT PCout(10) //数据端口 PC10
1 N: {, @" \8 F; B8 \9 n - #define DHT11_DQ_IN PCin(10) //数据端口 PC10/ z w2 X2 s4 `% f( C
# S/ e5 O h7 C- o/ y- u8 DHT11_Init(void);//初始化DHT111 c9 ^/ i: B6 v$ V* \, o2 S
- u8 DHT11_Read_Data(u8 *temp, u8 *humi); //读取温湿度4 y/ c& h1 s0 S T+ o5 [
- u8 DHT11_Read_Byte(void);//读出一个字节
5 B9 \9 @. g! g& n* r1 y+ k8 G) U - u8 DHT11_Read_Bit(void);//读出一个位
: J/ G' W4 T, S$ k5 f - u8 DHT11_Check(void);//检测是否存在DHT11. K* v( R6 K1 x! k0 H ^3 [
- void DHT11_Rst(void);//复位DHT11& b3 k" T2 T" j# O( Q" }$ q
- u8 DHT11_Read_Data_Float(float *temp,float *humi);
, ?/ K( [1 K: X - 9 g: @2 \( F6 Q1 d% }
- #endif
复制代码
" k3 }8 c' X* ~dht11.c
( d0 ~4 I( u, J- #include "dht11.h"9 a8 D4 V6 `- w% y8 [ _
- , J, B9 ]6 c; G8 t% \* Q4 }
- //复位DHT11
s5 w3 b* `2 `& _ - void DHT11_Rst(void)8 e! s- B) {6 P
- {/ O. R1 V* d/ U
- DHT11_IO_OUT(); //SET OUTPUT
" \2 x8 w4 C: B1 e - DHT11_DQ_OUT=0; //拉低DQ
& V8 Q. z( S' M - delay_ms(20); //拉低至少18ms,(DHT22 500us)
3 S7 j! h/ U+ d( d8 Q' [ - DHT11_DQ_OUT=1; //DQ=1
! Q" T5 S) V- j b6 J - delay_us(30); //主机拉高20~40us
2 x% w* t) R# ]" `! i - }
2 L3 G0 n; f. S
2 ?2 g; ]- A, O7 ~% } T- //等待DHT11的回应
0 h) i$ p, `: C3 Q - //返回1:未检测到DHT11的存在
) i$ X1 p% r B - //返回0:存在3 Y% w6 L7 {, h+ W
- u8 DHT11_Check(void)
& L% |% {& j3 Q$ `6 R+ ~ - {
) m, e, y. m0 i - u8 retry=0;
% Q* V$ y4 C$ Z - DHT11_IO_IN();//SET INPUT" T1 T& g: A. G2 V
- while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us7 C6 h5 \6 |. A8 d
- {
% E; ^+ j) u q% p4 n- S - retry++;
# |" q' [' u! m2 m - delay_us(1);1 b1 L5 L* J2 F, X# U. v
- };
7 {7 }8 V# k9 \4 \2 R4 ?0 x - if(retry>=100)return 1;
# ^ F9 g* O8 L- b+ S9 ?. a - else retry=0;0 E" C z( q6 S4 j7 y1 ]
- while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us0 Y( H S* I3 w Q5 }7 b
- {8 V$ H0 [# O) w r& \; D
- retry++;- ]+ C: X2 b" B1 T1 R& F' M% d* H& r
- delay_us(1);
4 S+ }* p8 ~! t' P# V3 n0 h - };
& r ?; W# n0 F - if(retry>=100)return 1;& L2 l$ J- ^! e1 m0 x7 I7 f+ Y. S
- return 0;! o7 _- [) X7 m8 i! `7 y. z
- }7 ~4 e' d( \- n' d
- 4 ?# Y; |+ X8 L
- //从DHT11读取一个位
. I, w9 n* G2 Z& S7 S4 m. w3 A - //返回值:1/0. ~& S `/ f( |7 d
- u8 DHT11_Read_Bit(void)
) t) N$ R: S$ [5 J4 Q5 t/ a% t/ ~2 k - {
, v% ?2 ~& r- \ - u8 retry=0;1 x% z4 ]* C, p: W x
- while(DHT11_DQ_IN&&retry<100)//等待变为低电平
( n$ I4 I/ I1 D9 H( _ - {
+ c) ]9 p$ u. U5 z$ u - retry++;
- l6 P3 ]2 `' S9 g; v) ^8 y* q' n - delay_us(1);
2 C, \% L: l1 E" h - }% P2 m7 ?' ]8 {
- retry=0;1 q" O5 O% J1 X4 L. x& j
- while(!DHT11_DQ_IN&&retry<100)//等待变高电平
" f6 x5 L3 c9 M3 y+ f - {
* S0 I, l9 X; M; d% A N# X) \ - retry++;
- s( X2 {. t" C& L h& D( @$ f - delay_us(1);
: E+ I$ f8 ]' d M - }+ f" Y% s' z. y8 z k0 [ ]! h
- delay_us(40);//等待40us" G+ I8 S1 l; V9 z
- if(DHT11_DQ_IN)return 1;
" J4 S x/ i# P( ]: f - else return 0;
6 `; p- _8 |1 l - }7 V* N5 x, F, `4 O
4 b2 p7 j6 R# T2 d& K) d- //从DHT11读取一个字节
7 n' M: V2 \, ]( L2 r& J- E! x - //返回值:读到的数据! Z4 g* r7 c! |7 z- u; z
- u8 DHT11_Read_Byte(void)
9 Q9 ~! q2 m7 j6 ~ - {
- S* V3 e# X9 ~/ r* }* }, u$ ^- P - u8 i,dat;
& V% l9 i- O5 F9 p' p - dat=0;* Q4 w3 `& N& V7 B7 K+ k3 J
- for (i=0; i<8; i++)& c4 D. r s' c4 A% U
- {
! `, B2 g- I8 X6 T3 h1 @ - dat<<=1;$ {3 e2 x' A& t7 k
- dat|=DHT11_Read_Bit();
8 ~ h: m: C. [5 U, O% @" @ - }
4 [1 f4 L2 A5 t; P+ d5 l: z - return dat;# _, m5 q& |7 k1 s( ~& x$ q
- }& `1 p5 |& w Y2 A
" m |. o9 s9 ^5 j" z! x- //从DHT11读取一次数据- x% V0 G6 t# `# y- d
- //temp:温度值(范围:0~50°)
6 y# Z' u. [$ m( F. B5 n4 P- q; H - //humi:湿度值(范围:20%~90%)7 P7 |6 ]3 {$ C" [3 o% {3 Q
- //返回值:0,正常;1,读取失败
' z. F7 X% d- Z) \ - u8 DHT11_Read_Data(u8 *temp,u8 *humi)
0 B& v0 [8 k; C: I" y5 L - {
+ A/ _1 F7 g) _7 h' x& m - u8 buf[5];
+ P7 f# O+ V$ k3 h- n - u8 i;, D5 `; @ m9 p- O& e# l9 d" K9 Z. }
- DHT11_Rst();
( a2 S+ e. M9 P, |9 Z$ ] - if(DHT11_Check()==0)
2 p3 N6 m3 f: e+ L - {
, T8 y2 }9 K7 L/ ~9 F, A - for(i=0; i<5; i++) //读取40位数据+ J2 u1 ?. {% P" M3 F$ x3 W
- {
* k; n- t" x( J I2 |$ | - buf<i>=DHT11_Read_Byte();
3 u2 K; B7 {, k: Q) w - }# f+ t2 x4 ?: p+ m/ S' b" s7 x
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])) w! O+ |( u# ?! a1 p. e
- { m' J5 ^. q) l3 C4 i0 X
- *humi=buf[0]; K! C) j! p$ i- @/ o: V
- *temp=buf[2];
" N1 w7 @, Z8 ~# i/ X2 V - }
- I- a3 P9 n7 A6 g' W9 b) K - } else return 1;/ R5 `+ }: t/ n. Q3 e% {: ?! s
- return 0;
. I" ` S# u5 A. n/ g0 i' Z: r, I: E - } `5 C7 P, @. ]
- 6 ]+ F6 _' J# f
- u8 DHT11_Read_Data_Float(float *temp,float *humi)" k5 G! H! p- z, f
- {
1 x5 V! M% Z0 B - u8 buf[5];" G" L9 t1 z( P; O
- u8 i;$ Q7 g( h: q0 z
- DHT11_Rst();$ l, W# l5 e( Q$ @9 F, ^2 l& a
- if(DHT11_Check()==0)/ l4 \1 t* [1 [4 G% D e& o8 N
- {( W1 w* W2 _" S" w( m* {
- for(i=0; i<5; i++) //读取40位数据
) C$ }8 D/ @, {$ k7 N; | - {
2 n) X) D$ F) }9 B4 I0 j G - buf<i>=DHT11_Read_Byte();
) A4 o0 t) x! S- l/ O" n) t5 i - }
! C' y/ |0 M7 v2 q& R4 T/ M6 e) L7 \ - if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
" \$ T1 y: N5 o' a& a+ R6 f - {6 ?' {5 C( ~2 X- `: W
- *humi=((buf[0] << 8) + buf[1]) / 10.0;
5 F6 @5 T; O5 b! N* z& D - *temp=((buf[2] << 8) + buf[3]) / 10.0;
4 `1 H* |' t" s6 I( n- ^9 g - }
) o; v. L% n2 I! S2 w& [: o0 u - } else return 1;7 n3 W( t, w. H' O A) E
- return 0;
9 s# [# K( r9 E- k - }
: r- h' e" s* J8 w& z$ W$ b% C2 n2 ~
- B5 ~* n, r+ |$ A: V; x- //初始化DHT11的IO口 DQ 同时检测DHT11的存在5 T7 k8 R7 C1 r% z! C
- //返回1:不存在% ^* V) b6 r8 n; d# J5 v* h
- //返回0:存在
8 F( D! G+ }% e$ g3 ` - u8 DHT11_Init(void). A2 [# G# h" ?5 e u
- {: ^. O' |% O5 D+ O- w% x
- u8 ret = 1;0 H. Z/ H! Y" E! j" h* Y2 `
- DHT11_Rst(); //复位DHT11
' Y6 K9 V1 ]$ n: V& a& _ - ret = DHT11_Check();3 v4 h& R- r( W6 L0 d
- printf("dht11 init %s. \r\n", ret == 0 ? "ok" : "failed");/ Y8 t5 o5 i' E# U
- return ret;" O4 O/ o; G% [4 H
- }</i></i>
复制代码 ' B# Z- v/ F0 { p$ A' I
|