请选择 进入手机版 | 继续访问电脑版

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

【年中粉丝节】+18B20温度传感器

[复制链接]
jundao721 发布时间:2021-6-15 18:08
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
3 n! h, m. @: R: d0 ^# v! y- v- m, Z2 `
18B20的引脚定义如图2所示:
: G* |2 [* _" r6 }3 [  L& e
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
! Q, u4 s% ^% \: i% z8 d5 ~
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节' y7 A" C! D# A  |
  2. {
    0 Z! D7 w+ V( y" K! k
  3.          u8 i;5 W' q, }% i' \" v* C
  4.          u8 data=0;
    ; e% y' E/ R3 x- {0 X3 D" {) Q7 K, B
  5.          for(i=0;i<8;i++); j7 }* A% M2 u. o- @* U- e
  6.          {
    6 b2 }- Y8 z* y
  7.                  data >>=1;. K9 s( E/ a' \6 G7 T9 }5 l
  8.                  GPIO_ConfigurationOUT();7 T# R4 E% h! }$ n4 Y" G5 C2 J/ k
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);3 I5 o& T* O0 }) P
  10.                  Delay_nms(15);$ \% S: ?1 |" _
  11.                  GPIO_ConfigurationIN();
    , `2 L" j5 P$ \% U6 x
  12.                  Delay_nms(50);
    , k3 J2 z- u3 v
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)). W" H9 ]0 b% y5 w
  14.                          data=data|0x80;
    5 r1 c& C1 C& y! A; a$ R
  15.                  else
    " e* z" B/ F- ^
  16.                          data&=0x7f;
    / r9 L3 c" n; F+ o: v: `
  17.                  Delay_nms(600);1 x3 R8 ]6 i. n# D; T
  18.                  4 b! n; r1 k! x4 _9 p  x/ W
  19.          }5 x3 g$ D# l/ [
  20.          return data;) s& a' [+ ?2 Z6 e* i+ X) `
  21.          
    " y* I. _+ w. O0 Y8 b
  22. }, O5 N+ K7 g; f8 q, H% D

  23. 8 i% t  o& Z9 y* V6 @& n
  24. void DS18b20_write_byte(u8 dat) //写字节
      m$ q8 z" f- |& O6 G
  25. {
    . [: W7 P1 `5 g& _! i& d+ G0 k9 V
  26.          u8 i;
    9 w: j2 B" d/ ^+ v+ e' F+ U, @
  27.          u8 one_bit;
    4 D4 [( E0 }, P# {& l% V: H
  28.          for(i=0;i<8;i++)
    ! b0 a7 Y) O- m+ L, K5 Z
  29.          {
    ; H: N0 ^( ~# o& Q
  30.                  one_bit = dat&0x01;
    ; c  C; M; ]1 K. l- P
  31.                  dat = dat>>1;" F! v. Q2 @0 ?. b8 ~! Y
  32.                  GPIO_ConfigurationOUT();
    . n; R- Q0 l! ?- b2 s0 y0 j
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    . l0 Q5 R- [1 |$ ^# \4 c
  34.                  Delay_nms(125);. L0 T1 J% c; F0 K# f
  35.                  if(one_bit)
    ' n6 I1 M2 x, @8 H" A/ }) X: f
  36.                  {
    ' _8 j$ E+ m0 m4 W( J. c
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);4 ?9 {8 P  {1 q& u1 d# T4 h$ H6 W
  38.                          Delay_nms(300);
    2 |5 D/ {2 G7 `, Q  h% S( x
  39.                  }
      t$ Q; m  ]$ _$ }! `9 Q+ u
  40.                  else7 I" H0 u2 b; q$ q7 \4 Y
  41.                  {1 y0 \$ S: g: |8 `. @* A& c+ j$ j
  42.                          Delay_nms(300);
    % \8 Z/ ?' E% Z% ]2 M! Q" s
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);# s+ k0 U/ x% G0 p5 N% w/ M
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    / ~% y, g1 L" P4 V- F$ H! m; o0 z6 q: y
  45.                  }
    4 N: r' O9 h/ S7 N* S( g5 P" j; b
  46.                  Delay_nms(80);
    0 v# x7 @3 @0 O
  47.          }
    5 Y) H8 B$ a( J5 k: g- w
  48. }
    7 v& ~. S" I1 J' u. w

  49. 4 m  e7 V4 R$ j+ d; U7 _+ g( w3 z
  50. u16 get_temperature(void) //得到温度数据- V+ g9 m% R" ^9 o- Y
  51. {# h6 }# C$ M' U" u# j$ V* \3 F
  52.          u8 a,b;$ n( D( J% S, r# z' ~; [, j4 U
  53.          u16 temp;( g. U: B6 _0 g) @# C5 M$ o  z

  54. & k8 _# Q5 L* @( K( H
  55.    DS18b20_reset();
    ( F# ?6 x/ Y, M8 m5 K8 N# c
  56.          DS18b20_write_byte(0xCC);
    ; n* U# y" L( z: w2 K. l' F  e2 A
  57.          DS18b20_write_byte(0xBE);
    / m5 m9 ?; `3 ]* k5 Y
  58.          
    + U: u$ u; M' s" Q5 d0 m
  59.          a = DS18b20_read_byte();( M& T( y( _; ]
  60.          b = DS18b20_read_byte();- y9 n4 y  Z3 F: f) o' t: s
  61.          temp = (u16)b<<8 |a;
    ( F# F: M" g4 C5 E& e
  62.          return temp;
    / R8 C5 ]9 \. k& R8 v( @) I
  63.          
    . j" F3 B! D- J& {
  64. }
    1 @/ P7 T8 n3 R  X* |* p
  65. void temperature_convert(void)
    9 m  _9 g6 |9 y! n% a# s
  66. {6 ?- G+ V& q  n: B& J
  67.          DS18b20_reset();0 t* }# [- V( x
  68.          DS18b20_write_byte(0xCC);
    6 T/ [" Y5 I8 t# D8 _
  69.          DS18b20_write_byte(0x44);2 c9 y8 P& L8 t5 K: _; l
  70. }; ]0 J8 k9 @" W( J. O
  71. void init_18b20(void) //初始化" b' O  ]+ S2 P2 u1 f; W
  72. {
    5 C; v1 D# ?* O
  73.         u16 temp;
    6 u$ A1 O9 f: e( Y- ]& j
  74. do$ l4 j9 x' r+ u% I& g
  75. {
    / y# d% N; a/ t. C
  76.         temperature_convert();1 `7 M; Y( S: h# v0 O' y6 d0 E+ l. Z
  77.         Delay_ms(20000);
    3 m5 R& p# ~! O- v
  78.         temp = get_temperature();
    % i: B$ S8 _) j' l6 k
  79. }          while(temp==85);
    2 b+ C& |0 H- M& G
  80. temperature_convert();
    3 [0 N9 q5 R" G, d8 B
  81. }
    6 c+ x& B. A* K; H- B) J" }$ ~: }! t

  82. ; n, Y7 L- s! Z( O# h# ]8 z
  83. //u16 showdataT;% w8 m  p8 g. c" y$ d
  84. void tem_process(void) //计算温度
    * I* ~* o! }; }! n1 I% U
  85. {+ @* o2 P- s) g8 d2 M! w
  86.          u16 showdata;
    - z; f& D7 d% ^" y% r0 ?: r/ {; m
  87. //   u8 Tbuf[2];/ W9 z$ P3 ^) h' B4 @9 F4 |# v
  88.         temperature_convert();
    9 N' U+ D. h8 g4 R/ V
  89.    Delay_nnms(0xAFFFF);
    & L* V, I9 G0 N- @" A1 x) D
  90.          Delay_nnms(0xAFFFF);4 y7 W5 T* ]+ X! n! d) S2 C
  91.   showdata = get_temperature();. y! J9 l$ I  F& @' }: ~5 o9 k
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度& h, `+ |3 Y, G2 J/ y
  93. }
复制代码

' `7 ?+ D+ m7 v$ r" H+ R8 c
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
9 S2 k* N, A. d
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。

* j; ?# x+ [$ Z/ |. v* N  j

图1

图1

图2

图2

图3

图3
读写时序.JPG
显示.JPG
收藏 评论0 发布时间:2021-6-15 18:08

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版