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

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

[复制链接]
STMCU小助手 发布时间:2022-12-31 18:37
项目简介! `2 f. }8 l: X6 k$ s
       利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。
" Z( E7 @- P; U# J4 ^  Y4 u
3 [) 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
$M2[0)9Z$`72@FKBAL66$%8.png
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
E(Q42~]$VZ~0XR]653Q_26U.png , 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
{7$OO3DC0G]LLI]Y3CP1_DK.png $ 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
3@(X30OT)([RCXAS]BN99K9.png
9 M+ j- Q- W. P( S+ r( Q& P- T8 |) ?$ K- ~) F
DI]1VS[N~FJ(QLKF0`BSL]Q.png
& 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
GLBTE$E9JU485WADCFH_@08.png - 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
Z3B~8(2([T0{CT4T%THZ{@R.png
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
  1. unsigned char buff[10];
    2 K. D) y; g& q2 @% G. i8 S1 D
  2.         unsigned char temp,humi;( Q. Z5 u7 C2 _, S1 n% U
  3. /* USER CODE END 0 */
    % [* |( E3 @! y0 ?! n$ M

  4. 8 J. ~1 N1 n) o7 Q2 `8 z" }% |

  5. & t4 i3 y7 v4 R+ S, V) W! ]" T9 A% z2 w

  6. * o5 b- v% T! s  U' w7 p
  7. /**6 M) P; a- U; Q! R. E) H# C- c3 b6 \
  8.   * @brief  The application entry point.0 s5 X* u7 }1 C) F* n* y; O( }1 u
  9.   * @retval int
    % O: {. |0 R, L- w. n) ?+ d1 [8 [
  10.   */1 m7 ^' h3 x* ^7 x1 x# d
  11. int main(void)
    * d+ q; q: V' I$ x+ A
  12. {' z6 o4 m+ q9 L3 h
  13.   /* MCU Configuration--------------------------------------------------------*/
    5 K# {. [+ Y# s
  14. % n1 F8 g8 U( E- V2 l/ y
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    % `4 L. s8 F& ^, L
  16.   HAL_Init();
    6 Q6 L% }& T4 w( x2 [& K0 B) G
  17. / P4 ?- `  S6 y7 Z$ d- G& H
  18.   /* USER CODE BEGIN Init */' w5 C/ b' q: Q0 x+ C1 u* p
  19. $ [: R$ f7 A4 I! ~) @
  20.   /* USER CODE END Init */
    8 O; _% I) n, \+ q9 Q! s' A
  21. / S. Q5 n5 u- O' e
  22.   /* Configure the system clock */" a) ^% F5 N; @3 W0 C6 d. t
  23.   SystemClock_Config();& _$ I, @9 c1 b9 l( l+ p

  24. ! C2 e4 {: `% P8 x7 l/ d8 W/ i
  25.   /* USER CODE BEGIN SysInit */5 q, Y1 c; d( A; P1 L

  26. 2 _2 b0 K2 \. X2 Z: C( M+ o3 G1 Y
  27.   /* USER CODE END SysInit */' B1 I( _+ g1 ?. J3 V) y+ }9 \

  28. ; s+ `6 N  x; D& q" g
  29.   /* Initialize all configured peripherals */
    / b! x  [( k( V) x  x2 U
  30.   MX_GPIO_Init();: _6 }# k. Y' y" \& ]
  31. " J- }1 A5 T! n+ m" W, K# C
  32.   /* USER CODE BEGIN 2 */% ?# c5 c7 q. g3 L( ?; H1 l
  33. ; q1 v7 w1 C, ~0 T8 M" [2 f
  34.   /* USER CODE END 2 */  m$ q1 }. h; k7 p0 s7 m

  35. - K, N+ ]: M! a: Y
  36.   /* Infinite loop */3 c$ t0 v4 u+ e! w( ]
  37.   /* USER CODE BEGIN WHILE */+ n$ X* U, W: d6 o
  38.         LCD_INIT();+ X, m& L' U. ^5 i* z
  39.         DHT11_Init();: c: v% z4 H2 a2 k. x

  40. 6 F6 ?/ _5 D# |) }. t
  41.   while(1)
    $ H3 P& ~( N: ^1 z% l
  42.   {
      h7 T/ b  R; W6 G! D+ g# d
  43.                 /**********功能1:显示温湿度数据******************/
    1 H9 N% ]! ]: o" f; v
  44.                 DHT11_Read_Data(&temp,&humi);//读取DHT11的温湿度数据3 N) l/ g7 I& u) T! G" m
  45.                 sprintf((char *)buff,"%.2d  %.2d",temp,humi);3 R% c7 a& g3 E! h+ J! D, y
  46.                 LCD_WRITE_StrDATA(buff,0,0);1 F3 m0 u' [7 Z4 A, Y

  47. 3 ?# q8 x: ^/ R) b: j. g9 ~
  48. + Z) U, V0 Y# N: l3 N
  49.     /* USER CODE BEGIN 3 */! O2 r# K& K7 {9 x' b
  50.   }1 X( ?* _- }" ]
  51.   /* USER CODE END 3 */  P+ x( ^# h; D# B4 v$ k
  52. }
复制代码

" t$ F7 d5 q1 ]) v" p- Z

* `/ K1 J0 O9 M4 k& R% E      DHT11.c
. o# F% z9 X4 K# c6 S) N
  1. //从DHT11读取一次数据
    - a9 j5 k% f6 `' k: [& C) P5 w
  2. //temp:温度值(范围:0~50°); ~  ?5 M' a* q5 I1 Z3 q0 w. @
  3. //humi:湿度值(范围:20%~90%)
    / L1 R$ n! f3 i8 C- U
  4. //返回值:0,正常;1,读取失败- H$ Q: H9 p0 P9 W) ?/ E* w
  5. unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)& F  g# m- U3 i
  6. {
    # {6 W" w# @& k! o" d3 x
  7.         unsigned char buf[5];3 ~; i5 ^3 @  @* y4 ]
  8.         unsigned char i;
    1 X: N8 k/ Y8 c' _$ ^' M: a
  9.         DHT11_Rst();! E, {2 \. J8 ^+ Y0 M# I
  10.         if(DHT11_Check()==0)- E4 L* Z# L& l7 B
  11.         {, y; V  _& Y: C: ]) b* |: m
  12.                 //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);8 h) _0 C$ l& m3 @% M5 W9 ?: B4 t
  13.                 for(i=0;i<5;i++)//读取40位数据, `) [" k% q% X. e/ U  q
  14.                 {. D2 ~4 ~6 P% }
  15.                         buf[i]=DHT11_Read_Byte();$ w) G" H  b* R; w" u+ C1 I
  16.                 }: U0 K* Q1 t# u' \8 j; x
  17.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    8 F6 v$ j. o& p2 w0 m
  18.                 {
    # y" V& S2 I% m/ a# D  ^5 w0 M' @
  19.                         *humi=buf[0];
    9 h5 p1 P/ Q1 p
  20.                         *temp=buf[2];
    $ n, t( L0 v! u4 }8 o0 x( K' V
  21.                 }( c1 t$ S0 L7 @& T' u. F
  22.         }else return 1;  J8 I& A6 a! V1 d: X0 \# K
  23.         return 0;7 d0 K* r& j; u( R
  24. }
复制代码
$ b- ~; @6 j: z8 q
作者:jxjajl
1 ]5 Q% Z8 t7 q$ S) {# y3 d: T1 u* L2 ~/ n( f+ ]- T. M" T
赞 收藏 评论0 发布时间:2022-12-31 18:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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