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

【经验分享】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. /****************************************************************/ A! E! e8 f( K6 F% m$ r
  2. * 函 数 名 : DS18B20_Init+ X+ n" P( L# A7 Y' V7 q. m* @
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在
    . Y' d, ~8 U( K. q; b0 e
  4. * 输 入 : 无0 T) S& `# E! Z9 z7 m+ l# l
  5. * 输 出 : 1:不存在,0:存在+ \0 F4 m) l  R
  6. *****************************************************************// h$ Z: ^4 J0 q$ D& j8 n' S
  7. u8 DS18B20_Init(void)
    . O- F/ D: k8 n
  8. {. `7 K% W' A: n+ W+ g/ f
  9. GPIO_InitTypeDef GPIO_InitStructure;
    5 K$ |" ^( V, c5 u& Q$ C' c3 S2 n
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);. y/ p3 i; i1 F9 a
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;" Z, L/ O& |- a' ~7 E  A+ U5 p% C
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    ) |' p0 ^% S  D! e0 L6 W
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;# W# u" ?3 J  V  g$ A
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);/ v. w( c% ?: z
  15. DS18B20_Reset();
    . h4 w" V" ?2 J3 \, S8 [0 W2 B
  16. return DS18B20_Check();' r  t& ?* d6 |0 i6 Z: P
  17. }
复制代码
2 T9 B, x9 @2 {$ k5 _" A8 c/ j( S
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************0 b5 v& X& P; K5 m* o' k/ G& }
  2. * 函 数 名 : DS18B20_Reset! V# B- ?% ?* ^
  3. * 函数功能 : 复位 DS18B20
      o: o( L: R9 H: x
  4. * 输 入 : 无
    $ |7 m: d( W$ y% T* ?1 E% E
  5. * 输 出 : 无# C" e" O" ^$ Q; g' @9 ?
  6. *****************************************************************/3 c9 F6 ~# s. m. w5 g2 @
  7. void DS18B20_Reset(void)6 r- J% x  L8 t: g
  8. {
    " ^+ d. Z0 l: T5 n2 a3 v- ^
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
    & y4 u& }3 a3 n- x/ }) s3 S# D
  10. DS18B20_DQ_OUT=0; //拉低 DQ
    ' `# J3 g( |8 Y; W; ^, U
  11. delay_us(750); //拉低 750us3 h6 x1 i9 `* c! t9 P
  12. DS18B20_DQ_OUT=1; //DQ=1
    ; o3 k: G) x  ?- ]' z
  13. delay_us(15); //15US
    7 |9 g5 n6 `; v& A6 O: m/ e) F" @
  14. }
复制代码
  1. /****************************************************************& g- f. @$ S  Q) X  F
  2. * 函 数 名 : DS18B20_Check
    7 B  \) S. _9 r  U% n
  3. * 函数功能 : 检测 DS18B20 是否存在
    $ z+ C/ J9 E) M# p' B2 W
  4. * 输 入 : 无
    * f# x. ~( L7 w; R; z1 t
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在
    7 _7 h8 l: F! _3 z! u! {9 c
  6. *****************************************************************/
    $ e6 G+ q# F) {% [
  7. u8 DS18B20_Check(void)8 ?& M6 u$ N% ]+ B% b# E
  8. {
    , C7 [! y/ I" @- G4 t/ W; S" h
  9. u8 retry=0;3 S1 N3 }" t9 s9 z$ d- M% `4 [
  10. DS18B20_IO_IN();//SET PG11 INPUT
    5 M2 l2 ^: i* Y  P$ [
  11. while (DS18B20_DQ_IN&&retry<200)
      u9 i( U( T- Z$ ?3 x
  12. {0 M0 g( H, L: L8 `7 o) ?$ F- v/ H5 E
  13. retry++;
    . z& S% j' H) A+ x$ `8 z
  14. delay_us(1);
    : b" P8 }8 U) F3 R& D- P/ D
  15. };
    4 a; v$ C' v/ C$ J# l9 k  I
  16. if(retry>=200)return 1;' G1 b2 x5 c  ]# ]- o, H% g# j
  17. else retry=0;9 h) F7 ]% X- g" ^6 a' Y  o
  18. while (!DS18B20_DQ_IN&&retry<240)2 E5 s9 U! W; W$ `
  19. {+ q& L6 H: y, I' R  k7 g
  20. retry++;1 {; D; |: T+ c' S
  21. delay_us(1);) |. R2 ]1 a: _2 Y" d1 j
  22. };! M3 K: z2 r) ?
  23. if(retry>=240)return 1;
    2 }0 v* F( k$ i2 i6 f4 b" Q, ?7 E, b
  24. return 0;4 Z- x# B% D1 s4 N9 m8 x
  25. }
复制代码
3 g0 P% M3 T, ^  _' r( A. o  ?
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************1 K4 Z. Y4 S! x% z: b
  2. * 函 数 名 : DS18B20_IO_IN- j7 p7 A; Y& L( o, `7 [
  3. * 函数功能 : DS18B20_IO 输入配置- D" @3 Y- D. e9 q, Q' X$ v
  4. * 输 入 : 无: q: \( X9 _1 T9 J7 s1 P: E9 K
  5. * 输 出 : 无$ j1 [3 m4 E9 B$ ~  \
  6. *****************************************************************/
    - u, \0 \$ h* M
  7. void DS18B20_IO_IN(void)
    $ F/ D% _3 K& y, c* ^! n. y
  8. {
    9 Z. F0 w: f: N$ o! N
  9. GPIO_InitTypeDef GPIO_InitStructure;
    0 o6 W7 h4 E5 S4 y4 g
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    8 F! O0 b3 b" ]8 h
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    # w3 t2 W+ G) [, b% ]; @
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    6 U0 G2 \! ]* c" E
  13. }
复制代码
  1. /****************************************************************
    ) F3 L; x, n2 V0 v
  2. * 函 数 名 : DS18B20_IO_OUT
    & B; S6 m, J# h  Z$ S, \
  3. * 函数功能 : DS18B20_IO 输出配置
    ( y0 T1 t1 h: V! {8 G+ V
  4. * 输 入 : 无' N: }  o0 r0 R( R$ G
  5. * 输 出 : 无0 T- {* t$ G& i  c  B/ A) r  z7 v
  6. *****************************************************************/
    ) @2 o2 F) ~% E- u) d5 o
  7. void DS18B20_IO_OUT(void)& e# L4 t. N$ C, i
  8. {
    ) D4 {9 r9 L0 w( ?: ^
  9. GPIO_InitTypeDef GPIO_InitStructure;
    $ @1 y- L% Q; f- O
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    % `/ p! L; ?1 a* ~, C8 v/ A
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;7 @1 ~3 Q+ t2 n8 b, M
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    ( `% Y/ A1 p1 S
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);* S" P9 ]0 D1 T4 d3 E' B
  14. }
复制代码

- o) F: H! V' y# ]
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。
" a) [9 c9 M* y2 O$ T1 D# {5 A& d
收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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