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

【经验分享】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. /****************************************************************
    2 R# t) K; ?- d: V1 t" u
  2. * 函 数 名 : DS18B20_Init) O& P1 f& a- J3 Q% i) P
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在
    5 \  w2 E3 p1 a& H* ?6 o4 L
  4. * 输 入 : 无3 j, h  R1 S2 R% `( G: E- E
  5. * 输 出 : 1:不存在,0:存在
    , h( E4 n# a. Q0 X7 o
  6. *****************************************************************/# Y; {& r( g: a: s; c1 @- b! z
  7. u8 DS18B20_Init(void)
    , C- M- s7 o: |9 b  ^
  8. {+ H- N0 H7 {: N; h  H* L
  9. GPIO_InitTypeDef GPIO_InitStructure;
    ' ~( l  o- [) x9 K( G9 J
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
    . N- a9 t7 \! m9 b& N
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;/ L- Y6 Y7 b6 M8 F1 s1 D) `) {
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
      d  b8 \+ ?1 \! t! `
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    4 X, w2 g) K! O
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);6 ]9 q2 Q/ t# C
  15. DS18B20_Reset();
    , f, I' y% p8 Z! y3 L- g
  16. return DS18B20_Check();  }9 Y7 m+ u# V; A" C+ v( j" Q( L/ p
  17. }
复制代码

7 A5 ^. o0 E8 R, g1 f
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    : _" g4 [, T+ R* @) b# n) R
  2. * 函 数 名 : DS18B20_Reset' D5 T0 P+ _. o2 `% P
  3. * 函数功能 : 复位 DS18B20
    ) R. ?; d- G1 r0 p# f8 o+ x! x! F9 h
  4. * 输 入 : 无8 c+ v% u$ F9 A: L, i) e4 }8 z, z
  5. * 输 出 : 无
    1 B5 a- W2 a0 F. T* W( t' s) z7 c
  6. *****************************************************************/: L; S$ {$ ]& y: H- Y
  7. void DS18B20_Reset(void)
    ' a: {, A: Z, C# h" c; a& a# D
  8. {8 W" g8 a6 o5 d* {& g  S
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
    8 ]4 |; s. ]' o' C
  10. DS18B20_DQ_OUT=0; //拉低 DQ) O  k" g0 m* A
  11. delay_us(750); //拉低 750us0 X0 U1 A$ w$ q" j$ u) U2 y
  12. DS18B20_DQ_OUT=1; //DQ=1
    3 j. q* z4 P, P* L# ^$ C# q) Q$ S
  13. delay_us(15); //15US
    " E& y) n2 _2 r, Y( [" C
  14. }
复制代码
  1. /****************************************************************9 D) e2 \" t3 _3 H: F
  2. * 函 数 名 : DS18B20_Check. m! u7 p) a' ]8 h( j
  3. * 函数功能 : 检测 DS18B20 是否存在/ Y- p, U$ z1 |9 ~
  4. * 输 入 : 无
    : q; p: z9 \6 u6 i+ B* @
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在
    * f$ R# l* h+ R# ^/ J& \& B
  6. *****************************************************************/$ ^. D0 G. U$ N
  7. u8 DS18B20_Check(void)* J' `$ j1 Y: S3 \" X8 F1 i
  8. {  c3 L0 O4 \& ?& L3 \
  9. u8 retry=0;- S" @% }9 J& I2 f# Z
  10. DS18B20_IO_IN();//SET PG11 INPUT
    , s: y: Z  z6 s' {+ x
  11. while (DS18B20_DQ_IN&&retry<200)
    9 {. X+ \$ I+ m+ {
  12. {
    4 H) F- `: g. w7 K: ~( p3 s  F8 p
  13. retry++;- O  `8 Y$ y" @
  14. delay_us(1);; Q' l' O' E" K+ g4 Q
  15. };
    4 e. N1 p: Y% ?: D3 Z
  16. if(retry>=200)return 1;
    % G: E' L$ l( _4 t; I/ @: T" q
  17. else retry=0;$ D' _4 {2 a2 h# m
  18. while (!DS18B20_DQ_IN&&retry<240)' Q7 A; B, b/ o. j; `$ l0 O3 |
  19. {
    . d* G/ y9 i5 a% ~3 F1 w6 y- y
  20. retry++;6 ^  M4 t+ v  k) V4 O# h
  21. delay_us(1);
    ! n' u8 e) Q9 z& g& z
  22. };# h2 P5 a( L0 E1 E
  23. if(retry>=240)return 1;
    6 V$ p  P6 |$ V( A* c" P
  24. return 0;
    3 i6 S5 v( [1 u) H1 H4 B
  25. }
复制代码
7 K- U! O) E* w6 h# {3 \
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
    4 l6 T% f) d) ^. H
  2. * 函 数 名 : DS18B20_IO_IN- O- P& b5 |- U* b: p) p" C6 y
  3. * 函数功能 : DS18B20_IO 输入配置
    - r4 P+ |$ M2 j; A
  4. * 输 入 : 无# c2 S% L5 K$ V) o
  5. * 输 出 : 无
      e0 o6 G* [! B' V3 x  _
  6. *****************************************************************/' V: |5 s7 W* x+ v3 j
  7. void DS18B20_IO_IN(void)
    6 i' m+ `5 T' {3 Q3 p
  8. {
    / N1 y# }& X, l% l( v/ s/ ^
  9. GPIO_InitTypeDef GPIO_InitStructure;! R5 n4 _9 c7 V$ W2 |
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    ' F! |  G* n  B/ ]4 @8 p; ?
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;8 R6 P+ V- N! I, [6 s
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);0 ]) S; |% b3 i+ W. |3 Y( C" Z6 D# z
  13. }
复制代码
  1. /****************************************************************
    % ~0 V" P  M7 k
  2. * 函 数 名 : DS18B20_IO_OUT
    / R1 o8 l( G/ C1 Y( F1 `
  3. * 函数功能 : DS18B20_IO 输出配置: c5 g# g% [) u! P
  4. * 输 入 : 无0 x1 R$ j- |( I: u
  5. * 输 出 : 无0 W% |. t7 e# ]. f& i  y) W
  6. *****************************************************************// l  o0 _; t, l9 u9 V
  7. void DS18B20_IO_OUT(void)
    & A* ?0 l. I( k& c* |1 J
  8. {
    # L0 f, {0 @6 S2 e& O* V
  9. GPIO_InitTypeDef GPIO_InitStructure;
    2 W, z  R( T# f% V" n- g4 i
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    ' N7 e7 Q2 j. ^) `/ W
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    1 ~4 u9 T/ g5 j" K
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;) B. E, g  e! Q  d3 V& j
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    4 S4 \8 C) |3 j7 f4 v
  14. }
复制代码
, x+ L. Q% g  w1 o
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。
5 W' z  V# b' X- @# V
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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