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

【经验分享】STM32实例-DS18B20温度传感器实验③-DS18B20 初始化函数

[复制链接]
STMCU小助手 发布时间:2022-6-27 18:00
    本实验所要实现的功能是:系统开启时首先检测 DS18B20 温度传感器是否存在,若存在输出相应的提示信息,然后间隔 500ms 读取一次 DS18B20 的温度,并通过串口打印输出,最后让 D1 指示灯不断闪烁,提示系统正常运行。程序框架如下:
(1)初始化 DS18B20
(2)编写读取温度函数
(3)编写主函数
    因为 DS18B20 是单总线通信,所以需要使用 STM32F1 的 PG11 管脚模拟单总线时序,单总线相关时序在前面已经介绍。下面我们打开“DS18B20 温度传感器实验”工程,在 APP 工程组中添加ds18b20.c 文件(里面包含了 DS18B20 驱动程序),同时还要包含对应的头文件路径。
    要使用 PG11 管脚模拟单总线时序,就必须使能端口时钟及初始化 GPIO。初始化代码如下:
  1. /****************************************************************& L6 p: e* j6 f' C
  2. * 函 数 名 : DS18B20_Init
    * {4 O0 a* x: A! P. R
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在- ~3 ~9 k6 b9 m& t& y% R
  4. * 输 入 : 无
      B1 d: f  q* i* s3 t
  5. * 输 出 : 1:不存在,0:存在* U# r; ^6 D- r, ?: n
  6. *****************************************************************/# T% L; j* o3 f2 z2 ^
  7. u8 DS18B20_Init(void)* S2 P1 H! `/ N# E. T) I
  8. {
    $ j0 [2 h8 J; C# R/ M
  9. GPIO_InitTypeDef GPIO_InitStructure;
    # J9 g% v1 `* B* Y  L
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
    5 f* S( G7 A- f6 {' B+ y8 b
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;" C2 {8 d" m  r8 o: U
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    6 D" u$ C( F) O
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  Q  z7 C4 A" l: w
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);. l, }1 `/ I5 v( w
  15. DS18B20_Reset();
    9 g1 R- V" b6 b. b
  16. return DS18B20_Check();5 z, \4 c  a0 ?% I  R2 d
  17. }
复制代码
/ v" W1 Y! g0 A
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    - P( D/ q9 Y. m; u3 ]: B
  2. * 函 数 名 : DS18B20_Reset
    ) P8 q/ r" h, ^2 Q" D) L6 n
  3. * 函数功能 : 复位 DS18B20
    1 Q, b" J0 C6 v6 m/ V# G6 e' U
  4. * 输 入 : 无
    9 N* Z  Q# H' j. M% I6 K
  5. * 输 出 : 无
    / X% \7 X5 u: d+ }5 i
  6. *****************************************************************/
    3 T" O. u" d8 p! P' g
  7. void DS18B20_Reset(void)) C$ @5 ?& E7 r# I! z
  8. {
    # b/ N$ d: R3 p2 I$ k( q
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT' u7 A2 Y+ y  B1 @$ D
  10. DS18B20_DQ_OUT=0; //拉低 DQ
    , {5 ]' B; c; k* L/ y% ~" g
  11. delay_us(750); //拉低 750us
    4 @  J  h5 o$ \0 m' U" ^
  12. DS18B20_DQ_OUT=1; //DQ=1
    ( N( a" W9 P4 H! }/ i% B9 @
  13. delay_us(15); //15US8 d6 g' T) [! @+ q/ k: ~
  14. }
复制代码
  1. /****************************************************************9 M( x( @) a- T, G
  2. * 函 数 名 : DS18B20_Check
    / C" w% y' k9 V
  3. * 函数功能 : 检测 DS18B20 是否存在0 O5 O) Y, a4 k% ]5 G: Z
  4. * 输 入 : 无9 a# x2 n) F/ d) I" r( o: M4 ]7 p8 m
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在- x  S0 A9 @6 O' K0 w+ M
  6. *****************************************************************/
    0 W& C5 X5 V; @* b, d; V; Q
  7. u8 DS18B20_Check(void)4 @0 U4 c2 v  y+ F  }+ _' T  m$ s
  8. {, J- v$ W& L! @$ w: y9 y  w8 P
  9. u8 retry=0;7 Z% z! u6 G. d0 t3 \% G' e* @
  10. DS18B20_IO_IN();//SET PG11 INPUT5 E0 C8 e& k+ K# }3 Y
  11. while (DS18B20_DQ_IN&&retry<200)
    + b7 V2 l2 {! ^, z
  12. {
    - R: A  ^6 c; Z/ F  d& v, a
  13. retry++;" t. |: p, ?; t9 F' m& V  V4 E6 Q! F
  14. delay_us(1);' ~$ c* ^9 B' P8 {* f& h
  15. };4 _9 |5 Z* ~. v
  16. if(retry>=200)return 1;4 U$ n) m- F8 G$ R+ K& S0 K0 T6 W, J1 T
  17. else retry=0;* t- Q" a9 i9 h/ E' E+ d$ l* y4 h
  18. while (!DS18B20_DQ_IN&&retry<240)
    9 e3 \5 n% q! f4 {8 H
  19. {0 E" Z7 |1 `; G$ h2 \8 L( h
  20. retry++;8 ^- P( t1 W: F2 k4 D! @
  21. delay_us(1);
    ! e6 m6 s; u" M. X
  22. };: j: {* y6 s# f# ]
  23. if(retry>=240)return 1;
    5 c' t* U- g4 k/ b5 i- H7 I
  24. return 0;
    $ c; A1 D2 b# M4 I  k
  25. }
复制代码

4 z1 K2 F( \# {/ E1 }; o6 ?
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************8 e! T( N* P  d/ m- Q' t4 ~6 s
  2. * 函 数 名 : DS18B20_IO_IN! J, S) C0 n% M0 U
  3. * 函数功能 : DS18B20_IO 输入配置
    ) ^- r0 k  q8 V
  4. * 输 入 : 无1 i9 b7 s' V& \
  5. * 输 出 : 无' W* j& w8 ~/ S$ H' `
  6. *****************************************************************/  E$ u: C1 }1 R. F, z9 @/ F% M, _
  7. void DS18B20_IO_IN(void)1 l( L9 _( U7 ]# M6 O# D
  8. {3 r, c8 |; Y; ^, v+ u' z2 k
  9. GPIO_InitTypeDef GPIO_InitStructure;
    0 i; ~+ y7 L8 w- C. @' L
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;; R$ Y$ ?% |. f6 T: l4 W# u
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    ' P6 r' ~+ q; \* J$ I* }( \
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    3 H+ g. f. i( W( l6 G2 \1 L
  13. }
复制代码
  1. /****************************************************************
    6 M: x; a) l- [- H; H0 }) x$ S- N
  2. * 函 数 名 : DS18B20_IO_OUT- F3 Y& p& F1 C
  3. * 函数功能 : DS18B20_IO 输出配置
    9 _% J9 [( D) q& R/ `
  4. * 输 入 : 无
    ' e: ?+ [7 M1 z4 C/ b
  5. * 输 出 : 无
    ' t$ u4 a/ @" Y8 V9 j! B! O7 }
  6. *****************************************************************/! F$ O* o5 w- M, d
  7. void DS18B20_IO_OUT(void)
    ; Z  y1 F1 ~3 p! i+ T" n1 Q
  8. {
    & A# A: |1 z/ @/ i( y0 d' F
  9. GPIO_InitTypeDef GPIO_InitStructure;
    - C. u2 J0 O; {. |, [
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;6 s8 n0 h& X4 B1 I. r1 h
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;, @5 Y) s+ R- }8 L  W
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    5 y) i5 J+ L( }' u; L% `
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);6 U( R8 m; A1 E( K! q: V6 A
  14. }
复制代码
+ `8 X. u$ |1 X% z8 i: q/ K
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。

  e5 |$ Q" ~7 \$ v+ N  d
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版