求助:c8051f120与18B20通信,一直输出是0

2020-02-05 09:07发布

求助:c8051f120与18B20通信,一直输出是0,火大。
可能原因:
1、时序(用示波器看的,应该没有问题)
2、18B20是坏的(也测试过没坏)
3、用的是C8051F120的P3^7,配置成开漏
   (C8051F难道还有什么忘了配置?
    因为用P3^7可以初始化,用P4 P5 P6 P7不能完成初始化)

把关键代码贴出来:
  1. void Init_DS18B20(void)
  2. {

  3. //shuchu
  4. DQ = 1;   
  5. DQ = 0;   
  6. timer_delay(15000); //精确延时大于480us
  7. DQ = 1;   

  8. //shuru
  9. timer_delay(1250); //15~60us
  10. while(DQ);
  11. timer_delay(5000); //60~240us

  12. //shuchu
  13.   DQ = 1;
  14. timer_delay(15000); //180~405us

  15. }
复制代码
  1. unsigned char ReadOneChar(void)
  2. {
  3. unsigned char i=0;
  4. //unsigned char j=0;
  5. unsigned char dat = 0;
  6. for (i=0;i<8;i++)
  7. {
  8.           DQ = 1;
  9.           DQ = 0;
  10.           Delay(40);//>1us
  11.           //shuru
  12.           //j=DQ;        //<15us
  13.           if(DQ)
  14.           dat|=(1<<i);
  15.           else
  16.           dat&=~(1<<i);
  17.           timer_delay(2500);
  18.           DQ = 1;
  19.   }
  20.   DQ = 1;
  21.   return(dat);
  22. }
复制代码
  1. void WriteOneChar(unsigned char dat)
  2. {
  3. unsigned char i=0;
  4. for (i=0; i<8; i++)
  5. {
  6.   DQ = 1;
  7.   DQ = 0;
  8.   timer_delay(800);
  9.    
  10.   if(dat&(1<<i))
  11.   DQ = 1;
  12.   else
  13.   DQ = 0;
  14.   timer_delay(2500);
  15.   DQ = 1;
  16. }
  17. DQ = 1;
  18. }
复制代码
  1. unsigned int ReadTemperature(void)
  2. {
  3. unsigned char a;
  4. unsigned char b;
  5. unsigned int t;
  6. //float         T;
  7. Init_DS18B20();
  8. WriteOneChar(0xcc); // 跳过读序号列号的操作
  9. WriteOneChar(0x44); // 启动温度转换

  10. // Delay_ms(2);

  11. Init_DS18B20();
  12. WriteOneChar(0xcc); //跳过读序号列号的操作
  13. WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

  14. a=ReadOneChar();//di
  15. b=ReadOneChar();//gao

  16. //a=0x12;b=0x23;
  17. t=b;                       
  18. t<<=8;
  19. t=t|a;                 
  20. //T=(float)t*0.0625;


  21. return(t);
  22. }  
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。