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

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

[复制链接]
jundao721 发布时间:2021-6-15 18:08
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
2 x6 a8 ]+ ?' i1 T
18B20的引脚定义如图2所示:

: i7 {* y/ q! g/ J' d6 n( c; R
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
% Z5 Q8 Z! b  p1 L. ^: @
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节
      u- }" r! P. m' H: F
  2. {7 P. L9 Y% i5 F  Q2 [/ q0 V$ x5 g# o
  3.          u8 i;" k' L" c; a, `7 ~. y
  4.          u8 data=0;
    . y2 k2 Y" h- {6 c. a
  5.          for(i=0;i<8;i++)
    3 f8 B& e6 s3 x. ]& A0 r2 W
  6.          {! E1 b  f5 M' x
  7.                  data >>=1;6 T! z# i5 e% ~( a" L% u
  8.                  GPIO_ConfigurationOUT();: R% C7 }6 B, |" U, V
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    9 W: W! W/ q, }. Y
  10.                  Delay_nms(15);
    " N( U* W/ V# l$ t- y9 e
  11.                  GPIO_ConfigurationIN();
    7 Z9 H. B: M& F4 y% K
  12.                  Delay_nms(50);/ o& i8 C" {! k* H1 C- Q( X
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))- Z6 ?  z6 L+ Z0 F
  14.                          data=data|0x80;
    ! x* K5 A: K. ~
  15.                  else/ Q; {1 v: |0 G1 [! K0 l' {
  16.                          data&=0x7f;) W% Y# p8 u" `& p& {5 ?% f( Z
  17.                  Delay_nms(600);
    - A# L" O% I3 U
  18.                  
    7 g4 b$ E3 B9 t. P/ v9 ?3 N/ _
  19.          }! {0 O6 U8 c5 _3 s9 g
  20.          return data;- j/ w' p8 o0 d# P4 [1 }
  21.          3 v& K! ?: o/ k0 ~9 M
  22. }2 {( w1 D& v  ?, x
  23. $ J  L% o9 l/ U2 N9 _: M
  24. void DS18b20_write_byte(u8 dat) //写字节
    5 R9 y# X/ J: j( _( ?: K3 r, d
  25. {( T6 ~# N  d% [# T- B: r
  26.          u8 i;  q* Q0 ?/ P: ~( q5 Y$ ?
  27.          u8 one_bit;$ a3 l3 k1 q2 g! u8 m+ f( M
  28.          for(i=0;i<8;i++)$ ~0 R. x" ]" R  [
  29.          {
    # a2 [; e" d. {9 |$ I
  30.                  one_bit = dat&0x01;
    " w* j+ G9 M; S' W9 E5 t' T
  31.                  dat = dat>>1;
    * R- r% d& }2 Y1 \  P- Y" p
  32.                  GPIO_ConfigurationOUT();
    . i. n3 a/ v% {. J& a% e, v% Q
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);' D' N; i+ G9 |5 [+ M% w
  34.                  Delay_nms(125);! k+ j7 R, ^2 V' m6 j, r* r
  35.                  if(one_bit)8 ^. G9 f& M! _
  36.                  {
    $ q# n  a0 `: g( ]& _- ^9 g
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);) a2 N; \( u  m/ B8 ]& I
  38.                          Delay_nms(300);% ?* u$ F2 D# L$ s1 W* Y
  39.                  }
    2 d: T% U0 {" ^& k
  40.                  else$ T9 R3 S+ r6 }1 U2 D9 y
  41.                  {! D6 Z% G: Q- C1 c
  42.                          Delay_nms(300);: j6 S! Z+ @% T- u( K+ H+ i. y
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    * B7 V  s0 J% ]; i; {% q
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    0 L3 s1 |" x3 O( _) o1 G
  45.                  }
    - n9 D: S2 B# j! p6 P1 r8 M0 z: s
  46.                  Delay_nms(80);2 K0 d# |- ]* j& X
  47.          }
    , @$ x3 `% J/ }& I+ @( }6 q2 W, f
  48. }8 h) ]% V; K4 e8 ]) O2 d
  49. ! P9 ]' {" ?- j+ Z
  50. u16 get_temperature(void) //得到温度数据
    " O  e! p* m: h, r8 a
  51. {
    % H3 I  @1 y  u1 y* M9 b
  52.          u8 a,b;
    8 C4 Z0 ?$ M" k7 L
  53.          u16 temp;
    . i  n8 i8 L- z# i3 X

  54.   O) F9 o$ T6 d' i
  55.    DS18b20_reset();
    0 w8 g+ t0 b! m: N
  56.          DS18b20_write_byte(0xCC);
    2 j* U7 b2 ^8 J! o. g4 ^
  57.          DS18b20_write_byte(0xBE);
    / e7 p1 l; s$ M4 X+ ]$ h
  58.          / G5 e' N3 d$ N5 @/ B
  59.          a = DS18b20_read_byte();6 q* x3 ]% D; i7 q5 {2 s
  60.          b = DS18b20_read_byte();2 l# U( B3 h7 @! u5 f$ N! ~
  61.          temp = (u16)b<<8 |a;0 S$ N, |; e' \
  62.          return temp;9 F8 e3 S6 B7 i1 L9 Y
  63.          6 x! C: R& e% Z/ o" Y& b
  64. }
    0 K/ L9 y; P/ F' e. N$ E
  65. void temperature_convert(void) . L1 v2 L: J2 R# b# U
  66. {
    / i! d. i! o* i5 k& p! L# }# k
  67.          DS18b20_reset();
    # L. i" q* M! u" g9 B( p8 S
  68.          DS18b20_write_byte(0xCC);
    . Q0 E2 T& [* I  s
  69.          DS18b20_write_byte(0x44);  P6 `. B; \7 N$ {8 m7 X6 A% Z' m2 x9 |
  70. }
    / r) K( \  y  b1 V9 p  w/ A
  71. void init_18b20(void) //初始化7 ]! k% v& p+ Q8 C  \( m
  72. {! b+ L' z9 p! S3 S
  73.         u16 temp;
    9 g0 z+ f1 h5 y# A$ Q# e$ T
  74. do% O" b, ^( z4 a3 P
  75. {
    1 B' {( M5 v8 V% c0 g3 c1 F
  76.         temperature_convert();
    6 R; k2 _$ E9 U7 r1 s% W9 t
  77.         Delay_ms(20000);8 D* t$ P/ j- `1 `8 g
  78.         temp = get_temperature();2 y3 q/ C- A; W  g$ T  O& J  F& e
  79. }          while(temp==85); , ~5 u, j0 p( F' Q
  80. temperature_convert();
    # @6 v, Z% I2 X: N6 x3 v
  81. }
    / Z/ |* G% }& I+ N" ]

  82. ) ]9 P6 m0 P, r6 X# R" J' Q
  83. //u16 showdataT;
    6 ^+ ^. r8 @( f' b
  84. void tem_process(void) //计算温度
    . I* n2 h" H7 J! r* y- q% s3 b
  85. {9 i6 E+ c4 h, o6 ?# M
  86.          u16 showdata;
    - J' W2 P! V+ i& Y! N+ ]4 s
  87. //   u8 Tbuf[2];' _3 O+ }4 Q/ U" H3 ?9 y
  88.         temperature_convert();5 m; J+ }" M# {5 f& d. M& t: p
  89.    Delay_nnms(0xAFFFF);
    " t# x7 h: V$ l) b6 \4 y
  90.          Delay_nnms(0xAFFFF);7 ]! @- t8 I' `1 Y
  91.   showdata = get_temperature();9 L& Z1 `, l* V* @+ q+ l
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度  _& y' u: _8 Z. _" w6 c
  93. }
复制代码
! c" Q# K3 _: L# ~* z6 U
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:

' ^/ q3 M' S) ?" e0 T
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
  i. t1 V1 q3 Z

图1

图1

图2

图2

图3

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

举报

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