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

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

[复制链接]
jundao721 发布时间:2021-6-15 18:08
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
$ {- z. b' k3 {  v/ I  K9 f' O
18B20的引脚定义如图2所示:
$ S+ A1 S) X) d! l: `. M
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:

* F0 }5 C: r' I9 h
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节
    ' l: j  h4 g- c8 t
  2. {- X3 u" w2 h9 f: W
  3.          u8 i;
    9 ]2 \( [, G& V: Y/ v7 E7 R% m
  4.          u8 data=0;
    + v  s7 p+ Z; j3 ]- y
  5.          for(i=0;i<8;i++)* x2 C& ]9 F( Q
  6.          {( J' F) G8 h' \
  7.                  data >>=1;# Y. o2 W; R! A/ n
  8.                  GPIO_ConfigurationOUT();
    1 |- ?; ]. p2 R  Q1 x: l- r0 k
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    * v* L3 p3 l% x/ k. M6 Z, o
  10.                  Delay_nms(15);
    0 e) f6 p' I3 D1 r
  11.                  GPIO_ConfigurationIN();& Z4 i3 E/ Q  }, h* ]+ ~- X
  12.                  Delay_nms(50);
    : ?0 z& _% h- o2 y, v
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))# ?! P' p, p* H& v
  14.                          data=data|0x80;
    ! H1 `5 G% @; A: Q6 m
  15.                  else) a7 S! m; j# ]! ^
  16.                          data&=0x7f;
    5 }% r8 B$ C+ n
  17.                  Delay_nms(600);* C5 t7 }  M+ T
  18.                  
    + [1 j# B8 J0 Y7 }; J5 x
  19.          }
    . ?2 U" s1 {. |6 U2 M
  20.          return data;; S4 m" I+ x& S7 K
  21.          : L) X" W# M( y' o% d
  22. }
    ) ]4 Z! h8 L+ ?
  23. 6 K* W4 N* K& R% {1 c* u) |+ ~
  24. void DS18b20_write_byte(u8 dat) //写字节
    $ |1 X5 E+ K$ n7 ]8 P# X% N# E$ @
  25. {, T" u" O# R/ O2 _5 V1 N
  26.          u8 i;# q" z& d# G! S( s" \/ O
  27.          u8 one_bit;
    ( o6 @: ]; p# {; O
  28.          for(i=0;i<8;i++)$ S6 e( r' G' S0 {; k! C
  29.          {: H5 A5 @; Y5 e3 I
  30.                  one_bit = dat&0x01;* f0 T) A$ V9 Q: b2 e' O  {
  31.                  dat = dat>>1;
    / f2 c4 A/ }* _4 R: K
  32.                  GPIO_ConfigurationOUT();1 o9 x: D+ W' O* h7 [3 a7 h
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    8 p$ `1 N1 e; ~+ X* G
  34.                  Delay_nms(125);
    * T% \# F* r) {& T( `  ~" Y
  35.                  if(one_bit)
    - \5 ?& ~. o( c% E/ [) A) S
  36.                  {
    " R0 Y. B+ T7 ^; O9 I: u
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    1 H7 m) W0 t/ _8 m4 g( r' c5 s4 p
  38.                          Delay_nms(300);9 I8 ^  M1 b2 c& G. R
  39.                  }( N3 ^/ Z( J; F& r
  40.                  else" W! M# \2 Z* U- n/ u9 l
  41.                  {2 d4 g6 z+ v$ n. I% q1 X8 D% G4 c4 t
  42.                          Delay_nms(300);
    : `6 q/ G3 c& c# F5 z  X' R4 ]
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);. s# J; e% b: B" L3 K  I5 m
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);; q  t! d8 q% M+ V. C/ U
  45.                  }7 E0 X' Q/ X# X" L5 `
  46.                  Delay_nms(80);% D* U: P8 w5 x2 g- o, y: R
  47.          }( M- d8 a% }( g9 z! M
  48. }
    * J' O6 M: U( K4 h
  49. 1 T: ?- I) Q! T8 v
  50. u16 get_temperature(void) //得到温度数据  a1 N( X  J  y3 ?; V
  51. {' f' ]9 o  I9 ~- ^, L3 A
  52.          u8 a,b;: s0 k) |- X# W  l
  53.          u16 temp;
    # }" v3 C  {& u+ i

  54. 1 H) Y: [- M& b2 Q0 I
  55.    DS18b20_reset();
    6 t, v) g# {/ ]1 E- Q
  56.          DS18b20_write_byte(0xCC);
    ' o! r* c2 K) u! h
  57.          DS18b20_write_byte(0xBE);0 i$ v% |7 S- O: |0 l# o
  58.          # x  \0 ~: I- p6 _+ X0 R& v1 C+ b
  59.          a = DS18b20_read_byte();
    9 Z! N$ }  V' @' c1 k7 g
  60.          b = DS18b20_read_byte();% h9 @8 W3 }! {
  61.          temp = (u16)b<<8 |a;
    1 E# M* d6 t  U$ [$ |' ~
  62.          return temp;
    ' q* C* v! K! }9 H
  63.          ! r0 T, Y, i3 Z0 A0 t6 I: G) B% }! ]
  64. }$ w, F7 _& h2 R/ e
  65. void temperature_convert(void) ' c9 `( \- P6 `
  66. {3 \: R3 p; y* x4 o6 t8 m% i
  67.          DS18b20_reset();
    & D3 ^4 k; M, P( ?1 U
  68.          DS18b20_write_byte(0xCC);) l: F' e* Q7 ?+ f
  69.          DS18b20_write_byte(0x44);  |; n- M& z; h$ w
  70. }
    6 ~6 W1 o- r( i+ R" Z0 g
  71. void init_18b20(void) //初始化
    5 H& ?$ t8 D! c: k+ E( X' t
  72. {
    / _7 ?$ x. V/ w+ ~
  73.         u16 temp;
    7 ]' R, K, W+ G! f+ L& J+ R2 W$ z8 ^
  74. do
    ) ^9 g6 s9 C# N% ]1 A, Q9 p  D" r7 q4 O
  75. {
    . ]; [2 L/ K7 R  j
  76.         temperature_convert();5 f5 [. R1 n0 i5 D( h9 H
  77.         Delay_ms(20000);2 s  s) M$ }& M; K9 G1 N0 K  v0 H9 i
  78.         temp = get_temperature();6 J! j* q2 y8 c4 H# b
  79. }          while(temp==85);
    5 _1 y% s/ t  \/ \# p% M9 ^! O
  80. temperature_convert();
    # Z8 W8 K  |7 r- ]3 P% U
  81. }
    6 P' q! s1 t9 h! q
  82. 5 m  k* ^2 \- }2 N5 _
  83. //u16 showdataT;1 ^& J! ~! m  i/ x0 c* V- i
  84. void tem_process(void) //计算温度
    . p) L) }% I1 _; s( X7 U
  85. {9 d* h1 p% ~. t
  86.          u16 showdata;
    " V& b1 S; C  p
  87. //   u8 Tbuf[2];
    8 {) ^1 |: r9 s0 g" m
  88.         temperature_convert();
    + z' o* V5 `3 _/ [- a: ~
  89.    Delay_nnms(0xAFFFF);$ v# J* D! b7 v/ U7 h
  90.          Delay_nnms(0xAFFFF);
    ) M5 l9 C' d8 [1 F, X
  91.   showdata = get_temperature();
    4 _9 ?- w  X  N( e9 ]
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度8 i' N: O! v* s1 X# H
  93. }
复制代码
, J8 _7 ~* t1 m+ r# V: [/ m+ I
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
9 p$ \% V+ z! `
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。

- B4 O5 ~( _2 K

图1

图1

图2

图2

图3

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

举报

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