单片机实现ds18b20三路温度采集出错 求解

[复制链接]
5812|25
 楼主| 化升1991 发表于 2011-10-21 11:54 | 显示全部楼层 |阅读模式
单片机实现ds18b20三路温度采集出错 求解     单片机实现ds18b20三路温度采集出错 求解  实现的效果是三路温度采集求平均值    我改动别人的一路的   改后自己的一直显示的是零

   求有  单片机实现ds18b20温度采集 经验的朋友指点。
  1. /***************   writer:shopping.w   ******************/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

  7. sbit DQ = P3^3;
  8. sbit A0 = P2^6;
  9. sbit A1= P2^7;

  10. sbit LCD_RS = P2^0;
  11. sbit LCD_RW = P2^1;
  12. sbit LCD_EN = P2^2;


  13. uchar code Temp_Disp_Title[]={"Current Temp : "};
  14. uchar Current_Temp_Display_Buffer[]={" TEMP:   "};

  15. uchar code Temperature_Char[8] =
  16. {
  17.         0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
  18. };

  19. uchar code df_Table[]=
  20. {
  21.         0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
  22. };

  23. uchar count;

  24. uchar CurrentT = 0;
  25. uchar Temp_Value[]={0x00,0x00};
  26. uchar Display_Digit[]={0,0,0,0};
  27. bit DS18B20_IS_OK = 1;

  28. void DelayXus(uint x)
  29. {
  30.         uchar i;
  31.         while(x--)
  32.         {
  33.                  for(i=0;i<200;i++);
  34.         }
  35. }

  36. bit LCD_Busy_Check()
  37. {
  38.         bit result;
  39.         LCD_RS = 0;
  40.         LCD_RW = 1;
  41.         LCD_EN = 1;
  42.         delayNOP();
  43.         result = (bit)(P0&0x80);
  44.         LCD_EN=0;
  45.         return result;
  46. }

  47. void Write_LCD_Command(uchar cmd)
  48. {
  49.         while(LCD_Busy_Check());
  50.         LCD_RS = 0;
  51.         LCD_RW = 0;
  52.         LCD_EN = 0;
  53.         _nop_();
  54.         _nop_();
  55.         P0 = cmd;
  56.         delayNOP();
  57.         LCD_EN = 1;
  58.         delayNOP();
  59.         LCD_EN = 0;
  60. }

  61. void Write_LCD_Data(uchar dat)
  62. {
  63.         while(LCD_Busy_Check());
  64.         LCD_RS = 1;
  65.         LCD_RW = 0;
  66.         LCD_EN = 0;
  67.         P0 = dat;
  68.         delayNOP();
  69.         LCD_EN = 1;
  70.         delayNOP();
  71.         LCD_EN = 0;
  72. }

  73. void LCD_Initialise()
  74. {
  75.         Write_LCD_Command(0x01);
  76.         DelayXus(5);
  77.         Write_LCD_Command(0x38);
  78.         DelayXus(5);
  79.         Write_LCD_Command(0x0c);
  80.         DelayXus(5);
  81.         Write_LCD_Command(0x06);
  82.         DelayXus(5);       
  83. }

  84. void Set_LCD_POS(uchar pos)
  85. {
  86.         Write_LCD_Command(pos|0x80);       
  87. }

  88. void Delay(uint x)
  89. {
  90.         while(--x);
  91. }

  92. uchar Init_DS18B20()
  93. {
  94.         uchar status;
  95.         DQ = 1;
  96.         Delay(8);
  97.         DQ = 0;
  98.         Delay(90);
  99.         DQ = 1;
  100.         Delay(8);
  101.         DQ = 1;
  102.         return status;
  103. }

  104. uchar ReadOneByte()
  105. {
  106.         uchar i,dat=0;
  107.         DQ = 1;
  108.         _nop_();
  109.         for(i=0;i<8;i++)
  110.         {
  111.                  DQ = 0;
  112.                 dat >>= 1;
  113.                 DQ = 1;
  114.                 _nop_();
  115.                 _nop_();
  116.                 if(DQ)
  117.                         dat |= 0X80;
  118.                 Delay(30);
  119.                 DQ = 1;
  120.         }
  121.         return dat;
  122. }

  123. void WriteOneByte(uchar dat)
  124. {
  125.         uchar i;
  126.         for(i=0;i<8;i++)
  127.         {
  128.                  DQ = 0;
  129.                 DQ = dat& 0x01;
  130.                 Delay(5);
  131.                 DQ = 1;
  132.                 dat >>= 1;
  133.         }
  134. }

  135. void Read_Temperature(uchar a0,uchar a1)
  136. {        uchar n0;
  137.             A0=a0;A1=a1;
  138.         if(Init_DS18B20()==1)
  139.                 DS18B20_IS_OK=0;
  140.         else
  141.         {
  142.                 WriteOneByte(0xcc);
  143.                 WriteOneByte(0x44);
  144.                 Init_DS18B20();
  145.                 WriteOneByte(0xcc);
  146.                 WriteOneByte(0xbe);
  147.                 Temp_Value[0] = ReadOneByte();
  148.                 Temp_Value[1] = ReadOneByte();
  149.                 DS18B20_IS_OK=1;
  150.                 count++;
  151.                                 if((Temp_Value[1]&0xf8)==0xf8)
  152.                         {
  153.                                  Temp_Value[1] = ~Temp_Value[1];
  154.                                 Temp_Value[0] = ~Temp_Value[0]+1;
  155.                                 if(Temp_Value[0]==0x00)
  156.                                         Temp_Value[1]++;
  157.                         //        ng = 1;       
  158.                         }
  159.                         n0 = df_Table[Temp_Value[0]&0x0f];
  160.                         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
  161.                         CurrentT= CurrentT*10+n0;       
  162.                         }       
  163. }

  164. void Display_Temperature()
  165. {
  166.         uchar i;
  167.         uchar t = 150;    //, ng = 0
  168. /*        if((Temp_Value[1]&0xf8)==0xf8)
  169.         {
  170.                  Temp_Value[1] = ~Temp_Value[1];
  171.                 Temp_Value[0] = ~Temp_Value[0]+1;
  172.                 if(Temp_Value[0]==0x00)
  173.                         Temp_Value[1]++;
  174.                 ng = 1;       
  175.         }
  176.         Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
  177.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
  178. */
  179.         Display_Digit[3] = CurrentT/1000;
  180.         Display_Digit[2] = CurrentT%1000/100;
  181.         Display_Digit[1] = CurrentT%100/10;
  182.         Display_Digit[0] = CurrentT/10;
  183.         Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
  184.         Current_Temp_Display_Buffer[10] = '.';
  185.         Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
  186.         Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
  187.         Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';
  188.         if(Display_Digit[3] == 0)
  189.                 Current_Temp_Display_Buffer[7]  = ' ';
  190.         if(Display_Digit[2] == 0&&Display_Digit[3]==0)
  191.                 Current_Temp_Display_Buffer[8]  = ' ';
  192. /*        if(ng)
  193.         {
  194.                  if(Current_Temp_Display_Buffer[8]  == ' ')
  195.                         Current_Temp_Display_Buffer[8]  = '-';
  196.                 else if(Current_Temp_Display_Buffer[7]  == ' ')
  197.                         Current_Temp_Display_Buffer[7]  = '-';
  198.                 else
  199.                         Current_Temp_Display_Buffer[6]  = '-';
  200.         }
  201. */
  202.         Set_LCD_POS(0x00);
  203.         for(i=0;i<16;i++)
  204.         {
  205.                 Write_LCD_Data(Temp_Disp_Title[i]);        
  206.         }
  207.         Set_LCD_POS(0x40);
  208.         for(i=0;i<16;i++)
  209.         {
  210.                 Write_LCD_Data(Current_Temp_Display_Buffer[i]);        
  211.         }               
  212.         Set_LCD_POS(0x4d);
  213.         Write_LCD_Data(0x00);
  214.         Set_LCD_POS(0x4e);
  215.         Write_LCD_Data('C');
  216. }

  217. void main()
  218. {        uint sum;
  219.         LCD_Initialise();
  220. //        Read_Temperature(0,0);
  221.         Delay(50000);
  222.         Delay(50000);
  223.         while(1)
  224.         {       
  225.                  Read_Temperature(0,0);
  226.                 sum+=CurrentT;
  227.                 DelayXus(10);       
  228.                  Read_Temperature(1,0);
  229.                 sum+=CurrentT;
  230.                 DelayXus(10);       
  231.                  Read_Temperature(0,1);
  232.                 sum+=CurrentT;
  233.                 if(count==3)
  234.                 {
  235.                  CurrentT=sum/3;
  236.                  Display_Temperature();
  237.                 count=0;
  238.             sum=0;
  239.                 }
  240.                 DelayXus(100);               
  241.         }

  242. }





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
chinacn1989 发表于 2011-10-21 12:59 | 显示全部楼层
我发现
我也不喜欢看代码了
不过你可以先试试一路1820
如果可行了再说下文!
 楼主| 化升1991 发表于 2011-10-21 15:40 | 显示全部楼层
2# chinacn1989
乔巴aiai 发表于 2011-10-21 15:43 | 显示全部楼层
乔巴aiai 发表于 2011-10-21 15:43 | 显示全部楼层
乔巴aiai 发表于 2011-10-21 15:43 | 显示全部楼层

RE: 单片机实现ds18b20三路温度采集出错 求解

学习
乔巴aiai 发表于 2011-10-21 15:44 | 显示全部楼层

RE: 单片机实现ds18b20三路温度采集出错 求解

学习
乔巴aiai 发表于 2011-10-21 15:44 | 显示全部楼层

RE: 单片机实现ds18b20三路温度采集出错 求解

学习
乔巴aiai 发表于 2011-10-21 15:44 | 显示全部楼层
努力学习中!
乔巴aiai 发表于 2011-10-21 15:45 | 显示全部楼层
还看不懂啊,努力学习中!
乔巴aiai 发表于 2011-10-21 15:45 | 显示全部楼层
刚刚开始认真学单片机,还看不懂,努力学习中!
乔巴aiai 发表于 2011-10-21 15:45 | 显示全部楼层
刚刚开始认真学单片机,还看不懂,努力学习中!
ayb_ice 发表于 2011-10-21 16:20 | 显示全部楼层
我服了你了
居然用电子开关切换DS18B20
本来3个就可以直接接在一起的
估计是搜索功能搞不定啊
xhtxzxw 发表于 2011-10-21 21:18 | 显示全部楼层
问题很多。先说一个:
uchar Init_DS18B20()
{
        uchar status;
        DQ = 1;
        Delay(8);
        DQ = 0;
        Delay(90);
        DQ = 1;
        Delay(8);
        DQ = 1;
        return status;
}
你这个status赋值了吗??
xhtxzxw 发表于 2011-10-21 21:21 | 显示全部楼层
然后:
void Read_Temperature(uchar a0,uchar a1)
{        uchar n0;
            A0=a0;A1=a1;
        if(Init_DS18B20()==1)     //这儿有啥意义啊??你的Init_DS18B20()返回值没有任何意义
                DS18B20_IS_OK=0;
        else
        {
//........
        }
liutubao 发表于 2011-10-21 21:52 | 显示全部楼层
可以通过读取18B20的序列号,读取温度,可以将三个用一根线接
liutubao 发表于 2011-10-21 21:53 | 显示全部楼层
如果需要我给你一个可以用的底层驱动
 楼主| 化升1991 发表于 2011-10-21 23:44 | 显示全部楼层
17# liutubao 谢谢啊   我也是自学初学者   也搜到了四路的采集一线输出模式   但是不懂。
你能给个模式学习吗
流泪鲨鱼 发表于 2011-10-22 16:05 | 显示全部楼层
三个最好挂在一个总线上 通过序列号读  你这样做不好
Ryanhsiung 发表于 2011-10-22 20:02 | 显示全部楼层
哥,不要贴代码,说一下实现方法!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部