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

【经验分享】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. /****************************************************************$ Z, B$ G& T- V, j" w5 A( p9 ?2 R) ~
  2. * 函 数 名 : DS18B20_Init
    - z( c- t) ^/ H6 I9 |
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在% H2 q. k( ?( F, X: U6 l" I4 }' `
  4. * 输 入 : 无6 Q! `' I9 w3 p4 G! K0 n3 O2 r- Q. s
  5. * 输 出 : 1:不存在,0:存在; e9 e3 E' C/ z0 @' q( I/ ~
  6. *****************************************************************/" Y7 s& A9 O' v7 P6 @9 l
  7. u8 DS18B20_Init(void)  ~; P3 L9 y! S$ v
  8. {
    2 M" E  o+ z0 i
  9. GPIO_InitTypeDef GPIO_InitStructure;
    % M2 A) B0 [3 F5 l( p5 J
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);& X7 ~* @. f( v! V7 ~! Y
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    5 W, I7 s; x. V; z  @' v$ x
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
      H! u) M7 {. n: s( q/ J
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;3 Q& a  `' @1 M
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    & f/ K; z$ h6 J+ Y4 r; a; V
  15. DS18B20_Reset();
    - @2 W5 p( m+ u! J% O
  16. return DS18B20_Check();  Q4 x; m! h$ D) C; i3 ~
  17. }
复制代码

' p# Z- q  a2 L( [
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    9 i- B) ]. k' v8 }! h
  2. * 函 数 名 : DS18B20_Reset2 j0 w6 J1 L( I! i6 j
  3. * 函数功能 : 复位 DS18B208 [, _2 u) ~- i5 ~( p2 m/ W1 J
  4. * 输 入 : 无5 y9 t: a! @, m4 H; J" r3 H
  5. * 输 出 : 无* S( F" w0 ~$ M) v
  6. *****************************************************************/
    ' v9 l# D$ l- q0 p) p
  7. void DS18B20_Reset(void)
    1 i; x; G% n0 Z- @; j# n$ k
  8. {! Y4 B& }; I  x
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
    % C$ x  c5 q3 i$ a$ u% ^
  10. DS18B20_DQ_OUT=0; //拉低 DQ5 l: D' ^: y3 }
  11. delay_us(750); //拉低 750us* i+ h* u+ U( a
  12. DS18B20_DQ_OUT=1; //DQ=1
    7 q9 V. I, L! a, {( ?; p" T
  13. delay_us(15); //15US
    0 R1 C0 U- C! l: V# |; U
  14. }
复制代码
  1. /****************************************************************2 Q; V% ~% T3 ^5 @, V" f
  2. * 函 数 名 : DS18B20_Check( u- h2 V; h  ]8 l
  3. * 函数功能 : 检测 DS18B20 是否存在
    , \( T2 W; Z* _: K5 f# u" J
  4. * 输 入 : 无9 k9 ^: e& e7 w0 q3 [5 v" E7 V& i2 ]
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在
    - S8 h" Q. ~" ~; G' q
  6. *****************************************************************/
    9 L" c3 m/ _4 S) q& M8 g& p
  7. u8 DS18B20_Check(void)5 A6 u4 w; Q( N  L
  8. {
    " L2 {7 I; Z6 F$ t% A
  9. u8 retry=0;+ X/ R) [- q8 H$ O" I
  10. DS18B20_IO_IN();//SET PG11 INPUT( @  a0 z8 M  V$ o( w  ~$ _. x7 o
  11. while (DS18B20_DQ_IN&&retry<200)
      U" S- x. k0 E, E+ S( n% z
  12. {& m7 Z5 f& R; f3 V  F# i# q
  13. retry++;
    ! Z% L* `$ g0 F9 |. D' C9 w3 G( V; m. y2 s
  14. delay_us(1);
    0 I5 {7 z9 R6 ?/ b7 v. v/ h9 P4 j
  15. };
    . T+ k$ C. O; `
  16. if(retry>=200)return 1;6 j4 a  l: T% N& J: l. {
  17. else retry=0;
    2 ~4 A; o0 g& W# E
  18. while (!DS18B20_DQ_IN&&retry<240); T- U. x  F- c: v
  19. {
    , U+ v7 n  a  ~( M/ l9 K7 t
  20. retry++;
    + ^! o$ r; a" B. K. g- a- r. _
  21. delay_us(1);6 _# X1 r5 }/ F) e6 |5 r9 Z2 d
  22. };
    0 h: c, L5 B" y0 s8 `) }( m8 ?
  23. if(retry>=240)return 1;
    5 b5 ~: ^2 ^: Y9 x8 p, ?' K. f
  24. return 0;3 K( {9 ~/ Y4 S3 B+ G
  25. }
复制代码

/ k, O% _0 M/ ~5 \7 }
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
    % V+ y% a3 s  ]8 I  {) b' b% ]  Y
  2. * 函 数 名 : DS18B20_IO_IN
      P1 T+ f+ n7 y, o& V; M/ ]
  3. * 函数功能 : DS18B20_IO 输入配置( c+ `; Z$ a, H1 u' c
  4. * 输 入 : 无; S  N& o1 p& R' \: U
  5. * 输 出 : 无
    1 R5 s3 q8 W% @: r( j5 H* o
  6. *****************************************************************/, d9 D. O' V0 j( l# v
  7. void DS18B20_IO_IN(void)# S  @" c; o" D/ m5 Y, F/ e% r
  8. {
    * F& h6 R7 ?5 C* _' K. N( n$ m
  9. GPIO_InitTypeDef GPIO_InitStructure;' Z8 B: `4 l' f
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    * f0 x8 q4 [2 K# l% G
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;% R( X+ t$ a* `) C: [7 q+ W
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    5 T! s4 [& [2 ?5 f
  13. }
复制代码
  1. /****************************************************************
    . B' Q( U0 `# a! {" u  d
  2. * 函 数 名 : DS18B20_IO_OUT& `" m( S( r, @
  3. * 函数功能 : DS18B20_IO 输出配置
    ) ]9 ]" ]  [$ T+ c% g3 j
  4. * 输 入 : 无2 U; Y4 b/ B5 w! \5 l/ H0 M
  5. * 输 出 : 无
    " y, d( n1 ]2 k. [4 j5 s
  6. *****************************************************************/
      d% b2 x7 R  h  M5 n
  7. void DS18B20_IO_OUT(void)
    , g9 w% @/ f& z, y' ?" A( p* E
  8. {  y3 p! [& A; t; x) _5 D
  9. GPIO_InitTypeDef GPIO_InitStructure;4 j4 x. a6 H' z+ |
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    * B  `. D2 o+ M# T) A, Y
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    + ~8 S5 k& p. F7 B  S9 b
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;8 z) V  H( N( }' l: Z7 V; w+ M
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);" K: a/ z+ P! M$ e0 W
  14. }
复制代码

2 C! C" W8 c/ _8 H1 Y2 c1 u
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。

# T) J1 c- ?# a9 [- g
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版