项目简介! `2 f. }8 l: X6 k$ s
利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。
" Z( E7 @- P; U# J4 ^ Y4 u3 [) u. x9 a/ Z6 G2 ?$ Y. P Y
硬件模块
' d" d' K# F+ Z) r STM32F103R4
( g; E+ T, s: {$ g& C9 G DHT11
; D N! N2 Z: I! o5 {$ E; L LCD1602
@* l' h3 `) W9 p+ k0 e( K 74HC373+ R6 V$ `; [3 U
, v3 T* P0 g4 ~- u# j9 w软件工具, E; o. c8 z5 ?1 b" F
CubMX. G% |- l2 a+ s( W3 |
Proteus
) h5 n# j) U5 d KEIL
7 |* o K% E9 M7 X5 x* u5 Q0 E
% ^& ^6 H' u) @9 a6 n1 D4 u7 p电路连接图
- g+ m, T" g5 N" `1 W( t! Q STM32F103R4) T$ A7 c5 l3 i
' x# f7 q) X# J3 x9 ^! j/ t
1 H F* q2 Y6 {$ I/ B
6 _3 p7 Y( H! w2 c9 `! Y DHT11& m K- b1 M4 I' C# ^& V
( O, T W- Q# B' I
, H* b+ Z* A$ ?+ _# n
r: q9 e: ~8 f! K4 H
LCD1602) c: F2 @$ |7 y2 X# n- q4 m
$ J+ p8 y: J$ Y5 q) t4 [/ n' d
$ l7 g9 l1 M+ w2 W% r
# F1 s8 y) R3 f
工作流程# U8 K( a3 ]+ ]( {3 c1 @
首先还是先利用CubMX创建一个KEIL工程设置PA0位DHT11的数据口,这里之所以选用PA0,主要是有些版本的Proteus会有一些BUG,就是只有PA0端口有输入的功能,换句话说,就是只有PA0能够作为输入被单片机读取到数据。我一开始用的是8.6版本的Proteus,会有这个问题,后来下载更高版本的Proteus也可以解决这个问题,即其余端口也可作为输入口。
6 |$ q7 e* Z- c* |1 a6 y# J3 p
时钟根据自己习惯保持默认即可。
* F+ @/ O0 D' r. x6 e! G! e
v# r! x* ^4 q% S/ s
9 M+ j- Q- W. P( S+ r( Q& P- T8 |) ?$ K- ~) F
& y8 i+ ^5 F& M1 B0 b2 c" N4 @+ P( z9 D9 S. t9 E
其余也是一样保持默认
, q3 E6 z( b' L, n3 T8 }) D
5 Q* W7 y) K- u8 z. W5 t
- U+ k \+ l$ x0 X/ Y w
M @2 s [% L+ i, b, ? 然后,在生成的KEIL工程里编写相应程序即可。程序主要代码部分在“程序代码” 标题里。
* g. x- \2 ^2 }, a! J9 v. g
' i, [4 x6 x7 j4 x. t: T; f9 c+ O; g 最后,在Proteus中仿真验证。结果如下图所示。2 \; f$ h2 C* j: H' W7 X$ Y9 l! Q* d
V' \ C, l0 t5 I* f& m
0 r: u2 ^9 f" F. g$ N# V) t' _
5 `; \/ u& Y! ?9 `1 C, q程序代码
' m x9 E ]) C mian.c
f+ I8 E, c2 I3 f3 L9 F- unsigned char buff[10];
2 K. D) y; g& q2 @% G. i8 S1 D - unsigned char temp,humi;( Q. Z5 u7 C2 _, S1 n% U
- /* USER CODE END 0 */
% [* |( E3 @! y0 ?! n$ M
8 J. ~1 N1 n) o7 Q2 `8 z" }% |
& t4 i3 y7 v4 R+ S, V) W! ]" T9 A% z2 w
* o5 b- v% T! s U' w7 p- /**6 M) P; a- U; Q! R. E) H# C- c3 b6 \
- * @brief The application entry point.0 s5 X* u7 }1 C) F* n* y; O( }1 u
- * @retval int
% O: {. |0 R, L- w. n) ?+ d1 [8 [ - */1 m7 ^' h3 x* ^7 x1 x# d
- int main(void)
* d+ q; q: V' I$ x+ A - {' z6 o4 m+ q9 L3 h
- /* MCU Configuration--------------------------------------------------------*/
5 K# {. [+ Y# s - % n1 F8 g8 U( E- V2 l/ y
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
% `4 L. s8 F& ^, L - HAL_Init();
6 Q6 L% }& T4 w( x2 [& K0 B) G - / P4 ?- ` S6 y7 Z$ d- G& H
- /* USER CODE BEGIN Init */' w5 C/ b' q: Q0 x+ C1 u* p
- $ [: R$ f7 A4 I! ~) @
- /* USER CODE END Init */
8 O; _% I) n, \+ q9 Q! s' A - / S. Q5 n5 u- O' e
- /* Configure the system clock */" a) ^% F5 N; @3 W0 C6 d. t
- SystemClock_Config();& _$ I, @9 c1 b9 l( l+ p
! C2 e4 {: `% P8 x7 l/ d8 W/ i- /* USER CODE BEGIN SysInit */5 q, Y1 c; d( A; P1 L
2 _2 b0 K2 \. X2 Z: C( M+ o3 G1 Y- /* USER CODE END SysInit */' B1 I( _+ g1 ?. J3 V) y+ }9 \
; s+ `6 N x; D& q" g- /* Initialize all configured peripherals */
/ b! x [( k( V) x x2 U - MX_GPIO_Init();: _6 }# k. Y' y" \& ]
- " J- }1 A5 T! n+ m" W, K# C
- /* USER CODE BEGIN 2 */% ?# c5 c7 q. g3 L( ?; H1 l
- ; q1 v7 w1 C, ~0 T8 M" [2 f
- /* USER CODE END 2 */ m$ q1 }. h; k7 p0 s7 m
- K, N+ ]: M! a: Y- /* Infinite loop */3 c$ t0 v4 u+ e! w( ]
- /* USER CODE BEGIN WHILE */+ n$ X* U, W: d6 o
- LCD_INIT();+ X, m& L' U. ^5 i* z
- DHT11_Init();: c: v% z4 H2 a2 k. x
6 F6 ?/ _5 D# |) }. t- while(1)
$ H3 P& ~( N: ^1 z% l - {
h7 T/ b R; W6 G! D+ g# d - /**********功能1:显示温湿度数据******************/
1 H9 N% ]! ]: o" f; v - DHT11_Read_Data(&temp,&humi);//读取DHT11的温湿度数据3 N) l/ g7 I& u) T! G" m
- sprintf((char *)buff,"%.2d %.2d",temp,humi);3 R% c7 a& g3 E! h+ J! D, y
- LCD_WRITE_StrDATA(buff,0,0);1 F3 m0 u' [7 Z4 A, Y
3 ?# q8 x: ^/ R) b: j. g9 ~- + Z) U, V0 Y# N: l3 N
- /* USER CODE BEGIN 3 */! O2 r# K& K7 {9 x' b
- }1 X( ?* _- }" ]
- /* USER CODE END 3 */ P+ x( ^# h; D# B4 v$ k
- }
复制代码
" t$ F7 d5 q1 ]) v" p- Z
* `/ K1 J0 O9 M4 k& R% E DHT11.c. o# F% z9 X4 K# c6 S) N
- //从DHT11读取一次数据
- a9 j5 k% f6 `' k: [& C) P5 w - //temp:温度值(范围:0~50°); ~ ?5 M' a* q5 I1 Z3 q0 w. @
- //humi:湿度值(范围:20%~90%)
/ L1 R$ n! f3 i8 C- U - //返回值:0,正常;1,读取失败- H$ Q: H9 p0 P9 W) ?/ E* w
- unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)& F g# m- U3 i
- {
# {6 W" w# @& k! o" d3 x - unsigned char buf[5];3 ~; i5 ^3 @ @* y4 ]
- unsigned char i;
1 X: N8 k/ Y8 c' _$ ^' M: a - DHT11_Rst();! E, {2 \. J8 ^+ Y0 M# I
- if(DHT11_Check()==0)- E4 L* Z# L& l7 B
- {, y; V _& Y: C: ]) b* |: m
- //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);8 h) _0 C$ l& m3 @% M5 W9 ?: B4 t
- for(i=0;i<5;i++)//读取40位数据, `) [" k% q% X. e/ U q
- {. D2 ~4 ~6 P% }
- buf[i]=DHT11_Read_Byte();$ w) G" H b* R; w" u+ C1 I
- }: U0 K* Q1 t# u' \8 j; x
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
8 F6 v$ j. o& p2 w0 m - {
# y" V& S2 I% m/ a# D ^5 w0 M' @ - *humi=buf[0];
9 h5 p1 P/ Q1 p - *temp=buf[2];
$ n, t( L0 v! u4 }8 o0 x( K' V - }( c1 t$ S0 L7 @& T' u. F
- }else return 1; J8 I& A6 a! V1 d: X0 \# K
- return 0;7 d0 K* r& j; u( R
- }
复制代码 $ b- ~; @6 j: z8 q
作者:jxjajl
1 ]5 Q% Z8 t7 q$ S) {# y3 d: T1 u* L2 ~/ n( f+ ]- T. M" T
|