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

【经验分享】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. /****************************************************************1 j8 Z$ u8 R! L; H4 l. H
  2. * 函 数 名 : DS18B20_Init3 V! @- k7 N6 D' `
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在4 {1 v% z4 w% z" y
  4. * 输 入 : 无  k1 ~, M/ }! t, r( D' ~
  5. * 输 出 : 1:不存在,0:存在2 r/ F1 r4 J! o% h
  6. *****************************************************************/7 s! s1 g! M; ]( p+ j8 O" I" u
  7. u8 DS18B20_Init(void)
    1 E3 ~% B. i. n; _" R+ {
  8. {; z6 {$ d: Z+ X% Y  g' o
  9. GPIO_InitTypeDef GPIO_InitStructure;
    2 h6 M' m# a# A3 _' D% V% E2 I5 m- ^
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);( ?, b/ L% e9 P3 u) T: B: [  y& H/ e# r
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    & o; t+ a  F6 ^: k/ `5 p
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;' L5 N& B+ G* i; T' i2 f
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;5 b( {- G; e4 j) Q& T
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    ! v/ B/ |1 y7 \7 S
  15. DS18B20_Reset();" Y8 b+ m* A+ I4 ~# k1 r7 @4 Z0 v: K
  16. return DS18B20_Check();
    7 I( w% ^& I+ }% R. B6 z# i% \
  17. }
复制代码

3 ~7 {, u7 ^' D, N9 a
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    1 N' W1 }. }% E( V. X) }+ `
  2. * 函 数 名 : DS18B20_Reset
    ; Z7 S+ t5 y& O
  3. * 函数功能 : 复位 DS18B20
    5 O) C" d+ R/ i) |4 w
  4. * 输 入 : 无1 k  c+ q& W: O/ Q. R2 E
  5. * 输 出 : 无" S+ p, }  j1 N
  6. *****************************************************************/4 }  C4 Y8 ], B3 U
  7. void DS18B20_Reset(void)4 B* m1 Z* }- @6 _$ i, `
  8. {8 L7 K7 r" i( O: K9 R5 [1 V
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
    5 S, a. v) k1 `8 B  Q
  10. DS18B20_DQ_OUT=0; //拉低 DQ
    - D- J, R' X$ f# [2 C- t/ E2 D+ }
  11. delay_us(750); //拉低 750us' I  V3 d' g' M6 [. d
  12. DS18B20_DQ_OUT=1; //DQ=13 ^' M% r; U. X% J
  13. delay_us(15); //15US
      n, f) U! m2 S  s, d9 o
  14. }
复制代码
  1. /****************************************************************8 D7 j, x6 w- ]! |) o( B
  2. * 函 数 名 : DS18B20_Check
    . S. p7 n- W* x! b  c: L3 i
  3. * 函数功能 : 检测 DS18B20 是否存在3 A0 I$ a3 l2 P5 S8 P' D6 J
  4. * 输 入 : 无
    % ^7 Z  f" I8 n$ `
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在: M& g+ m* K( u  M3 A
  6. *****************************************************************// ~1 X2 c$ M+ f7 b
  7. u8 DS18B20_Check(void)
    + ?# ~" _; A' A" a' ~  N
  8. {
    + ]" t8 F# C0 [, E/ i$ f8 U& l
  9. u8 retry=0;
    0 h# ?9 b) @/ x" T  \
  10. DS18B20_IO_IN();//SET PG11 INPUT
    9 f! d' u' J! |) W
  11. while (DS18B20_DQ_IN&&retry<200)
    0 e1 l! m0 N' E, b) }; T
  12. {
    # `4 Y4 S* w) H
  13. retry++;4 _, ?5 v3 l$ X/ a
  14. delay_us(1);+ X6 S% m8 m- n0 X( }( k8 W* ]1 [
  15. };
    ) D, A0 i& B( C* s
  16. if(retry>=200)return 1;& [4 p7 f, g# o
  17. else retry=0;
    & l6 n- r4 h7 F' }
  18. while (!DS18B20_DQ_IN&&retry<240)
    8 L' n7 m( k6 Z$ }* z# Q! \1 U' d
  19. {% \# B: |% n: `
  20. retry++;
    % w( S  \7 ~6 u6 E5 J
  21. delay_us(1);
    . V; u. @! r. x" r
  22. };/ _/ @- c( f; o9 Y1 h4 H
  23. if(retry>=240)return 1;
    2 \6 i6 |0 a  M0 l% a
  24. return 0;$ G7 T$ Z/ o8 c4 o( A
  25. }
复制代码

3 O3 ^; x0 |) }8 p, v
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
    $ \  U7 J- R1 D$ ^# q/ u! X
  2. * 函 数 名 : DS18B20_IO_IN- T$ r4 w3 S( `2 x# Z
  3. * 函数功能 : DS18B20_IO 输入配置
    5 Z; x1 D5 j8 }. M( O
  4. * 输 入 : 无3 o( [+ d, ~4 D2 z
  5. * 输 出 : 无$ d% O0 o! s+ f9 y
  6. *****************************************************************/
    ' M' x8 |$ ]* g7 d* ^9 I
  7. void DS18B20_IO_IN(void)# k$ \$ u4 t8 L
  8. {5 z& J3 F. C! Q7 ]+ f
  9. GPIO_InitTypeDef GPIO_InitStructure;
    6 X  n! g/ _8 p
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    ; K( l1 p1 D3 g1 `
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;5 w1 K# l0 u: ]4 u/ r  i5 C
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    5 m; B5 a0 |3 T- o
  13. }
复制代码
  1. /****************************************************************- a7 e/ m9 M3 ~
  2. * 函 数 名 : DS18B20_IO_OUT
    : P: T* C4 W( Z" \$ d) c( l  a$ I9 _
  3. * 函数功能 : DS18B20_IO 输出配置
    8 ^4 T- t1 |( z! b3 U% A
  4. * 输 入 : 无
    / B7 M9 a. F/ Z: U
  5. * 输 出 : 无
    8 u! q* P. E+ a1 N/ k0 X; s9 U
  6. *****************************************************************/" [: V) }+ b. p+ y/ K8 c. s1 l
  7. void DS18B20_IO_OUT(void)
    : Z2 Y  W9 L4 k6 ^8 a* t/ ~' a: t
  8. {- \% n3 J1 s( w; ?( a. A
  9. GPIO_InitTypeDef GPIO_InitStructure;/ t, j+ f! L9 W
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;9 S& R! I5 M  k1 a0 {6 L: _9 Q
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;3 i/ W  s" _& F& Y) y
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;! y) p" a8 A* m4 [3 J5 i4 l$ i4 ~
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    ( {& Q( r) r2 K- I
  14. }
复制代码
. m& k) w# J1 @9 O9 d3 Y$ h
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。

; M  Y1 {5 `9 T2 F/ X
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版