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

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

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

% q; W# ^( g, Q2 E) M
18B20的引脚定义如图2所示:
, ~: W5 P/ F( G+ K2 d) N
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
) s; T  ?8 Z  T1 M+ E+ ~, W
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节
    4 o2 D' u& g" Y, p+ W
  2. {
    3 L* q  X1 c4 F3 f( Q$ g2 ^/ V
  3.          u8 i;
    " V5 w3 d9 ~+ y6 n8 u1 J
  4.          u8 data=0;$ ]" t: Y- y) u3 k0 t
  5.          for(i=0;i<8;i++)7 _2 n7 W8 |6 T& Y, E& P3 k! X
  6.          {
    4 H: [0 C1 C! r) K/ v+ Y, k  l. j6 N6 r
  7.                  data >>=1;% M/ |6 d8 f( Q' l& m- l: ?3 |
  8.                  GPIO_ConfigurationOUT();
      ?+ v7 b) t3 g. y8 S
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);% b0 U& T: N8 [3 D
  10.                  Delay_nms(15);, k% V$ [+ X5 W6 h8 g- n' l+ R
  11.                  GPIO_ConfigurationIN();+ I1 o8 X3 }! R
  12.                  Delay_nms(50);
    2 u' U' y" w, D5 a. ~
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
    # x1 k9 D0 J  }: a# w! R; q
  14.                          data=data|0x80;9 n( d! Z" ~1 B% Z  W
  15.                  else
    9 `8 _) {: N7 M8 {! z
  16.                          data&=0x7f;
    : f- c/ B2 k3 B, d! V& ^% E
  17.                  Delay_nms(600);
    - }$ b. F+ e) V0 Q, y' p( l2 v
  18.                  & n  `& ^8 T+ W& G6 ]1 W. l
  19.          }9 d" P- `( O# `2 P4 L
  20.          return data;
    4 O2 m. B1 {3 Q  u" J5 n, `( g  E
  21.          
    / e5 q9 Q: p6 i4 N
  22. }& g0 d" v0 }6 N% I$ Q

  23. + [; ~# y; B$ @, o6 ~
  24. void DS18b20_write_byte(u8 dat) //写字节( Q6 M) I, t7 P) U5 ^
  25. {
    1 b$ m. d' b7 O3 [" l2 i
  26.          u8 i;8 L, |" P# c( B% I# u" d
  27.          u8 one_bit;5 P6 p/ \# q# M- V7 f. T
  28.          for(i=0;i<8;i++)/ z+ z! Q: Y; j/ d9 g( A' p  Q, A
  29.          {
    ( v/ \  A- y5 t7 F0 B
  30.                  one_bit = dat&0x01;
    7 V# i% q8 A! r- y4 C. ^
  31.                  dat = dat>>1;
    ; ?5 M: J) G# u& m
  32.                  GPIO_ConfigurationOUT();2 D3 w, x: G+ A$ _
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);7 h: L, K; B6 `7 [. P! [+ B
  34.                  Delay_nms(125);
    $ A3 w0 t8 v* ?3 U& {' y' b2 d
  35.                  if(one_bit)
    3 ~) x0 Q/ i$ s0 d$ Z* m+ p1 w
  36.                  {
    2 W3 z3 O1 o' u2 I
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    & C/ p; a9 I% {& S1 ?
  38.                          Delay_nms(300);
    : e& B" W7 z* R2 \
  39.                  }
    4 M1 c3 z& D8 w: S
  40.                  else
    ( p5 L0 C) ~# R% h6 D) H
  41.                  {; j$ i, B0 {+ b7 G  q( K
  42.                          Delay_nms(300);% v! C9 N& l1 z! T
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    % I( U: C" ]9 |6 w" {( [! z' e
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    . L! M, l% S1 x6 h, B
  45.                  }+ T/ ]2 C3 B) o9 o4 Z2 m/ O1 S' `
  46.                  Delay_nms(80);( A" [  S9 Y' D/ a
  47.          }
    : j: I% a" K" ?# f
  48. }2 W. B! _7 [/ v/ I
  49. 6 T, B# L4 g; W
  50. u16 get_temperature(void) //得到温度数据/ O( H2 J  G/ M( ]0 @( D
  51. {
    4 W3 S! K7 f- j
  52.          u8 a,b;! D( a0 l! b4 D( n
  53.          u16 temp;
    & U1 t- t1 K; l5 p3 k* w% m, k
  54. 9 s+ n" \, G* j  n# \7 j
  55.    DS18b20_reset();1 I9 B, M& P2 i1 Z& n1 Y: f5 r; Z6 A
  56.          DS18b20_write_byte(0xCC);8 c7 ]2 L, w5 @! N$ Z* H5 h
  57.          DS18b20_write_byte(0xBE);9 [8 v4 H7 P3 x! q" `0 a
  58.          
    3 X" q5 _) c3 D9 f1 M& E
  59.          a = DS18b20_read_byte();0 U  l( i1 y/ H1 ]
  60.          b = DS18b20_read_byte();
    0 X9 \1 f. Z% M) n: u; J! O
  61.          temp = (u16)b<<8 |a;
    ! A  Z9 k" V, z" n& @  L8 r0 _7 Y5 {
  62.          return temp;" `: S! e* e4 y0 `" S0 k3 j
  63.          2 r5 ~' t9 E) e( k
  64. }
    5 f7 W3 A1 {3 f) _0 o8 w
  65. void temperature_convert(void)
    6 W& u7 }7 Q& U. q- ^5 D: L
  66. {
    7 i+ G7 N/ C6 x0 l8 r" A7 M
  67.          DS18b20_reset();0 q  a- m5 x& `* R: I1 f! ~
  68.          DS18b20_write_byte(0xCC);
    ; {& S- Q- ]/ d' I/ Z4 t+ p, P
  69.          DS18b20_write_byte(0x44);; N' y% K& d1 b, s  {8 \4 L$ ^5 f. n
  70. }
    ' o; M" n2 J) W
  71. void init_18b20(void) //初始化& P+ h9 E. `$ M% N9 n
  72. {
    1 B5 E1 ~7 e+ D
  73.         u16 temp;
    / }. C, n. p7 C. b$ `* R
  74. do
    * O0 Q+ r! u2 ~  h2 ~  E
  75. {9 K8 J. e( V' l; ~, }/ Z
  76.         temperature_convert();) U; Q9 ?$ X! y
  77.         Delay_ms(20000);
    , b/ O, r- P" r/ M4 x) v
  78.         temp = get_temperature();
    ' I3 A1 o! s2 x- _8 E! I
  79. }          while(temp==85);
    ( i- e, u' {) }$ Q
  80. temperature_convert();
    ; c$ v8 R* a6 R4 a
  81. }! {% `& U, o2 R

  82.   p/ D! Z' O% g. ~
  83. //u16 showdataT;+ C0 k/ h, H7 W& N0 I% T: W
  84. void tem_process(void) //计算温度
    ; a0 [/ @8 U8 L
  85. {
    . d0 i$ n; \% J) T# v
  86.          u16 showdata;
    , x9 r. w8 V7 t$ ~; U) }9 D: k  D
  87. //   u8 Tbuf[2];5 B- |- K- |  o5 f- K
  88.         temperature_convert();% _9 }$ o) T0 f
  89.    Delay_nnms(0xAFFFF);" o9 e' p- {, D
  90.          Delay_nnms(0xAFFFF);
    , }6 d- \8 U/ w+ _% x$ o/ P. X
  91.   showdata = get_temperature();
    ; {. J1 l, j& O! y3 b7 g+ J- G
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度
    ( ?/ H* w9 {/ P: ]5 Y
  93. }
复制代码
# V& i( T1 n* J/ s9 R
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
, p8 x4 y6 x" y) b
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
  `' f6 A7 Z: d. i( d- h$ L1 z6 \

图1

图1

图2

图2

图3

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版