18B20的时序是对的,为何读不出数据呢?

2020-02-06 10:26发布

  1. uchar read_bit(void)  //读一位(bit)
  2. {
  3.         unsigned char i,j;
  4.         TRISC&=0xfd;//配置RC1为输出
  5.         RC1=0;       //将RC1拉低开始读时间隙
  6.         //RC1=1;  //then return high
  7.         for(i=0;i<1;i++);  // 延时
  8.         TRISC|=0x02;//配置RC1为输入
  9.         for(i=0;i<1;i++);
  10.         return(RC1);  // 返回RC1线上的电平值
  11. }

  12. uchar ReadOneChar(void) //读一个字节
  13. {
  14.         unsigned char i = 0;
  15.         unsigned char dat = 0;
  16.         for (i=0;i<8;i++)  
  17.         {   
  18.                 if(read_bit())
  19.                 dat|=(0x01<<i);    // 然后将其左移
  20.             Delay(4);
  21.         }
  22.     return (dat);
  23. }

  24. void write_bit(char bitval)        //写一位
  25. {
  26.         RC1=0;         // 将RC1拉低开始写时间隙
  27.         if(bitval==1)
  28.         RC1=1;   // 如果写1,RC1返回高电平
  29.         Delay(5);        // 在时间隙内保持电平值,
  30.         RC1=1;           // Delay函数每次循环延时16μs,因此delay(5) = 104μs
  31. }

  32. void WriteOneChar(unsigned char dat) //写一个字节
  33. {
  34.     unsigned char i = 0;
  35.     unsigned char temp;
  36.     for (i=0; i<8; i++)  // 写入字节, 每次写入一位  
  37.     {
  38.             temp=(dat>>i);  
  39.                    temp&=0x01;  
  40.                    write_bit(temp);
  41.     }
  42.     Delay(5);
  43. }
复制代码

在网上的找的51程序,移植到PIC的单片机上,主程序就这2句
WriteOneChar(0x33);       
a=ReadOneChar();
TXREG=a;
把18B20的序列号的第一位28h发生到串口;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
27条回答
qq910130528
1楼-- · 2020-02-08 12:19
R88 发表于 2014-10-23 17:36
while1外面有读取,我看了下时序也是正确的:

初始化多次?
johnlj
2楼-- · 2020-02-08 13:14
线有几米长,长的话要用屏蔽线

还有就是要多复位,每次读都复位一下
yaxiaoyu
3楼-- · 2020-02-08 14:36
检查电路,可以还一个传感器试试
markdif
4楼-- · 2020-02-08 17:46
也认为这个TC1047好用点。。。
huojianfei
5楼-- · 2020-02-08 18:58
 精彩回答 2  元偷偷看……
codeman
6楼-- · 2020-02-08 23:32
曾做过 10来米线上IO口取电并30来个,通讯稳定可靠。
数据手册上写的很详细,记得大约步骤如下
先复位总线 -> 跳过ROM -> 启动温度转换 -> 延时 ->匹配ROM(总线上单个器件可跳过)-> 读数据->获取温度

一周热门 更多>