首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

多个DS18B20的温度测试有关问题

2012-12-14 
多个DS18B20的温度测试问题由于DS18B20是单总线的器件,但是由于要省时,我把八个DS18B20接在p1口子上,然后

多个DS18B20的温度测试问题
由于DS18B20是单总线的器件,但是由于要省时,我把八个DS18B20接在p1口子上,然后把得到的数据进行分析,   但是我的程序哪里不对  哪个高手看看     


/*------------------------------------------------
                    
                   延时函数(1us)

------------------------------------------------*/
void Delay_1us(uint x)
  {
     while(x--);//时间大约是1us
   }

/*------------------------------------------------
                    
                  写1时序控制函数

------------------------------------------------*/

void DS18B20_Write_1(void)
{
P1 = 0x00;            //8个DQ 线全部设置为低电平
Delay_1us(10);       //延时10us左右
P1 = 0xff;           //8个DQ线全部输出高电平
Delay_1us(30);       //延时30us左右
}
/*------------------------------------------------
                    
                  写0时序控制函数

------------------------------------------------*/

void DS18B20_Write_0(void)
{
P1 = 0x00;         //8个DQ 线全部设置为低电平
Delay_1us(40);         //延时
P1 = 0xff;            //端口恢复高电平
Delay_1us(1);
}

 /*------------------------------------------------
               
                     18b20初始化

------------------------------------------------*/
void DS18B20_Reset(void)
{
uchar Error_Counter=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(500); //保持总线低电平500us
P1 = 0xff;
Delay_1us(100);
if(P1!=0x00) B20_Error = P1;//如检测到DS18B20总线响应了回复信号,则读取当前8条总线的状态
Delay_1us(50);
P1 = 0xff;
for(Error_Counter=0;Error_Counter<200;Error_Counter++)
{
if((P1&(~B20_Error))==(~B20_Error)) break; //如检测到总线的回复信号结束,则退出循环
Delay_1us(1);
}
P1 = 0xff; //恢复端口电平
Delay_1us(200); //延时 200us
}


/*------------------------------------------------
             
                总线读取一个数据位

------------------------------------------------*/
uchar DS18B20_ReadDQ(void)
{
uchar DQ_S=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(10);
P1 = 0xff; //端口置1,准备读取
Delay_1us(1); //延时待总线准备好数据
DQ_S = P1; //一次性读取8条DQ线的数据状态
P1 = 0xff; //恢复端口电平
Delay_1us(30); //延时
return DQ_S; //返回读取的值
}

/*------------------------------------------------
                  


                   写入一个字节

------------------------------------------------*/
void DS18B20_WriteByte(uchar Com)
{
  uchar i;
  for(i=0;i<8;i++)
  {
if(Com&0x01)
DS18B20_Write_1();
else
DS18B20_Write_0();
Com = Com>>1;   
  }
}

/*------------------------------------------------
                  
                    读数据

------------------------------------------------*/
void DS18B20_Read2Byte(void)
{
 uint i;
 for(i=0;i<16;i++) 
   Read_buf_8ch[i]= DS18B20_ReadDQ();  //16个字节的数据存进RB数组
}

/*------------------------------------------------
                 
                    温度转换
 
------------------------------------------------*/
void DS18B20_ReadTemp(void)
{   
DS18B20_Reset();        //初始化
DS18B20_WriteByte(0xcc); //跳过 ROM
DS18B20_WriteByte(0x44); //启动测温
    Delay_1us(10);
    DS18B20_Reset();        //初始化
    DS18B20_WriteByte(0xcc); //跳过 ROM
    DS18B20_WriteByte(0xbe); //送入读取数据命令
    DS18B20_Read2Byte();
}               //8个DS18B20器件的测温数据将保存在数组Read_buf_8ch的16个字节单元当中
  
  void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
  

   P0=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       P0=weima[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       P0=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
       
   i++;
       if(i==Num)
      i=0;


}
void main (void)
{                  
uint Temp,TempH=50,TempL=1;  //定的温度初值范围,可以进行修改
uchar TempFlag=0,t;//buff[16];
    uint uiData[8];// 8个DS18B20器件的测温数据将保存在数组uiData当中的8个单元里
    uchar Mask,i,j;  //OS the resoult of Temperature  
Init_Timer0();
UART_Init();
   while (1)          
   {   
     
     DS18B20_ReadTemp();           


     for(i=15;i>=0;i--)  //提取每个DS18B20的温度数据
     { 
  Mask = 0x01;
  for(j=0;j<8;j++)
  {
   uiData[j] = uiData[j]<<1;
   if(Read_buf_8ch[i]&Mask) uiData[j]++;  
   Mask = Mask<<1;     //uiData存的是每个DS18B20的温度值,uiData[1]为P1^0口
       }
     }
       if(i>=0&&i<=8)
            
             Temp=uiData[i];
             t=(Temp>>4)+(Temp<<4);
             t*=0.0625;
             TempData[0]=duma[t/10];
             TempData[0]=duma[t%10]; 
             i++;Temp=0;

[解决办法]
前两天有一个精华的贴子一个IO挂多个搞成功了的,你可以去请教一下那个LZ
[解决办法]
那个帖子?我怎么没搜索到啊?
[解决办法]

引用:
那个帖子?我怎么没搜索到啊?


不同型号的单片机带多个DS18B20

热点排行