项目简介
' I0 B8 P/ i' g& w/ P( V) Y 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。" g+ A0 n6 U4 _9 Q- d1 ?# }+ j
+ `' T; `/ ^4 j2 @8 u: n/ v" Y
~+ z; o9 q: v: A# t0 E硬件模块
% z/ \' u* {$ ^1 a. O, D, { STM32F103R4* o3 `# c+ j4 b0 d: d% r
) @) X3 R' Z3 M8 Z DHT110 K. A/ j3 p7 J
' j6 w. n) ]" W2 w% j: y
LCD1602+ G8 R# ^/ G- i' L: K1 N. S6 Z1 J
, q" A8 Z$ W& R8 @ 74HC373
9 d) T- r4 _9 p* d; ?3 _5 B7 D
& y8 v, O5 k& \
2 o; r& b+ i! ]; D8 |2 p软件工具$ O% f/ y0 b, S/ l4 p/ ^( d8 @0 s
CubMX" o5 M- h" `3 d* u$ H
5 j4 o# |3 T- S3 h4 F( y. O% {6 d- M Proteus
4 q) E5 f& A- V# c& e% j* z2 z6 z( ]" U' J' b; S
KEIL
$ U7 y$ c+ z" s; \# Q) ?# z
0 e- w) a! O! U- l6 M& s: Y电路连接图/ a: u2 j/ w5 n6 F! k
STM32F103R4" f% I% q0 j I8 c7 i1 ?- ^8 d* H
& ^- |) A) J9 l, C' [7 H
5 [3 p {. Z0 p/ [: {, L/ Y9 z# Y3 c
, o( i* E \( R7 l DHT11; x$ A- t- q6 |) t0 G
, E1 O4 x$ C* G' U
7 Q2 Y9 E. ?! s9 n
0 {$ P& W$ k. y( d, F- y X! U LCD1602
2 A$ K$ |' Z% V* O6 L) e
6 _2 o) a- E8 Z
; t1 }2 P! G' r
. g/ ^/ P1 i: Y( d7 G& Q8 W3 f, \- I0 _; R
工作流程8 y: ]& X4 t9 ?; h& f- g
首先还是先利用CubMX创建一个KEIL工程设置PA0位DHT11的数据口,这里之所以选用PA0,主要是有些版本的Proteus会有一些BUG,就是只有PA0端口有输入的功能,换句话说,就是只有PA0能够作为输入被单片机读取到数据。我一开始用的是8.6版本的Proteus,会有这个问题,后来下载更高版本的Proteus也可以解决这个问题,即其余端口也可作为输入口。$ v; h& \$ y: o0 s, [0 f, J
0 `/ q" K, L1 D8 u- [+ x
0 B8 }$ C' f( J# `8 s
9 z o2 P' o$ x0 C3 P. I5 \ 时钟根据自己习惯保持默认即可。
" N: q* G$ E, O1 J% A6 l; ^5 _7 y
" E4 a3 z. c3 |4 C& \9 R
+ p' a/ J! x; n5 R7 a; q
其余也是一样保持默认: v3 D$ t! Q6 M, R( q& ]& r9 J
, ?$ l7 _' E+ o- L; e. U5 ~8 B
& k8 p. `/ H& @$ O3 \' _: v$ f+ N5 n/ H$ C k+ n) u! D! {
' @/ b, `$ k9 X, i6 W
然后,在生成的KEIL工程里编写相应程序即可。程序主要代码部分在“程序代码” 标题里。
! Y" m: B: h5 W9 V; x" V9 P( B* `( q/ p
最后,在Proteus中仿真验证。结果如下图所示。9 w6 h- y; [2 x9 J( U
& {- r. g/ c9 ~" `6 k/ H
& `) k+ F3 l" i) K
4 Y" ]) y/ V3 ?4 ~& S: y/ [5 t程序代码4 p' U7 V ~% ]* p
mian.c
* O% c5 {. F; c- }+ ~' l- _1 F# ?
- unsigned char buff[10];1 c, d3 @; i7 X
- unsigned char temp,humi;2 N$ I# ^/ R1 }% v
- /* USER CODE END 0 */
7 a* F( K$ B1 \( F7 ^ - + G0 _9 i0 Z9 k
$ x, h. H3 e6 w7 M
0 n7 v" b3 m" a9 Y- /**
3 z* z: `1 p1 i+ a6 d' G/ m: Q - * @brief The application entry point." Y4 M m( j3 Q& o! @& C
- * @retval int
2 O( ^# Y9 Z# i4 u: s7 \ - */
1 y5 p6 ?# k9 p - int main(void), ^8 E. s5 a. ^ |5 ^
- {& T* ]2 M- r# t/ h+ l
- /* MCU Configuration--------------------------------------------------------*/- e, O* u: f' Y# J
- 6 m ^# L" H: ?! v% F" z. p
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
# ~$ ]3 T$ q$ v8 V - HAL_Init();9 U0 G/ B- X9 |4 h; u
- % M! J5 h1 X {1 |3 G4 `
- /* USER CODE BEGIN Init */7 J# ?0 P8 y0 k8 T; s. e
- 6 D3 G' N% Y) @- N4 v: r
- /* USER CODE END Init */; f! A, l7 O+ |: p
- ( G. w. Y1 i/ ], J
- /* Configure the system clock */
9 x0 _$ G2 H. V2 T9 Z+ ?& R - SystemClock_Config();1 z$ l8 o* D! y, R% P5 z8 ^; Y
- , O; t; }: C9 [8 y" [1 b
- /* USER CODE BEGIN SysInit */ I$ G9 ]; a4 N6 s
; J; d& R% R3 `5 h1 W- /* USER CODE END SysInit */& t4 f# S+ Q% O& _
- N# G# C4 G! ?4 r
- /* Initialize all configured peripherals */
( \" \4 J- c& j9 D - MX_GPIO_Init();
H0 H: ^6 A4 U" i/ o- ?* n
$ \. |% I5 e5 t2 i; ?! t$ c( O- /* USER CODE BEGIN 2 */
( D/ ?$ G' i, K9 F/ ^ - # J1 L2 N z7 K6 n8 G) \, @
- /* USER CODE END 2 */* O* l! [% F& V
" t! E( F, R6 h1 g' w, ^* f- /* Infinite loop */( [! _, d8 e6 I8 \
- /* USER CODE BEGIN WHILE */
; k+ G4 W2 K0 V* P' S) Z, k - LCD_INIT();- h0 |2 f: C! C4 N. U# W. J
- DHT11_Init();' a1 _( \, ~9 ^. m* L0 T4 Y
- 6 ^$ S4 n, M( o/ w
- while(1): p& a# J8 p/ {2 D6 z
- {
- z* k8 v" ^* K9 ~4 D - /**********功能1:显示温湿度数据******************/
. @# o3 u0 j0 p" q7 o! P) Y' t( q - DHT11_Read_Data(&temp,&humi);//读取DHT11的温湿度数据9 b; Y% O1 x+ j& E% @7 H u" r# M" g
- sprintf((char *)buff,"%.2d %.2d",temp,humi);9 V" P, E1 ~" @2 ]2 o+ ?4 Q; Q k
- LCD_WRITE_StrDATA(buff,0,0);) J9 C+ O- B4 d( ?8 X: n& e
+ h0 [# t9 d$ `4 Y% w! I3 q! s
! W2 ]$ q. K! k- /* USER CODE BEGIN 3 */
2 \( C6 e/ |- f2 x: e. i, @1 O - }( t, M9 z6 g+ i9 G- h: w& `
- /* USER CODE END 3 */6 f4 A% G* t7 p8 _/ L3 T
- }
复制代码
2 r) x' L: p! p) Z% M DHT11.c2 [3 Q' v4 l% q" u& A8 i2 ~
0 A! m7 t" O! s2 \; u' W8 N
- //从DHT11读取一次数据
8 P5 p# V5 x3 b8 i - //temp:温度值(范围:0~50°)2 z$ E& b2 |/ W
- //humi:湿度值(范围:20%~90%)
% U- B+ {- i7 J - //返回值:0,正常;1,读取失败6 a5 r0 }* [- Q: t- E9 k2 k
- unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)' E+ C! C( L& Y, q D
- {
" k; D" s1 I2 k- M - unsigned char buf[5];' n; Z* Q! |1 ~7 U
- unsigned char i;
! O: b. h H q) K) A1 | - DHT11_Rst();
* g/ U _5 p/ h% ~: Y - if(DHT11_Check()==0)
; t7 x6 n$ w8 E - {( C% t% O) z# s# h2 q0 P; D2 d
- //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
; i, f+ S, I, A3 a - for(i=0;i<5;i++)//读取40位数据1 G4 _" T( P( [# @" A# ]
- {( {& y. l1 o. {; {+ {( B; \* C1 ?
- buf=DHT11_Read_Byte();
* ~5 p* o, b3 M - }( z+ x" T3 K: I) g/ u- R
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
, `9 @+ [% Y: R* ~& B: W# G s - {
2 f6 E/ f+ _( t: a; ~ - *humi=buf[0];
8 l% D4 ^$ `* ]2 e' }+ l9 E - *temp=buf[2];
; R/ H$ D& \) H" L+ i) s1 v - }* u' ]: g, \) m
- }else return 1;3 U$ h5 `& e7 O
- return 0;8 a# B+ y* b6 Q! x- ?+ N) ]+ h5 s
- }
复制代码 3 B* q* s! [% F9 n+ n( j/ V
! ]* c* j( ?$ h2 [) _
作者:jxjajl bilibili
5 y, J, I1 ?5 q2 h+ G5 [% a4 N! y8 w6 L2 X" h
0 o( t' s6 U( W W
|