请选择 进入手机版 | 继续访问电脑版

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

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

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

18B20的引脚定义如图2所示:

直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。
工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:

数据转换及读取主程序如下所示:
  1. u8 DS18b20_read_byte(void) //读字节
  2. {
  3.          u8 i;
  4.          u8 data=0;
  5.          for(i=0;i<8;i++)
  6.          {
  7.                  data >>=1;
  8.                  GPIO_ConfigurationOUT();
  9.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  10.                  Delay_nms(15);
  11.                  GPIO_ConfigurationIN();
  12.                  Delay_nms(50);
  13.                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
  14.                          data=data|0x80;
  15.                  else
  16.                          data&=0x7f;
  17.                  Delay_nms(600);
  18.                  
  19.          }
  20.          return data;
  21.          
  22. }

  23. void DS18b20_write_byte(u8 dat) //写字节
  24. {
  25.          u8 i;
  26.          u8 one_bit;
  27.          for(i=0;i<8;i++)
  28.          {
  29.                  one_bit = dat&0x01;
  30.                  dat = dat>>1;
  31.                  GPIO_ConfigurationOUT();
  32.                  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  33.                  Delay_nms(125);
  34.                  if(one_bit)
  35.                  {
  36.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
  37.                          Delay_nms(300);
  38.                  }
  39.                  else
  40.                  {
  41.                          Delay_nms(300);
  42.                          GPIO_SetBits(GPIOB,GPIO_Pin_14);
  43. //                          GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  44.                  }
  45.                  Delay_nms(80);
  46.          }
  47. }

  48. u16 get_temperature(void) //得到温度数据
  49. {
  50.          u8 a,b;
  51.          u16 temp;

  52.    DS18b20_reset();
  53.          DS18b20_write_byte(0xCC);
  54.          DS18b20_write_byte(0xBE);
  55.          
  56.          a = DS18b20_read_byte();
  57.          b = DS18b20_read_byte();
  58.          temp = (u16)b<<8 |a;
  59.          return temp;
  60.          
  61. }
  62. void temperature_convert(void)
  63. {
  64.          DS18b20_reset();
  65.          DS18b20_write_byte(0xCC);
  66.          DS18b20_write_byte(0x44);
  67. }
  68. void init_18b20(void) //初始化
  69. {
  70.         u16 temp;
  71. do
  72. {
  73.         temperature_convert();
  74.         Delay_ms(20000);
  75.         temp = get_temperature();
  76. }          while(temp==85);
  77. temperature_convert();
  78. }

  79. //u16 showdataT;
  80. void tem_process(void) //计算温度
  81. {
  82.          u16 showdata;
  83. //   u8 Tbuf[2];
  84.         temperature_convert();
  85.    Delay_nnms(0xAFFFF);
  86.          Delay_nnms(0xAFFFF);
  87.   showdata = get_temperature();
  88.         showdataT = showdata*0.0625*10+0.5-10; //计算温度
  89. }
复制代码

本程序通过定时器定时200mS读一次温度,数据显示如图5所示:

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

图1

图1

图2

图2

图3

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

举报

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