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

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

[复制链接]
jundao721 发布时间:2021-6-15 18:08
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
4 D' P2 d- p: m4 f
18B20的引脚定义如图2所示:
2 T) m, {2 _# L) y$ Q; J7 ]
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
( }  ^) i! o( v" f# h
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节9 O$ F& k+ n( w# M) B
  2. {0 E5 f' ?8 R1 O7 D5 |3 v5 F2 m
  3.          u8 i;. K$ s) @3 B3 P' t9 z
  4.          u8 data=0;
    , `3 m+ m' T8 `6 R; H* r  T
  5.          for(i=0;i<8;i++); q; Z& B) Q7 O, n/ w# ~
  6.          {
    ; m  G2 A+ W" S3 \' Z9 r$ {6 U+ L
  7.                  data >>=1;$ G( l- V' E/ K& U' h( Y
  8.                  GPIO_ConfigurationOUT();
    + A2 h: F' D0 _: g
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    + }8 _: y1 w9 n1 r, v3 n' x
  10.                  Delay_nms(15);
    6 x. ~6 |6 c$ l/ b
  11.                  GPIO_ConfigurationIN();- e5 T' d; I% }& w/ O" p% Q
  12.                  Delay_nms(50);. f1 k& L! C' U0 W1 L
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))+ _% Q7 r" D2 c1 J+ K7 I4 _5 k; M
  14.                          data=data|0x80;
    & I4 w1 x) m! e5 b
  15.                  else
    ; V% m6 h5 b1 S1 N
  16.                          data&=0x7f;3 p9 E4 E+ i0 u6 Q* h
  17.                  Delay_nms(600);
    - p$ `+ j* t* Y# I3 G6 ^" ~3 J
  18.                  2 Y6 o7 n1 m$ k7 Y! s' u
  19.          }! c; M: v  f. ]# r; v, _5 d
  20.          return data;
    ' v2 z6 Q6 \# j9 C8 `3 u
  21.          
    4 D$ K& }) @+ F- T% I( B, S9 U1 R: ~
  22. }! e- z8 ]6 K) u1 p
  23. 6 \$ e# U* g5 c, f4 q+ {
  24. void DS18b20_write_byte(u8 dat) //写字节: h9 [4 A! `9 s0 n1 X: L0 h2 B
  25. {7 R* O4 G! Q' {& f
  26.          u8 i;- J1 J8 s3 {7 Y. {! Q
  27.          u8 one_bit;/ o. W% V/ f$ `7 `
  28.          for(i=0;i<8;i++)8 |! `) h; v; a, u) v
  29.          {
    # Z# I) d: y$ E$ [9 c5 a9 V" `
  30.                  one_bit = dat&0x01;
    7 J- [* x* s6 U" Z* i( n' X
  31.                  dat = dat>>1;
    " v8 Q0 Q5 ~7 ^& t8 ?$ T  \
  32.                  GPIO_ConfigurationOUT();) S; P5 C/ v7 @$ d) x
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);- R* ^4 Y$ Y9 y: O
  34.                  Delay_nms(125);
    : w- S: U8 F- N( n; C
  35.                  if(one_bit)
    % s. T! c: O2 N) j. k
  36.                  {
    $ o# q" W8 C9 {# P
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);# y5 _' N' j/ D1 x7 V0 b
  38.                          Delay_nms(300);
    8 E% `( O7 P" G. e3 t0 Y  I; m
  39.                  }7 a- V- D8 W9 l' U2 ]
  40.                  else3 s. \5 p4 f6 E; G8 P
  41.                  {
    ' p3 Y0 w7 {( Q. ~" Q+ p
  42.                          Delay_nms(300);; L8 \* Z6 v2 G8 y/ o; S5 ^9 W
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    % }1 o( {4 m4 Y1 _
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    % z! [% Z9 a7 n7 S% Y7 i: W- n" p
  45.                  }- t# s9 K# G- l  G" _  Z1 ~6 ?
  46.                  Delay_nms(80);9 x0 n9 o( ?( L9 Y9 f
  47.          }9 n  p' t* e8 \( P: {4 b  U1 K
  48. }, U4 q8 }. n- b; j' y6 |' V$ B
  49. + j3 m- m& w& \0 D5 L
  50. u16 get_temperature(void) //得到温度数据2 J  Y+ P& T1 t7 y. d; z7 d( y
  51. {
    9 P% J0 u+ d- }) c/ d4 A4 ~
  52.          u8 a,b;
    2 w9 W2 v! M+ E4 L
  53.          u16 temp;
    ; u8 T  w* n7 E+ C: P- c2 l. l  n
  54. $ r% Y6 x: {, {" [" D2 A! m
  55.    DS18b20_reset();+ Z0 |8 s& P+ _& k
  56.          DS18b20_write_byte(0xCC);
    . E- {$ H0 M/ l1 E
  57.          DS18b20_write_byte(0xBE);3 o& S" P  H$ W" c9 ~6 x9 t" m2 T% n
  58.          # r* q+ ]7 D  b( m3 v% ]
  59.          a = DS18b20_read_byte();
    ! i( {' U3 j8 S% C9 W
  60.          b = DS18b20_read_byte();5 d) {/ b8 I; J, n, C
  61.          temp = (u16)b<<8 |a;+ M" H8 y: p. f0 j: C1 K6 [
  62.          return temp;: g9 \* o4 E, i  |. A1 R
  63.          5 V3 W# p. ]: I1 |# ~5 B% Q; \
  64. }
    & g7 f6 y# t! ]/ J9 e* K
  65. void temperature_convert(void)
    / [8 H, e2 X) ]# c9 p
  66. {1 J8 {6 F* F6 w& A4 K
  67.          DS18b20_reset();
    5 T2 Z2 c4 z& y* m
  68.          DS18b20_write_byte(0xCC);( Z  N1 C% V( F' _8 N( l
  69.          DS18b20_write_byte(0x44);" r' W, v4 k) X& Q7 @
  70. }% ^. F: \& @& d# t5 ~' f$ _! U
  71. void init_18b20(void) //初始化& M* @% c8 J( K: f1 a5 R% X, J
  72. {
    - z  ?: c, h6 k7 ~! K
  73.         u16 temp;
      b* ?* a( s% z5 E: g
  74. do
    " H* f* P# j: ~# ?0 X% R
  75. {
    3 w8 r  Y/ A- V3 i( J/ `
  76.         temperature_convert();) v: W" u6 t( U
  77.         Delay_ms(20000);
    ( ^6 }1 N2 j6 x4 v; H  X  f5 O3 P$ y
  78.         temp = get_temperature();
    . b' ~1 z& G* \+ ]
  79. }          while(temp==85); ' @# h0 Z3 N- c/ J1 z
  80. temperature_convert();7 H1 `- A0 m8 N% K  H# m
  81. }
    2 j6 u( k2 ^1 R0 d' e
  82. 5 {: J" ^7 }( R: L# C0 }
  83. //u16 showdataT;
    6 w6 @2 m. K" @- ~- c! |
  84. void tem_process(void) //计算温度
      `9 ?% S6 Z$ |$ b$ F# s" Q) r
  85. {
    ; N9 H# G3 ~, }0 [) j; `0 ?
  86.          u16 showdata;
    6 m& g3 ?/ r  G7 H0 j5 W5 ?5 L
  87. //   u8 Tbuf[2];
    8 _0 H  Q5 l, W' S: J! w
  88.         temperature_convert();- D. s8 ~7 O' m1 w# |
  89.    Delay_nnms(0xAFFFF);
    ( B  D. G% Y4 R: V" w1 o) l& P5 o
  90.          Delay_nnms(0xAFFFF);& V9 I; j; Z0 T* Z9 n
  91.   showdata = get_temperature();
    . i- p6 Z* W* O9 H: s4 m9 Y$ j6 _
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度( e$ S- b/ V! b* p
  93. }
复制代码
2 i  W! K) O8 D0 u# B% }+ t
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:

& g& i! Q$ F! ]* y1 q
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。

/ \. |0 T1 \+ P1 H1 t& z, D

图1

图1

图2

图2

图3

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

举报

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