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

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

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

% {3 M  V* z+ ?* A' e' S) u
18B20的引脚定义如图2所示:

- {1 g' F6 q# Q+ O+ `* A, M
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
: V# ~1 d+ O* s+ I0 H
数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节3 _/ ~% s+ @# U2 f' {
  2. {' D, o7 J. r; C( i) @3 t/ b
  3.          u8 i;
    ( m" u( g* j- `( w
  4.          u8 data=0;
    9 t: t. I6 [3 \6 e0 A1 F
  5.          for(i=0;i<8;i++)& E  v1 {3 Z8 a, u# X; I# t
  6.          {
    # ^$ h" I/ m* ?  d1 Y
  7.                  data >>=1;% l5 @6 L0 h2 E: W$ h/ I, Z
  8.                  GPIO_ConfigurationOUT();
    - P# e$ V0 F! {
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);/ D% F- t% m& n9 B/ l, Y$ [
  10.                  Delay_nms(15);) ?4 {6 ~  p1 ~: A2 q
  11.                  GPIO_ConfigurationIN();% n$ i5 r5 A/ ~& E0 f
  12.                  Delay_nms(50);$ L& P; j2 X* P& U# {7 [3 B+ O1 w
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
    0 W' ?+ f. [" I1 W3 U9 [
  14.                          data=data|0x80;
    8 m; I6 x( n  U; H
  15.                  else
    * W1 G* u0 C# O# c" n2 ~
  16.                          data&=0x7f;
    & j7 E1 q! l* [3 F9 I
  17.                  Delay_nms(600);! L' E  W+ m0 w: x
  18.                  & }/ K: K4 t$ d
  19.          }
    " v. Y- ~! s3 p% @+ ?/ b2 v
  20.          return data;
      n6 m( \0 _% ^* e5 f# I' n( k! ]
  21.          " T: m7 @: u0 a: m! {$ ], K
  22. }; P; d# }1 z! g: q+ K
  23. 0 R  ~- @" r. r3 W/ y
  24. void DS18b20_write_byte(u8 dat) //写字节
    8 Q% ^9 e, j9 U
  25. {3 I5 l1 S! F: {5 a, m# }
  26.          u8 i;
    , q; q+ ~) J2 o) C6 {
  27.          u8 one_bit;" o1 b) B" e' S( V
  28.          for(i=0;i<8;i++)
    5 Q- E) k$ }6 i
  29.          {
    4 i' X. s/ _3 Z1 A& Q$ L
  30.                  one_bit = dat&0x01;
    5 k( |/ w4 f- w
  31.                  dat = dat>>1;
    # Q4 v6 g( Q4 i/ @! X
  32.                  GPIO_ConfigurationOUT();6 _1 k7 j+ G% m3 z5 v
  33.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    $ P2 f  y1 [4 s6 w6 B, c
  34.                  Delay_nms(125);& G" ^& u% K9 X- W' L: z1 J3 t' }; n
  35.                  if(one_bit)
    7 J# i: p4 G+ S* x5 V2 Y9 u: H( {
  36.                  {
    + X! L8 V  ]* W2 P/ f6 p) |, X4 r
  37.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
      Z+ ^) W) ?3 e2 N  h% C0 U  ~3 Q
  38.                          Delay_nms(300);4 i- P! ?2 f( ~' P* }6 I, |1 b9 |
  39.                  }3 D6 b+ W& D" k3 q! t
  40.                  else3 E; Y, K  K% k/ ^0 f7 B
  41.                  {
    # o1 Q9 p4 z7 z
  42.                          Delay_nms(300);: j* g. E5 f! z  |
  43.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);* Q' H: g5 ?2 G
  44. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
    2 n8 D* K6 O0 V7 d5 d
  45.                  }
    ) a0 D, t. f& k
  46.                  Delay_nms(80);) J' E' c% w1 a, S
  47.          }
    ( J8 _- u% ?9 P) |
  48. }5 r7 J" Q  s1 _1 J
  49. ' d  w$ F% c* J! U4 _/ [) W$ |
  50. u16 get_temperature(void) //得到温度数据
    : ]- R3 y/ N% ^5 a. r  X! e, k
  51. {3 z3 n  ?2 q, o
  52.          u8 a,b;9 u8 _: v# ~2 h. f, o) M* Y/ w/ L
  53.          u16 temp;5 q+ X/ k6 {( C4 h# [9 r
  54. % ]: \9 k' M: k+ d" f
  55.    DS18b20_reset();7 o8 ]1 V3 T3 L3 L. m
  56.          DS18b20_write_byte(0xCC);# |/ T9 I6 D2 z2 _0 ~6 j) z; ^3 A7 m
  57.          DS18b20_write_byte(0xBE);7 ?) z( e+ {, `4 B+ u; Y- x
  58.          
    3 L' y: a* E6 \6 S: C
  59.          a = DS18b20_read_byte();0 e8 E. u% s$ @7 v
  60.          b = DS18b20_read_byte();4 G2 @3 k$ U0 w- Q
  61.          temp = (u16)b<<8 |a;
      R2 O! Q  p3 l- R7 S1 w* \
  62.          return temp;
    - u; L- b7 k' W; ~) [9 I& A
  63.          8 A1 c& A' y1 V( }3 d' s
  64. }7 n! M1 u- u- T' q: n' [
  65. void temperature_convert(void)
    . w# K& U3 [: Q: l. M& `
  66. {1 v( S7 C4 P* B& E) v, f; L
  67.          DS18b20_reset();* V# O9 L* g! F/ l0 k5 P
  68.          DS18b20_write_byte(0xCC);2 |# U; b9 V" Z: n4 @& X4 }
  69.          DS18b20_write_byte(0x44);0 Z, _. I8 X( r; K, [9 T, R% E
  70. }
    % M) S) R* t0 {+ e7 w
  71. void init_18b20(void) //初始化
    ( q8 k: G( V- @8 a
  72. {
    / i' e# m0 E( i9 b9 y0 Z
  73.         u16 temp;7 R7 {8 ?/ S: C
  74. do! Y8 R+ _! V8 C! F2 U2 K) a8 N8 N& X
  75. {& j* t, ]8 `1 s$ j; a! U
  76.         temperature_convert();
    : K; D. [+ l4 f4 ]
  77.         Delay_ms(20000);& B6 ^& Y; n* H) `# z! Z
  78.         temp = get_temperature();
    0 s7 U" _% h! Z8 y0 U9 ^3 o
  79. }          while(temp==85);
    / N9 d* K8 k0 _" G# v
  80. temperature_convert();
    ( N4 K* D) V! m9 T' A# L" @: [
  81. }& N/ }9 F) P5 F" Z

  82. + `% ^$ ?0 u3 z* n) E. H
  83. //u16 showdataT;6 h% ]- _/ g  X  w$ i& f$ G3 C% D
  84. void tem_process(void) //计算温度" E& m# d! F+ \3 k! ]2 X* K6 n
  85. {
    4 m/ V6 C( k9 q+ ~- r6 I* o
  86.          u16 showdata;
    + ^2 f9 l. s# l; V) ?* B0 T6 Z2 ~
  87. //   u8 Tbuf[2];+ s& c  O8 F+ ~$ _( d! ]
  88.         temperature_convert();$ w6 f% L4 _1 b+ n
  89.    Delay_nnms(0xAFFFF);
    6 O0 }4 ]" V  w* u8 L. Z* N
  90.          Delay_nnms(0xAFFFF);, U  y; o8 y6 D
  91.   showdata = get_temperature();6 @" q4 c8 _  X
  92.         showdataT = showdata*0.0625*10+0.5-10; //计算温度/ [1 S. y0 y) i3 {) l. d
  93. }
复制代码
; c# [6 M) z' Y. X; t. m
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
3 J5 p4 ^! X4 A" k
27.1度符合室内温度,是用手按住,温度会上升,符合预期。
主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。

5 r& v9 {) l/ W

图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 手机版