你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用CubMX和Proteus学习STM32单片机(二)------DHT11

[复制链接]
STMCU小助手 发布时间:2022-11-15 23:23
项目简介
' 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 L58L9GSC%HA]M%G{LR35YAX.png
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 M3LF8VFMC3G)${UOXVP4@(2.png
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 8`4X%R(9`74LKL_~~PF)P9P.png ; 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 2$@`V0}8V[PZO[C7]YH6`20.png 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
O7AXV1`VX(25RA40Y6YNF]U.png " 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
{XBC[U)XOZ($`7L@DRZHZL0.png
& 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
0B3$PYA6]ZIV4X@F[2%@24X.png & `) 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# ?
  1. unsigned char buff[10];1 c, d3 @; i7 X
  2.         unsigned char temp,humi;2 N$ I# ^/ R1 }% v
  3. /* USER CODE END 0 */
    7 a* F( K$ B1 \( F7 ^
  4. + G0 _9 i0 Z9 k

  5. $ x, h. H3 e6 w7 M

  6. 0 n7 v" b3 m" a9 Y
  7. /**
    3 z* z: `1 p1 i+ a6 d' G/ m: Q
  8.   * @brief  The application entry point." Y4 M  m( j3 Q& o! @& C
  9.   * @retval int
    2 O( ^# Y9 Z# i4 u: s7 \
  10.   */
    1 y5 p6 ?# k9 p
  11. int main(void), ^8 E. s5 a. ^  |5 ^
  12. {& T* ]2 M- r# t/ h+ l
  13.   /* MCU Configuration--------------------------------------------------------*/- e, O* u: f' Y# J
  14. 6 m  ^# L" H: ?! v% F" z. p
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    # ~$ ]3 T$ q$ v8 V
  16.   HAL_Init();9 U0 G/ B- X9 |4 h; u
  17. % M! J5 h1 X  {1 |3 G4 `
  18.   /* USER CODE BEGIN Init */7 J# ?0 P8 y0 k8 T; s. e
  19. 6 D3 G' N% Y) @- N4 v: r
  20.   /* USER CODE END Init */; f! A, l7 O+ |: p
  21. ( G. w. Y1 i/ ], J
  22.   /* Configure the system clock */
    9 x0 _$ G2 H. V2 T9 Z+ ?& R
  23.   SystemClock_Config();1 z$ l8 o* D! y, R% P5 z8 ^; Y
  24. , O; t; }: C9 [8 y" [1 b
  25.   /* USER CODE BEGIN SysInit */  I$ G9 ]; a4 N6 s

  26. ; J; d& R% R3 `5 h1 W
  27.   /* USER CODE END SysInit */& t4 f# S+ Q% O& _
  28.   N# G# C4 G! ?4 r
  29.   /* Initialize all configured peripherals */
    ( \" \4 J- c& j9 D
  30.   MX_GPIO_Init();
      H0 H: ^6 A4 U" i/ o- ?* n

  31. $ \. |% I5 e5 t2 i; ?! t$ c( O
  32.   /* USER CODE BEGIN 2 */
    ( D/ ?$ G' i, K9 F/ ^
  33. # J1 L2 N  z7 K6 n8 G) \, @
  34.   /* USER CODE END 2 */* O* l! [% F& V

  35. " t! E( F, R6 h1 g' w, ^* f
  36.   /* Infinite loop */( [! _, d8 e6 I8 \
  37.   /* USER CODE BEGIN WHILE */
    ; k+ G4 W2 K0 V* P' S) Z, k
  38.         LCD_INIT();- h0 |2 f: C! C4 N. U# W. J
  39.         DHT11_Init();' a1 _( \, ~9 ^. m* L0 T4 Y
  40. 6 ^$ S4 n, M( o/ w
  41.   while(1): p& a# J8 p/ {2 D6 z
  42.   {
    - z* k8 v" ^* K9 ~4 D
  43.                 /**********功能1:显示温湿度数据******************/
    . @# o3 u0 j0 p" q7 o! P) Y' t( q
  44.                 DHT11_Read_Data(&temp,&humi);//读取DHT11的温湿度数据9 b; Y% O1 x+ j& E% @7 H  u" r# M" g
  45.                 sprintf((char *)buff,"%.2d  %.2d",temp,humi);9 V" P, E1 ~" @2 ]2 o+ ?4 Q; Q  k
  46.                 LCD_WRITE_StrDATA(buff,0,0);) J9 C+ O- B4 d( ?8 X: n& e

  47. + h0 [# t9 d$ `4 Y% w! I3 q! s

  48. ! W2 ]$ q. K! k
  49.     /* USER CODE BEGIN 3 */
    2 \( C6 e/ |- f2 x: e. i, @1 O
  50.   }( t, M9 z6 g+ i9 G- h: w& `
  51.   /* USER CODE END 3 */6 f4 A% G* t7 p8 _/ L3 T
  52. }
复制代码

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
  1. //从DHT11读取一次数据
    8 P5 p# V5 x3 b8 i
  2. //temp:温度值(范围:0~50°)2 z$ E& b2 |/ W
  3. //humi:湿度值(范围:20%~90%)
    % U- B+ {- i7 J
  4. //返回值:0,正常;1,读取失败6 a5 r0 }* [- Q: t- E9 k2 k
  5. unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)' E+ C! C( L& Y, q  D
  6. {
    " k; D" s1 I2 k- M
  7.          unsigned char buf[5];' n; Z* Q! |1 ~7 U
  8.         unsigned char i;
    ! O: b. h  H  q) K) A1 |
  9.         DHT11_Rst();
    * g/ U  _5 p/ h% ~: Y
  10.         if(DHT11_Check()==0)
    ; t7 x6 n$ w8 E
  11.         {( C% t% O) z# s# h2 q0 P; D2 d
  12.                 //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
    ; i, f+ S, I, A3 a
  13.                 for(i=0;i<5;i++)//读取40位数据1 G4 _" T( P( [# @" A# ]
  14.                 {( {& y. l1 o. {; {+ {( B; \* C1 ?
  15.                         buf=DHT11_Read_Byte();
    * ~5 p* o, b3 M
  16.                 }( z+ x" T3 K: I) g/ u- R
  17.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    , `9 @+ [% Y: R* ~& B: W# G  s
  18.                 {
    2 f6 E/ f+ _( t: a; ~
  19.                         *humi=buf[0];
    8 l% D4 ^$ `* ]2 e' }+ l9 E
  20.                         *temp=buf[2];
    ; R/ H$ D& \) H" L+ i) s1 v
  21.                 }* u' ]: g, \) m
  22.         }else return 1;3 U$ h5 `& e7 O
  23.         return 0;8 a# B+ y* b6 Q! x- ?+ N) ]+ h5 s
  24. }
复制代码
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
赞 收藏 评论0 发布时间:2022-11-15 23:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版