找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 215|回复: 6
收起左侧

单片机+DS18B20总输出255

[复制链接]
1076658053 发表于 2020-10-3 16:31 | 显示全部楼层 |阅读模式
DS18B20总输出255,数值不会改变18b20 程序如下:

  1. #include "STC15F2K60S2.h"

  2. sbit DQ = P1^4;  //单总线接口

  3. //单总线延时函数
  4. void Delay_OneWire(unsigned int t)  //STC89C52RC
  5. {
  6.         while(t--);
  7. }

  8. void delay_18b20()
  9. {
  10.         unsigned int x,y;
  11.         for(x = 1;x>0;x--)
  12.                 for(y=110;y>0;y--);
  13. }

  14. //通过单总线向DS18B20写一个字节
  15. void Write_DS18B20(unsigned char dat)
  16. {
  17.         unsigned char i;
  18.         for(i=0;i<8;i++)
  19.         {
  20.                 DQ = 0;
  21.                 DQ = dat&0x01;
  22.                 Delay_OneWire(5);
  23.                 DQ = 1;
  24.                 dat >>= 1;
  25.         }
  26.         Delay_OneWire(5);
  27. }

  28. //从DS18B20读取一个字节
  29. unsigned char Read_DS18B20(void)
  30. {
  31.         unsigned char i;
  32.         unsigned char dat;
  33.   
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 DQ = 0;
  37.                 dat >>= 1;
  38.                 DQ = 1;
  39.                 if(DQ)
  40.                 {
  41.                         dat |= 0x80;
  42.                 }            
  43.                 Delay_OneWire(5);
  44.         }
  45.         return dat;
  46. }

  47. //DS18B20设备初始化
  48. bit init_ds18b20(void)
  49. {
  50.           bit initflag = 0;
  51.          
  52.           DQ = 1;
  53.           Delay_OneWire(12);
  54.           DQ = 0;
  55.           Delay_OneWire(80);
  56.           DQ = 1;
  57.           Delay_OneWire(10);
  58.     initflag = DQ;     
  59.           Delay_OneWire(5);
  60.   
  61.           return initflag;
  62. }



  63. unsigned char DS18B20()
  64. {
  65.         unsigned char low,hig;
  66.         unsigned int wendu;
  67.         init_ds18b20();
  68.         Write_DS18B20(0xcc);
  69.         Write_DS18B20(0x44);
  70.         Delay_OneWire(200);
  71.         init_ds18b20();
  72.         Write_DS18B20(0xcc);
  73.         Write_DS18B20(0xbe);
  74.         low = Read_DS18B20();
  75.         hig = Read_DS18B20();
  76.         wendu = low / 16 + hig * 16;
  77.         return wendu;
  78. }
复制代码




回复

使用道具 举报

鋆锴电子 发表于 2020-10-3 17:28 | 显示全部楼层
读出DS18B20数据需要取反吧。low=~low; hig=~hig;
回复

使用道具 举报

鋆锴电子 发表于 2020-10-3 17:31 | 显示全部楼层
ds18b20多出高八位和低八位需要取反在运算。low=~low; hig=~hig;
回复

使用道具 举报

鋆锴电子 发表于 2020-10-3 17:33 | 显示全部楼层
ds18b20读出高八位和低八位数据需要取反,在运算。
回复

使用道具 举报

 楼主| 1076658053 发表于 2020-10-3 21:59 | 显示全部楼层
鋆锴电子 发表于 2020-10-3 17:33
ds18b20读出高八位和低八位数据需要取反,在运算。

不行,取反后就全为0了,并且数值不会变
回复

使用道具 举报

累不死的狗 发表于 2020-10-7 08:48 | 显示全部楼层
看一看驱动程序有没有问题,如果没问题那就检查一下硬件电路
回复

使用道具 举报

robinsonlin 发表于 2020-10-7 11:46 | 显示全部楼层
延迟的问题吧,18B20对延迟要求还是比较严的,你这个软件延迟, 移植到不同芯片上,时效可能差别很大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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