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

【经验分享】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. /****************************************************************
    * [" I5 |6 j5 E- B6 X
  2. * 函 数 名 : DS18B20_Init
    , p) o3 I+ S# e$ N
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在, _  u, d- |  [, I( ]6 M6 Z" G1 ^) X6 V
  4. * 输 入 : 无9 Z/ T/ I. \. @! n1 @
  5. * 输 出 : 1:不存在,0:存在6 O5 q1 [9 S; L5 H- T& L9 H; s
  6. *****************************************************************/
    4 d6 z3 o1 @2 g1 T% I, _
  7. u8 DS18B20_Init(void)' J- v7 u) l; I  a# |* d
  8. {
    : j+ I, N/ Z* g- i# p" M
  9. GPIO_InitTypeDef GPIO_InitStructure;
    - A3 i3 Q0 ?/ O  g  O' U3 i
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);4 m1 d, H/ N$ w, D- ?
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    : a3 d! m! T+ O4 J+ w/ y
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  {, I: k1 [* {6 e3 ^
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
      d, n7 z' o- ]! Y1 h
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);5 ], I& ~- Y( {6 P& u* G$ ]
  15. DS18B20_Reset();/ K  ?# E" P4 Q; |0 k
  16. return DS18B20_Check();
    / z" a" g0 T5 J- G; Y
  17. }
复制代码

2 H8 i7 }2 ^5 z8 @/ Y' m
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************% a4 z) A" `/ X8 d$ q" D, D5 ~4 e
  2. * 函 数 名 : DS18B20_Reset
    , {  k0 a. a2 H/ p8 ~+ j% `
  3. * 函数功能 : 复位 DS18B20
    ! ^4 U" Y, P! P% A. d
  4. * 输 入 : 无
    1 ^. B  m% m! f) v
  5. * 输 出 : 无
    8 u: Q3 F! q  _: }- |" R) {
  6. *****************************************************************/: j% e! q* ~4 f
  7. void DS18B20_Reset(void). a- ~9 a, }2 M. j1 G
  8. {  C& d( S# }7 O
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT* s: c. W: `: O% ^6 t, \3 e) |
  10. DS18B20_DQ_OUT=0; //拉低 DQ
    : o; F6 ^3 E$ J" H: k3 G
  11. delay_us(750); //拉低 750us+ A% M6 ?  I% E$ @5 M; K  r% D
  12. DS18B20_DQ_OUT=1; //DQ=1
    7 j. d3 F8 R% T
  13. delay_us(15); //15US5 H: n* V/ j: S! }4 }2 ~
  14. }
复制代码
  1. /****************************************************************- @' e% O( ?5 T' v# g  o9 Y, j( |" Q
  2. * 函 数 名 : DS18B20_Check
    $ |2 k5 N3 J/ N/ g4 {) |
  3. * 函数功能 : 检测 DS18B20 是否存在
    ( v/ w8 n3 O, G) j
  4. * 输 入 : 无3 f3 n0 f$ J& ]& _
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在6 z0 N4 s4 b0 N0 ]% s# v& Z% R. }
  6. *****************************************************************/
    + p; b: {# J$ K5 i% U5 O/ j: Q1 U
  7. u8 DS18B20_Check(void)2 U5 K4 j+ l7 O
  8. {
      r% Z. Z5 m; a0 E, n
  9. u8 retry=0;
    ' N: }: O. y9 s) k9 k
  10. DS18B20_IO_IN();//SET PG11 INPUT7 @% J% l/ B$ o! H3 W) D& o
  11. while (DS18B20_DQ_IN&&retry<200)
    : L. ]9 k+ e- ]% I* O  A! F& r
  12. {: X/ C3 \3 m7 _
  13. retry++;
    ( O+ z4 o0 v0 K) t
  14. delay_us(1);
      q7 `0 g2 t7 l9 [  e
  15. };
    ! C: ]$ V6 f5 H3 b5 `
  16. if(retry>=200)return 1;
    # p$ m8 L5 B, g  r& w- W
  17. else retry=0;! \# [3 d/ h/ V6 ]1 N
  18. while (!DS18B20_DQ_IN&&retry<240)5 ?2 u) t. j$ {% Z2 |9 ^
  19. {' i7 w: S' [: }8 n- g
  20. retry++;
    % {! ]0 m* Z4 j. D+ O
  21. delay_us(1);
    # I- n( l. b: x2 r( m, L& G
  22. };
    & Y* q7 h. G- C. r' ~. X) ?
  23. if(retry>=240)return 1;
    # U" [  x! F7 ?4 N3 q
  24. return 0;
    ' A& H( I  K$ y! b) y
  25. }
复制代码

1 o- y7 V/ Y4 B% A9 |
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************. O5 b2 |# T- A) b) Y8 B, o+ S$ x9 m
  2. * 函 数 名 : DS18B20_IO_IN
    ! V  w1 P+ {  G. _: w
  3. * 函数功能 : DS18B20_IO 输入配置
    7 u8 Z9 I' P( t* n  Z
  4. * 输 入 : 无8 F3 J1 o/ I, y5 T( N
  5. * 输 出 : 无! ^  ~- F' c- ~: y1 ]9 W% y1 |8 N
  6. *****************************************************************/
    % L% q0 H3 R1 R/ `1 D- r) Q
  7. void DS18B20_IO_IN(void)
    ) K+ \2 G3 a* d
  8. {
    - h, b8 y/ g2 T# Y  z: b
  9. GPIO_InitTypeDef GPIO_InitStructure;
    1 x8 l% `' w% S/ w) e* P
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;$ l5 e- p7 I$ `/ C% |% l. o8 V
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;" {' l' L: k3 J/ h
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);# O: _6 K/ C3 P4 R" C( v, R4 s- ^
  13. }
复制代码
  1. /****************************************************************
    & O/ x8 N+ Y! L4 ~, |* u" N
  2. * 函 数 名 : DS18B20_IO_OUT: }+ Z- d& Q, l& g
  3. * 函数功能 : DS18B20_IO 输出配置
    " J3 Q- P$ G& n  y* H! m( d
  4. * 输 入 : 无
    . a2 F- {4 A  s4 ]/ }3 R, M
  5. * 输 出 : 无
    ! b# e8 O- s8 a2 t
  6. *****************************************************************/
    7 e5 x7 A4 q. o8 P/ G
  7. void DS18B20_IO_OUT(void)+ z( @/ U5 n1 ]3 G: e& S5 n
  8. {
    8 B4 _% d! D9 l  n
  9. GPIO_InitTypeDef GPIO_InitStructure;
    1 x: Q2 Q8 ?6 J
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;9 o/ @& l: ~$ D4 O: t% Z
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;) h; u( i+ {9 k: D8 y
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;* ~- q. }$ @; M2 S) W
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);! k; U- {3 M4 T- a5 N: R
  14. }
复制代码
: v* r/ N$ \/ `; H0 [+ `- J' r
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。
2 G% |" N  S8 V- m' J
赞 收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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