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

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

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

% r5 E! |8 K  D. w3 z5 R5 _
18B20的引脚定义如图2所示:
5 B$ y& |! o, [5 e+ ^
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
: C9 }# q0 ~4 G% s$ Q
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节2 a; u: B$ L: G- M  P* d  x
  2. {
    5 m3 r3 m& B( Y7 q; J# X- A
  3.          u8 i;2 q6 r$ I% C6 N1 Y
  4.          u8 data=0;
    2 x- V" U4 r  U2 e$ f
  5.          for(i=0;i<8;i++)! N* \2 x9 h7 d- N3 W- n, N8 G
  6.          {
    , n( |( ~" _( p1 r' v* y& ^6 B
  7.                  data >>=1;0 B/ k4 C  c: [
  8.                  GPIO_ConfigurationOUT();3 x8 G  O6 F; m& h( K0 R* G* }" w
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    3 x% n* v' D5 X# o2 S
  10.                  Delay_nms(15);
    7 A6 c* o* V2 m4 G. s
  11.                  GPIO_ConfigurationIN();
    7 [; o$ w! D6 f- @8 x
  12.                  Delay_nms(50);
    2 O- I1 {1 R! ]. E) x# L# u
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
      [, l+ p0 `: |! t9 H- Y/ F7 `
  14.                          data=data|0x80;
    2 a# Q& A' T: w8 _* J% ~! E
  15.                  else
    ) q3 U  X& Y- X6 T6 F
  16.                          data&=0x7f;
      J. C! h6 \& S2 E
  17.                  Delay_nms(600);' k' Z7 C4 F5 s2 X0 ?7 v
  18.                  " C, e& Y+ N# K' B( ^
  19.          }
    3 {6 S9 c# A6 M, J8 |- m0 F
  20.          return data;( _" L  o& w0 h( m
  21.          % @8 X$ @0 F% R7 l, ^/ B# y
  22. }* d0 N0 X- M/ ^3 @( _9 `" r- \

  23. : t1 Y* H8 P( K5 V4 b9 @! l/ `
  24. void DS18b20_write_byte(u8 dat) //写字节
    # f1 X& Q5 m; @, ^& d% m. k
  25. {
    & f, J9 x# D8 e7 Q
  26.          u8 i;
    1 i7 l( F7 x5 h" a$ G
  27.          u8 one_bit;
    ! N4 z4 w8 ]  r( c
  28.          for(i=0;i<8;i++)2 M/ N8 D0 ]/ a3 O* c/ D: L
  29.          {
    & T: G% X6 L# C; z/ W5 a; {
  30.                  one_bit = dat&0x01;
    - K' i0 |- q2 ?9 o& {
  31.                  dat = dat>>1;4 h- C! B9 E7 M+ J
  32.                  GPIO_ConfigurationOUT();; w4 N5 _" `$ W! k0 ~) [1 W: j3 B
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);; b& c2 L9 F; d
  34.                  Delay_nms(125);9 _" V3 J: [! j5 X" @' ]3 o
  35.                  if(one_bit)- I0 E: G- i% X+ ^; t
  36.                  {
    % u- w1 {0 K  N2 P0 E" E+ ?
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);2 H9 v. z# L2 C! ^' M
  38.                          Delay_nms(300);7 M; a9 Z. r( B& N" w! \: y
  39.                  }3 L7 v8 Q: e2 F4 l" `
  40.                  else
    , v5 q  t! s8 o# Q7 q
  41.                  {
    ; Z' z, U% b4 {2 F/ D, e: G( t
  42.                          Delay_nms(300);! W3 }& P3 `& v/ }
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
    5 y/ m  s" I9 p) M; w2 L
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    1 ]) ~! v% ?4 X/ i
  45.                  }
    ( W& l; K( c  J$ z
  46.                  Delay_nms(80);
    ( D. G" q8 Q9 R- b
  47.          }3 m3 N1 m- J& }# Z9 m1 Z# _
  48. }
    5 }2 J- C; Y( {% l
  49. 7 H+ f4 f; j" V9 G9 Z
  50. u16 get_temperature(void) //得到温度数据, s: Z  F8 ~. S% W* d2 y
  51. {
    1 o0 _$ u+ l) [8 m6 n* x! u
  52.          u8 a,b;
    * B( d. E4 [. O7 B( `4 a$ R3 W
  53.          u16 temp;
    3 v# x# \; i) T1 S" S
  54. 3 N( }: {0 M" o2 G
  55.    DS18b20_reset();8 {& W: C8 t  Q
  56.          DS18b20_write_byte(0xCC);
    ! y, |* V) W4 x4 u! l$ {
  57.          DS18b20_write_byte(0xBE);
    $ g& O4 k* B7 B7 k$ F. `3 f
  58.          
    ' `1 r6 g( F! @/ y$ K4 w
  59.          a = DS18b20_read_byte();8 \. J9 q" K% i0 n& G+ J
  60.          b = DS18b20_read_byte();
    ( S; Z5 v! y+ V3 n. K* X( Y
  61.          temp = (u16)b<<8 |a;4 z$ \! B/ |' ?, J
  62.          return temp;
    % }  q- |! O  L
  63.          
    , r" U" ?6 e: x% n& D% d$ S  O
  64. }
    0 m6 r* s, [% @. {8 C0 M4 v
  65. void temperature_convert(void)
    " y% N2 C0 j: J: k& Z# C2 E
  66. {
    2 L9 @, U& s  W& z$ S
  67.          DS18b20_reset();
    . M# ]& F1 \7 _
  68.          DS18b20_write_byte(0xCC);
    ! h1 Y- P: G  Z
  69.          DS18b20_write_byte(0x44);9 X9 R5 h& e4 E5 C
  70. }
    # u& N* y6 l8 V0 {1 h$ E: W
  71. void init_18b20(void) //初始化
    0 X6 Q/ s" ^2 b$ {) `8 H; [
  72. {2 q, b/ t+ S2 }2 d8 H! z% y
  73.         u16 temp;8 ?: l* H" t. i( C/ D1 g$ n
  74. do
    / ^9 v$ ^5 r! R. t
  75. {% |6 J* N8 k+ R) N6 z! q
  76.         temperature_convert();) H9 r( t" y2 o# H! p
  77.         Delay_ms(20000);
    . c4 x6 ]$ ~9 l1 P& O! P  {3 i# P6 x
  78.         temp = get_temperature();
    7 Y  F8 o' N# f( G( e  r
  79. }          while(temp==85);
    2 f- K7 y1 t$ I$ G& p' {% d
  80. temperature_convert();" R& o" f( c0 Y$ r0 S' W
  81. }
    : n6 n  k* |+ e( K, W) l, [/ V
  82. ! U+ E$ C8 q- e. b+ M5 f7 {
  83. //u16 showdataT;( B3 d' d9 t+ _- O# f( O* z
  84. void tem_process(void) //计算温度( z/ a) h" ?7 K+ Q6 I
  85. {& p8 w! y1 ?, e) q
  86.          u16 showdata;
    " p% j9 N& `" o- l" |
  87. //   u8 Tbuf[2];- Z# E; S( j' ~3 B
  88.         temperature_convert();8 M) G0 ^) n8 K
  89.    Delay_nnms(0xAFFFF);
    6 |& S# r4 D0 g8 T" y" o
  90.          Delay_nnms(0xAFFFF);) e! n6 w7 {8 a& O( y3 n
  91.   showdata = get_temperature();# C" Z4 n$ h; E, d6 j5 r
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度4 q7 z/ C  }% S3 B- F2 `/ M
  93. }
复制代码
8 l- r- ^1 l6 O! B8 q" v2 D! S
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
9 Q/ G) o) @5 P$ m: i
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。

6 J+ v1 v8 `. [5 t) \) _6 }8 T+ J

图1

图1

图2

图2

图3

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

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版