关于AT89C52驱动DS18B20总线无应答问题

2019-07-15 07:20发布

照书敲的代码如下:
  1. #define _DS18B20_C
  2. #include<reg52.h>
  3. #include<DS1302.h>
  4. #include<DS18B20.h>
  5. #include<intrins.h>

  6. //软件延时函数
  7. void DelayX10us(uint8 t)
  8. {
  9.         do{
  10.                 _nop_();
  11.                 _nop_();
  12.                 _nop_();
  13.                 _nop_();
  14.                 _nop_();
  15.                 _nop_();
  16.                 _nop_();
  17.                 _nop_();
  18.         } while(--t);
  19. }

  20. //复位总线,获取存在脉冲,以启动一次读写操作
  21. bit Get18B20Ack()
  22. {
  23.         bit ack;
  24.         EA = 0;
  25.         IO_18B20 = 0;
  26.         DelayX10us(50);
  27.         IO_18B20 = 1;
  28.         DelayX10us(6);
  29.         ack = IO_18B20;
  30.         while(!IO_18B20);
  31.         EA = 1;

  32.         return ack;
  33. }

  34. //向DS18B20写入一个字节,dat为待写入字节
  35. void Write18B20(uint8 dat)
  36. {
  37.         uint8 mask;
  38.         
  39.         EA = 0;
  40.         for(mask=0x01;mask!=0;mask<<=1)
  41.         {
  42.                 IO_18B20 = 0;
  43.                 _nop_();
  44.                 _nop_();
  45.                 if((mask&dat) == 0)IO_18B20 = 0;
  46.                 else IO_18B20 = 1;
  47.                 DelayX10us(6);
  48.                 IO_18B20 = 1;
  49.         }
  50.         EA = 1;        
  51. }

  52. //从DS18B20读取一个字节,返回值为读到的字节
  53. uint8 Read18B20()
  54. {
  55.         uint8 dat;
  56.         uint8 mask;

  57.         EA = 0;
  58.         for(mask=0x01;mask!=0;mask<<=1)
  59.         {
  60.                 IO_18B20 = 0;
  61.                 _nop_();
  62.                 _nop_();
  63.                 IO_18B20 = 1;
  64.                 _nop_();
  65.                 _nop_();
  66.                 if(!IO_18B20) dat &= ~mask;
  67.                 else dat |= mask;
  68.                 DelayX10us(6);
  69.         }
  70.         EA = 1;
  71.         return dat;
  72. }

  73. //启动一次18B20温度转换,返回值表示是否启动成功;
  74. bit Start18B20()
  75. {
  76.         bit ack;

  77.         ack = Get18B20Ack();
  78.         if(ack == 0)
  79.         {
  80.                 Write18B20(0xCC);
  81.                 Write18B20(0x44);
  82.         }
  83.         return ~ack;
  84. }

  85. //读取DS18B20转换的温度值,返回值为表示是否读取成功
  86. bit Get18B20Temp(int16 *temp)
  87. {
  88.         bit ack;
  89.         uint8 LSB,MSB;

  90.         ack = Get18B20Ack();
  91.         if(ack == 0)
  92.         {
  93.                 Write18B20(0xCC);
  94.                 Write18B20(0xBE);
  95.                 LSB = Read18B20();
  96.                 MSB = Read18B20();
  97.                 *temp = ((int)MSB<<8) + LSB;
  98.         }
  99.         return ~ack;
  100. }
复制代码[img]file:///C:UsersAPPLEDocumentsTencent Files767038756ImageC2CF[ZQR_A]``VP%S)VN3Y3%MO.png[/img]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
人中狼
1楼-- · 2019-07-15 11:16
18B20数值需要转换计算才是十进制温度值,这部分有没有错,另外三个显示数字,哪一个是温度值
李春明
2楼-- · 2019-07-15 13:16
 精彩回答 2  元偷偷看……

一周热门 更多>