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发生到串口;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
28条回答
R88
2020-02-07 14:48
bi大痣 发表于 2014-10-23 16:29
额  一个的话没有必要直接读取温度就可以了,初始化的时候跳过序列号就可以了!不知道你为啥要读取序列号! ...

while1外面有读取,我看了下时序也是正确的:

1111.JPG (144.3 KB, 下载次数: 0)

下载附件

2014-10-23 17:36 上传

一周热门 更多>