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

【经验分享】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. /****************************************************************
    4 M" l$ e% N& n
  2. * 函 数 名 : DS18B20_Init
    6 A& G+ o$ u! ~) u3 M& G
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在( f5 Y0 F5 ]" t" }7 x; L
  4. * 输 入 : 无" w3 A, Q' a) _4 j
  5. * 输 出 : 1:不存在,0:存在
    $ u9 u* b% |( l6 T
  6. *****************************************************************/
    " |6 t9 d7 I( u
  7. u8 DS18B20_Init(void)
    & q/ P1 K* Z- f) y* `6 a
  8. {
    ( e  Z3 Z% N( g0 r# B% D
  9. GPIO_InitTypeDef GPIO_InitStructure;
    ! k  C$ z3 \$ e7 o5 }$ j
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);: Y) m! z# J( M/ n% m; H3 L1 w
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    ; `. ^& S) `5 ~0 f! ^- Y
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    1 B3 Q9 w3 y' i$ j6 w6 A, @
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;+ R* x. l3 Z* n# i
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);* Y! V1 r1 H5 V( h
  15. DS18B20_Reset();
      q: l( _# i* r2 c" j! Y& E
  16. return DS18B20_Check();
    + F0 Z- {8 B! [- b3 p$ Z
  17. }
复制代码

$ G; \, d' U$ c4 r7 n
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    , b7 n% R" ]! p& w  w5 b& Q4 p
  2. * 函 数 名 : DS18B20_Reset
    7 m  f9 I$ ~$ d, |
  3. * 函数功能 : 复位 DS18B20
    ; T, k- c5 _8 P) K; `+ X! B3 p
  4. * 输 入 : 无
    ; c; m2 u+ r5 H: G& O
  5. * 输 出 : 无" A+ ]" b2 z9 H
  6. *****************************************************************/1 w8 E$ m3 _0 v6 K" A9 e+ s; K: _
  7. void DS18B20_Reset(void)* l" G4 K9 D1 B# N# o* f' @
  8. {
    ; u0 y# t. `, A5 a# Y, c
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT3 _; e8 U% ]" s1 e
  10. DS18B20_DQ_OUT=0; //拉低 DQ8 g; f. |: d1 ~* P# U" T
  11. delay_us(750); //拉低 750us. [# L; e+ p6 u
  12. DS18B20_DQ_OUT=1; //DQ=18 z' n5 ?3 [0 k7 [4 ~+ u* i+ z, x
  13. delay_us(15); //15US
    6 n6 e5 Z! ~0 a( `' i
  14. }
复制代码
  1. /****************************************************************% C) l" Q  G4 p# ]' a/ f
  2. * 函 数 名 : DS18B20_Check
      R/ M/ O4 K8 N: {" H4 c: o
  3. * 函数功能 : 检测 DS18B20 是否存在
    . y2 l+ G! q8 S$ z& ~
  4. * 输 入 : 无- h2 o5 j1 N2 N$ ?
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在+ G. [, v' d: ]: X% T
  6. *****************************************************************/  J+ Y' J. L; k0 n3 }7 D% _
  7. u8 DS18B20_Check(void)6 b& q( S0 ]1 `9 H- i& t" i
  8. {
    / v4 t& c* B% A% ^: a0 P
  9. u8 retry=0;1 a4 Q$ K% Z1 z) U  \0 C. F
  10. DS18B20_IO_IN();//SET PG11 INPUT
    ( N) y6 v5 M1 R$ p# @
  11. while (DS18B20_DQ_IN&&retry<200)
    * n/ w% d& f/ Q0 @- }" M
  12. {
    3 Y/ [' L1 s' I" I
  13. retry++;
    0 I4 b7 c8 f5 G: w( |1 n: j/ `1 H; _
  14. delay_us(1);
    ) w5 Q: ~6 `* q0 I+ N* X
  15. };
    1 L# \6 S$ V# A- O( Z
  16. if(retry>=200)return 1;/ s$ h& ]8 f. T( j2 D1 I" L
  17. else retry=0;: ~6 o" X' e+ C8 `( q. M
  18. while (!DS18B20_DQ_IN&&retry<240)3 c, S1 [+ ~& }, _/ v
  19. {1 A: W' @  F! x5 N/ y
  20. retry++;
    2 L, V- N) y; T( b
  21. delay_us(1);
    " B5 j- H# o" l3 L5 C( L8 f
  22. };+ I- B+ z) ?. k/ j/ v6 b
  23. if(retry>=240)return 1;
    1 |5 N6 P% z9 N) e3 r
  24. return 0;# C7 G, z8 V/ \  ?+ @
  25. }
复制代码
8 O; n6 o: G- d& G* d& H* x2 N
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
    0 S' \& _& s. U" W% e) k
  2. * 函 数 名 : DS18B20_IO_IN) t/ R- c5 k+ U
  3. * 函数功能 : DS18B20_IO 输入配置* h: [: l4 h7 j; P3 d. m
  4. * 输 入 : 无
    % @$ M) D! F  F7 _
  5. * 输 出 : 无+ g+ h7 F3 U3 ^
  6. *****************************************************************/
    * A1 B) Q* k9 C4 L
  7. void DS18B20_IO_IN(void)
    # N1 }( T3 }; d
  8. {
    / E# r. j/ A7 I0 A! y, x2 k* N, R5 q
  9. GPIO_InitTypeDef GPIO_InitStructure;2 Y8 x- z$ A& S: ~" m
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
      ], O- p, Y8 e' c; v
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;9 b- u- Y: y5 X7 c3 n
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);7 j" u$ k: \0 G7 M8 Y3 W) h
  13. }
复制代码
  1. /****************************************************************( d' ]; A& S; S  I5 u: R2 @
  2. * 函 数 名 : DS18B20_IO_OUT) @' z4 f+ P0 N% `
  3. * 函数功能 : DS18B20_IO 输出配置
    * Z* @/ V. s! T% b7 c4 e0 F
  4. * 输 入 : 无
    ; h8 C3 ~( [" o/ r) I& M
  5. * 输 出 : 无
      `8 d, H* P% r
  6. *****************************************************************/
    9 j9 \" d1 d$ k" u/ }
  7. void DS18B20_IO_OUT(void)3 ?- Y: g; p0 L- V1 C
  8. {
    ; ]2 x$ m, x  ]- |) Z
  9. GPIO_InitTypeDef GPIO_InitStructure;% T# Z; z' s) V) ]+ t- Y* g
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;+ k6 r! H$ ?8 y& s& q, d1 W
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    : {! Y, t8 O0 }8 Q- `# N) I
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    7 a' ^9 a3 G* ^5 b# V3 k
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);. P/ Y( S8 h" W% F4 v
  14. }
复制代码
3 ?% c% G- E. M4 V6 O1 j& |
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。

% _7 w8 [$ u2 C  f  U; g! B4 n
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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