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

【经验分享】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. /****************************************************************9 ]4 T8 i4 n) X. c2 F
  2. * 函 数 名 : DS18B20_Init0 }- [7 C- k4 t
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在7 \4 `0 Z  }! l1 h% D
  4. * 输 入 : 无
    0 T$ w# z2 Z$ s! c) J0 ~
  5. * 输 出 : 1:不存在,0:存在
    ' O. d/ c/ \+ A- Z
  6. *****************************************************************/
    1 N7 o4 F+ X$ D) \4 W/ d
  7. u8 DS18B20_Init(void)7 L" Q+ O+ }1 l4 Q
  8. {! R2 _. q* r' d1 j/ E
  9. GPIO_InitTypeDef GPIO_InitStructure;7 k1 Z: p: B7 L/ H2 j7 J
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);- t+ N* _/ H% q/ a! r
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;/ Q/ |6 \5 |. r2 p" Y2 D! T
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;6 J3 Y) B2 c2 ~0 t3 V9 V# @& N
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;1 m6 E& h8 ?: i  C6 N# `: U
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);2 c* H1 k5 k" Q* t- G1 Y5 _
  15. DS18B20_Reset();2 |7 I( j* {* S( U
  16. return DS18B20_Check();" r' B3 V% r. Z4 [" _' e' [
  17. }
复制代码

3 f8 m; E! f6 J. c  i
    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
    " a9 A+ O3 Z$ C2 ^9 x
  2. * 函 数 名 : DS18B20_Reset. V; z7 ?" [  c: `- r/ q/ f8 b8 D& A
  3. * 函数功能 : 复位 DS18B20( O3 L. e, e/ y" l
  4. * 输 入 : 无  V; K5 K( e4 W* @0 ]  ^% f1 b
  5. * 输 出 : 无
      @% }; O* K1 j: Z3 h. S. d
  6. *****************************************************************/5 M8 _! d  C( b. {+ q. z
  7. void DS18B20_Reset(void)0 U2 p: n  Z- v- w$ O0 |0 h$ K
  8. {
    3 p! W5 Q' [0 r% K4 o4 b
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
    # m( O  c" l, U, Z
  10. DS18B20_DQ_OUT=0; //拉低 DQ9 i4 W* c7 I& O6 u
  11. delay_us(750); //拉低 750us* m* s: ^/ Q* v# d; o
  12. DS18B20_DQ_OUT=1; //DQ=18 G" a6 t0 t7 Y2 P
  13. delay_us(15); //15US
    3 \/ f' q. z, I: k9 A% @, p- i
  14. }
复制代码
  1. /****************************************************************4 D) a2 r& Q, ^$ m  q( A/ I
  2. * 函 数 名 : DS18B20_Check
    & x6 A' r. m# K) T) K  _8 p
  3. * 函数功能 : 检测 DS18B20 是否存在
    6 d4 P  r+ S9 l* C
  4. * 输 入 : 无6 [- U  O( ^/ F- v
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在! f+ q! ]6 s6 k0 w- ?
  6. *****************************************************************/
    ! L5 d# T* Z' @; k! {
  7. u8 DS18B20_Check(void)) H/ v8 _" ^: v* Q  ~6 d
  8. {
    0 \2 _; `  J" Z6 V
  9. u8 retry=0;
    , b; L; D' ?2 \+ V# D% R
  10. DS18B20_IO_IN();//SET PG11 INPUT
    2 d2 s' R0 z7 F2 q$ x$ E
  11. while (DS18B20_DQ_IN&&retry<200)
    / {* g4 v! E0 I  n. ]
  12. {& g( ~0 y) a% I
  13. retry++;1 q' v4 w" V! [9 r% t" b! @
  14. delay_us(1);
    7 ?" @# {% v' w* t3 @3 x' u
  15. };2 ~% n4 f  G  Y: d+ I* ^" L
  16. if(retry>=200)return 1;$ V2 i* ?- g; @1 r9 Z
  17. else retry=0;) S: l5 ^1 s' G
  18. while (!DS18B20_DQ_IN&&retry<240)
    * [8 K+ r5 E9 E/ W% J3 f
  19. {
    2 d/ ~' w0 t$ w: @/ O
  20. retry++;
    1 X, O0 s( o4 z) Z
  21. delay_us(1);0 W  G2 N# Z. b8 Q
  22. };
    2 z  g' K4 I# V, r! E. S
  23. if(retry>=240)return 1;
    ! E% u* r) D9 I) o
  24. return 0;! X* l1 A. A+ o4 F& L; q" `' L
  25. }
复制代码

) {1 N: p& q+ n0 k* x1 i0 n
    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
      U/ h+ A9 r+ T6 e0 i; I+ F
  2. * 函 数 名 : DS18B20_IO_IN# v: R( T; {' ~5 Q& g
  3. * 函数功能 : DS18B20_IO 输入配置% ?3 O- w0 }7 c: y4 C  |
  4. * 输 入 : 无- f2 {  ]0 w2 s" `; s
  5. * 输 出 : 无
    0 p% A" O: M" q
  6. *****************************************************************/
    9 W1 F4 G5 @4 |' l
  7. void DS18B20_IO_IN(void). X! T7 [2 A. ^" G" O
  8. {
      l4 _' d/ ^3 M5 {
  9. GPIO_InitTypeDef GPIO_InitStructure;
    ! D* s0 K  k; ~  d9 Q8 w/ ^& m. J
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    8 H4 |$ v1 s0 ~' e  p" ^; z- N
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    4 E* p: s  v& V3 C
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    . t5 \: D/ r$ [  H  J9 {3 i* i
  13. }
复制代码
  1. /***************************************************************** F2 o3 @/ e3 r$ B/ H; w, f3 p; x
  2. * 函 数 名 : DS18B20_IO_OUT
    / y" T0 N+ u8 @
  3. * 函数功能 : DS18B20_IO 输出配置" B' _4 q- A) J8 S( T
  4. * 输 入 : 无; f2 U2 v2 P: J& F
  5. * 输 出 : 无% B1 W& s: A/ e" |
  6. *****************************************************************/
    ( A; t! w# L8 \/ Z" r+ H
  7. void DS18B20_IO_OUT(void)
    1 p5 ^- \. j  y* S
  8. {
    * R5 q% \- S+ [$ L
  9. GPIO_InitTypeDef GPIO_InitStructure;. c4 N* f( e4 N5 c0 O& M
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
    . _/ i1 Z4 b% F, L
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;; x. o6 c' [6 p) G
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    " x- ]( h) k- ?" j7 {9 s) e! T6 X
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
    ) a4 d: ]! Q( u* N& N8 U6 B
  14. }
复制代码

& ]8 O1 M" v6 E! |
    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。
: f- G; X! w' R$ V2 H
收藏 评论0 发布时间:2022-6-27 18:00

举报

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