找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机读取18B20传感器的ROM序列码是8个FF

查看数: 842 | 评论数: 6 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-11-22 20:08

正文摘要:

      最近搞51单片机4个18b20传感器并联,通过读取ROM序列码查询温度并显示在1602液晶上,现在已经能显示,并且使用了几天。4个18b20的ROM序列码是一个单独的工程代读出来,写到另一个工程的数 ...

回复

ID:382454 发表于 2025-12-1 15:45
这个数据表格里肯定有说,单总线多个并联。也可以分开多个IO口。
ID:71233 发表于 2025-11-24 09:17
我觉得多半是时序不对
ID:1133081 发表于 2025-11-24 08:34
小桥流水不 发表于 2025-11-23 19:12
这4个18b20我是知道序列号的,是之前读出来做好记录的,如果现在将这4个序列号写到数组里能读出并显示温 ...

在已知多器件的序列号的条件下,需要发匹配命令0x55,匹配成功才能正确读取指定器件返回的温度值。例如:
  1. //匹配多通道DS18B20序列号
  2. void SeriesNumber(u8 ch)
  3. {
  4.         u8 i;
  5.         DS18B20_WriteByte(0x55); //发送匹配 ROM 命令
  6.         for(i=0;i<8;i++)
  7.                 DS18B20_WriteByte(table[ch][i]);
  8. }
  9. //读取多通道DS18B20温度函数
  10. u16 ReadTemperature(u8 ch)
  11. {
  12.         u16 TempH, TempL, Temperature;
  13.         DS18B20_Reset();                //设备复位
  14.         DS18B20_WriteByte(0xCC);        //跳过ROM匹配
  15.         DS18B20_WriteByte(0x44);        //启动转换
  16.         while (!DQ);                    //等待转换完成
  17.         DS18B20_Reset();                //设备复位
  18.         SeriesNumber(ch);               //匹配 ROM
  19.         DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  20.         TempL = DS18B20_ReadByte();     //读温度低字节
  21.         TempH = DS18B20_ReadByte();     //读温度高字节       
  22.         if(TempH & 0xf8)                //判断是否位负数
  23.         {
  24.                 MinusFlag = 1;              //设置负数标志
  25.                 Temperature = (TempH<<8) | TempL;
  26.                 Temperature = ~Temperature + 1;
  27.                 Temperature *= 0.625;       //0.0625 * 10,保留1位小数点
  28.         }
  29.         else
  30.         {
  31.                 MinusFlag = 0;              //清除负数标志
  32.                 Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小数点
  33.         }       
  34.         return Temperature;
  35. }
复制代码




ID:888875 发表于 2025-11-23 21:04
问题太多,还有启动温度转换之后要等一定时间才能读取到准确数据
ID:1151496 发表于 2025-11-23 19:12
WL0123 发表于 2025-11-23 08:22
单线多点18b20的测温需要先读出各分支器件的序列号并保存,通常采用“二读法”,再根据序列号匹配各分支器 ...

这4个18b20我是知道序列号的,是之前读出来做好记录的,如果现在将这4个序列号写到数组里能读出并显示温度,我现在想加一个功能是插一个传感器,按下按键,读出ROM码再保存到eep。这个功能是为了方便更换传感器不用重新烧录。现在遇到的问题是我单独只能读出2个正确的rom码,另外两个读出来都是8个FF。你要说传感器坏了吧,把这个传感器之前读出来的ROM码写进去又能读出温度。
ID:1133081 发表于 2025-11-23 08:22
单线多点18b20的测温需要先读出各分支器件的序列号并保存,通常采用“二读法”,再根据序列号匹配各分支器件,才能正确获取各分支器件的温度值。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表