打印

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

[复制链接]
4601|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机实现ds18b20三路温度采集出错 求解     单片机实现ds18b20三路温度采集出错 求解  实现的效果是三路温度采集求平均值    我改动别人的一路的   改后自己的一直显示的是零

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

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

sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;


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

uchar code Temperature_Char[8] =
{
        0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
};

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

uchar count;

uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;

void DelayXus(uint x)
{
        uchar i;
        while(x--)
        {
                 for(i=0;i<200;i++);
        }
}

bit LCD_Busy_Check()
{
        bit result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EN = 1;
        delayNOP();
        result = (bit)(P0&0x80);
        LCD_EN=0;
        return result;
}

void Write_LCD_Command(uchar cmd)
{
        while(LCD_Busy_Check());
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EN = 0;
        _nop_();
        _nop_();
        P0 = cmd;
        delayNOP();
        LCD_EN = 1;
        delayNOP();
        LCD_EN = 0;
}

void Write_LCD_Data(uchar dat)
{
        while(LCD_Busy_Check());
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EN = 0;
        P0 = dat;
        delayNOP();
        LCD_EN = 1;
        delayNOP();
        LCD_EN = 0;
}

void LCD_Initialise()
{
        Write_LCD_Command(0x01);
        DelayXus(5);
        Write_LCD_Command(0x38);
        DelayXus(5);
        Write_LCD_Command(0x0c);
        DelayXus(5);
        Write_LCD_Command(0x06);
        DelayXus(5);       
}

void Set_LCD_POS(uchar pos)
{
        Write_LCD_Command(pos|0x80);       
}

void Delay(uint x)
{
        while(--x);
}

uchar Init_DS18B20()
{
        uchar status;
        DQ = 1;
        Delay(8);
        DQ = 0;
        Delay(90);
        DQ = 1;
        Delay(8);
        DQ = 1;
        return status;
}

uchar ReadOneByte()
{
        uchar i,dat=0;
        DQ = 1;
        _nop_();
        for(i=0;i<8;i++)
        {
                 DQ = 0;
                dat >>= 1;
                DQ = 1;
                _nop_();
                _nop_();
                if(DQ)
                        dat |= 0X80;
                Delay(30);
                DQ = 1;
        }
        return dat;
}

void WriteOneByte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                 DQ = 0;
                DQ = dat& 0x01;
                Delay(5);
                DQ = 1;
                dat >>= 1;
        }
}

void Read_Temperature(uchar a0,uchar a1)
{        uchar n0;
            A0=a0;A1=a1;
        if(Init_DS18B20()==1)
                DS18B20_IS_OK=0;
        else
        {
                WriteOneByte(0xcc);
                WriteOneByte(0x44);
                Init_DS18B20();
                WriteOneByte(0xcc);
                WriteOneByte(0xbe);
                Temp_Value[0] = ReadOneByte();
                Temp_Value[1] = ReadOneByte();
                DS18B20_IS_OK=1;
                count++;
                                if((Temp_Value[1]&0xf8)==0xf8)
                        {
                                 Temp_Value[1] = ~Temp_Value[1];
                                Temp_Value[0] = ~Temp_Value[0]+1;
                                if(Temp_Value[0]==0x00)
                                        Temp_Value[1]++;
                        //        ng = 1;       
                        }
                        n0 = df_Table[Temp_Value[0]&0x0f];
                        CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
                        CurrentT= CurrentT*10+n0;       
                        }       
}

void Display_Temperature()
{
        uchar i;
        uchar t = 150;    //, ng = 0
/*        if((Temp_Value[1]&0xf8)==0xf8)
        {
                 Temp_Value[1] = ~Temp_Value[1];
                Temp_Value[0] = ~Temp_Value[0]+1;
                if(Temp_Value[0]==0x00)
                        Temp_Value[1]++;
                ng = 1;       
        }
        Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
        CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
*/
        Display_Digit[3] = CurrentT/1000;
        Display_Digit[2] = CurrentT%1000/100;
        Display_Digit[1] = CurrentT%100/10;
        Display_Digit[0] = CurrentT/10;
        Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
        Current_Temp_Display_Buffer[10] = '.';
        Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
        Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
        Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';
        if(Display_Digit[3] == 0)
                Current_Temp_Display_Buffer[7]  = ' ';
        if(Display_Digit[2] == 0&&Display_Digit[3]==0)
                Current_Temp_Display_Buffer[8]  = ' ';
/*        if(ng)
        {
                 if(Current_Temp_Display_Buffer[8]  == ' ')
                        Current_Temp_Display_Buffer[8]  = '-';
                else if(Current_Temp_Display_Buffer[7]  == ' ')
                        Current_Temp_Display_Buffer[7]  = '-';
                else
                        Current_Temp_Display_Buffer[6]  = '-';
        }
*/
        Set_LCD_POS(0x00);
        for(i=0;i<16;i++)
        {
                Write_LCD_Data(Temp_Disp_Title[i]);        
        }
        Set_LCD_POS(0x40);
        for(i=0;i<16;i++)
        {
                Write_LCD_Data(Current_Temp_Display_Buffer[i]);        
        }               
        Set_LCD_POS(0x4d);
        Write_LCD_Data(0x00);
        Set_LCD_POS(0x4e);
        Write_LCD_Data('C');
}

void main()
{        uint sum;
        LCD_Initialise();
//        Read_Temperature(0,0);
        Delay(50000);
        Delay(50000);
        while(1)
        {       
                 Read_Temperature(0,0);
                sum+=CurrentT;
                DelayXus(10);       
                 Read_Temperature(1,0);
                sum+=CurrentT;
                DelayXus(10);       
                 Read_Temperature(0,1);
                sum+=CurrentT;
                if(count==3)
                {
                 CurrentT=sum/3;
                 Display_Temperature();
                count=0;
            sum=0;
                }
                DelayXus(100);               
        }

}





1.jpg (150.8 KB )

1.jpg

2.jpg (197.81 KB )

2.jpg

DS18B20温度传感器.zip

56.99 KB

相关帖子

沙发
chinacn1989| | 2011-10-21 12:59 | 只看该作者
我发现
我也不喜欢看代码了
不过你可以先试试一路1820
如果可行了再说下文!

使用特权

评论回复
板凳
化升1991|  楼主 | 2011-10-21 15:40 | 只看该作者
2# chinacn1989

使用特权

评论回复
地板
乔巴aiai| | 2011-10-21 15:43 | 只看该作者
学习

使用特权

评论回复
5
乔巴aiai| | 2011-10-21 15:43 | 只看该作者
学习

使用特权

评论回复
6
乔巴aiai| | 2011-10-21 15:43 | 只看该作者

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

学习

使用特权

评论回复
7
乔巴aiai| | 2011-10-21 15:44 | 只看该作者

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

学习

使用特权

评论回复
8
乔巴aiai| | 2011-10-21 15:44 | 只看该作者

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

学习

使用特权

评论回复
9
乔巴aiai| | 2011-10-21 15:44 | 只看该作者
努力学习中!

使用特权

评论回复
10
乔巴aiai| | 2011-10-21 15:45 | 只看该作者
还看不懂啊,努力学习中!

使用特权

评论回复
11
乔巴aiai| | 2011-10-21 15:45 | 只看该作者
刚刚开始认真学单片机,还看不懂,努力学习中!

使用特权

评论回复
12
乔巴aiai| | 2011-10-21 15:45 | 只看该作者
刚刚开始认真学单片机,还看不懂,努力学习中!

使用特权

评论回复
13
ayb_ice| | 2011-10-21 16:20 | 只看该作者
我服了你了
居然用电子开关切换DS18B20
本来3个就可以直接接在一起的
估计是搜索功能搞不定啊

使用特权

评论回复
14
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赋值了吗??

使用特权

评论回复
15
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
        {
//........
        }

使用特权

评论回复
16
liutubao| | 2011-10-21 21:52 | 只看该作者
可以通过读取18B20的序列号,读取温度,可以将三个用一根线接

使用特权

评论回复
17
liutubao| | 2011-10-21 21:53 | 只看该作者
如果需要我给你一个可以用的底层驱动

使用特权

评论回复
18
化升1991|  楼主 | 2011-10-21 23:44 | 只看该作者
17# liutubao 谢谢啊   我也是自学初学者   也搜到了四路的采集一线输出模式   但是不懂。
你能给个模式学习吗

使用特权

评论回复
19
流泪鲨鱼| | 2011-10-22 16:05 | 只看该作者
三个最好挂在一个总线上 通过序列号读  你这样做不好

使用特权

评论回复
20
Ryanhsiung| | 2011-10-22 20:02 | 只看该作者
哥,不要贴代码,说一下实现方法!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝