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

【经验分享】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. /****************************************************************6 l- i) ?5 t) {: B  S
  2. * 函 数 名 : DS18B20_Init
    % |# [/ Z+ O" \4 d+ X  t
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在- b- p3 V* t$ `% [9 p+ ?
  4. * 输 入 : 无
    7 f$ d: B. z# z7 t
  5. * 输 出 : 1:不存在,0:存在
    6 y/ E4 V, M  J8 k: ^
  6. *****************************************************************/
      s1 L* D7 K( @/ q% R4 l/ u& s9 `- `
  7. u8 DS18B20_Init(void)7 s* b7 s, V9 x7 {- c. q; ]0 u
  8. {# ^" h. |7 h# \/ O5 q- V
  9. GPIO_InitTypeDef GPIO_InitStructure;" a& I: [6 ^7 V7 j
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);9 s/ ^: T' s9 ]
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;. k2 ?- A- t5 X, q  a/ i6 X9 y
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;$ S; T& ^' d7 N5 [
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;# R7 D" H& k0 k
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);3 {* c# M5 @2 _) |. T
  15. DS18B20_Reset();4 ?1 f* Y. {( K- t) ^  T
  16. return DS18B20_Check();, U8 w& Z) `1 M4 V2 c. x3 X
  17. }
复制代码

. B% V$ f4 s# |8 n
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    ; e0 ~5 K6 l" T0 T8 E) a1 ~+ t  `8 L- Q
  2. * 函 数 名 : DS18B20_Reset/ b1 O, J; }9 g* f
  3. * 函数功能 : 复位 DS18B20& ^1 ]. \4 e* @+ f0 ^
  4. * 输 入 : 无5 M8 Q& o* m; m; o7 a3 p* X8 g9 ?3 G
  5. * 输 出 : 无
    ! f- R( V: {; j& X) o
  6. *****************************************************************/
    ! b! j; K7 ~! `; E% H8 ~; s- K, r4 y
  7. void DS18B20_Reset(void)! K7 k' o# |" [- W" J( }8 V- V
  8. {
    9 y7 P% J* D$ T/ k
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT" \# \* d- }& N' v
  10. DS18B20_DQ_OUT=0; //拉低 DQ
    , `7 S6 u( ~# z0 W; i6 C( k
  11. delay_us(750); //拉低 750us
    0 j0 V! x3 ~" @. n$ H8 v  p- @) H
  12. DS18B20_DQ_OUT=1; //DQ=16 X2 e$ }+ O2 ^* |, d0 L6 o6 i
  13. delay_us(15); //15US) a! H, C! v1 n6 J7 Z: m* c: g2 c
  14. }
复制代码
  1. /****************************************************************! i2 J" S5 H8 Y
  2. * 函 数 名 : DS18B20_Check
    3 J: I7 ]0 ]0 w1 h$ Y
  3. * 函数功能 : 检测 DS18B20 是否存在
    9 @0 z: O, k* {9 I) C' G
  4. * 输 入 : 无
    1 F6 A* T: E" u7 w! }
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在7 C4 V7 ]3 R" F8 o8 n
  6. *****************************************************************/
    - T3 ]$ `4 P3 m+ s0 h) z
  7. u8 DS18B20_Check(void)' l$ s& B* R0 E3 j5 v9 e6 ]9 F
  8. {9 C* R# x( N  n! P6 H( N
  9. u8 retry=0;% ?7 N& M3 ~6 h8 c' v6 |
  10. DS18B20_IO_IN();//SET PG11 INPUT3 D9 w; Q) v: T; d% |+ B
  11. while (DS18B20_DQ_IN&&retry<200)3 r. x2 N5 C" U; j9 v
  12. {
    / q. Z  y* L5 L- G6 L
  13. retry++;
    : U7 M8 W8 I, ?- E, ~' p
  14. delay_us(1);2 M3 B# k6 [( F4 W
  15. };, ~% [, C3 w  G6 d
  16. if(retry>=200)return 1;
    ( Q9 F: q& Y# K
  17. else retry=0;
    $ L- R! g5 t3 U4 ?: `9 y* A
  18. while (!DS18B20_DQ_IN&&retry<240)
    ' w5 n# `+ S7 @5 T# s. h- ~* O3 o
  19. {. c) U7 O+ d5 Y: M7 r5 z% i
  20. retry++;
    - {0 E/ V: v1 F5 i$ W
  21. delay_us(1);1 s0 X; R2 H# c9 e
  22. };
    ; c6 `+ E/ k% Y* I  w* z3 O
  23. if(retry>=240)return 1;: j7 J& {2 o3 b  t- O+ _5 W" G& _
  24. return 0;
    8 L. f6 ]. A: S2 H: \( e
  25. }
复制代码

& ?: }3 W& \. @$ X
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
    * V9 q# d) @3 k7 B* G2 i5 i  h
  2. * 函 数 名 : DS18B20_IO_IN
    6 P* ^7 c4 N+ d6 h/ n( @1 n8 W
  3. * 函数功能 : DS18B20_IO 输入配置  ~  w+ R3 m8 n" K
  4. * 输 入 : 无
    9 k5 W5 V5 g& g( A- @. F- m
  5. * 输 出 : 无. y1 M7 Z, ?* J' ?5 D% S
  6. *****************************************************************/! j1 e  F& f" J3 n5 p8 N0 E
  7. void DS18B20_IO_IN(void)
    1 s& N3 Z; x0 V* x
  8. {$ Z3 }! N9 w9 C$ h
  9. GPIO_InitTypeDef GPIO_InitStructure;0 Q; k6 q+ }  v9 d/ m$ r, E
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;0 M* X8 z, P9 K( e5 J
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    $ N$ ~% B( q  I. ?$ F5 z+ G0 p
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    8 _, q3 p# X0 Z8 h* r* o' B: ]
  13. }
复制代码
  1. /****************************************************************
    & w0 I3 z( Z  u+ `8 ?; s* [/ U
  2. * 函 数 名 : DS18B20_IO_OUT
    " e. K  D9 K" V- q
  3. * 函数功能 : DS18B20_IO 输出配置
    8 l+ g* w" {5 t( u
  4. * 输 入 : 无
    5 e$ Y  q1 @; m- i  Z8 b
  5. * 输 出 : 无; ?* z0 P6 K5 v6 l) M) m
  6. *****************************************************************/
    ! w, F( y: Q3 z: p
  7. void DS18B20_IO_OUT(void)  \7 \/ A8 g+ M# j3 M  L
  8. {+ j9 a% x- p( g4 M; p. V/ y
  9. GPIO_InitTypeDef GPIO_InitStructure;
    ( t$ p. ~2 g$ {. Y8 {% Z- P( q! S4 N
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;6 R' y! q1 k2 c
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    0 ]# H4 n: i: n7 B, }
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    3 |( k% ?: `8 G" k( |/ m3 E
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);4 A9 R$ j( q6 W7 h# U" I1 C0 F" F
  14. }
复制代码

) h6 a% x" K4 L/ p" d
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。
! ^! ?* A( E+ _& I
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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