单片机学习小组
直播中

朱志兴

7年用户 298经验值
私信 关注

请问为什么我用郭天祥书上18b20代码扩展成多一个点就不行了?

要做一个温度多点采集系统,用了郭天祥书上的例程(一个点采集),然后扩展成多个点就不行了。。。,高手帮忙看看
郭天祥代码:
#include    
#include    
#define  uchar unsigned char   
#define  uint  unsigned int   
***it ds=P2^2;     //温度传感器信号线   
***it dula=P2^6;   //数码管段选线   
***it wela=P2^7;   //数码管位选线   
***it beep=P2^2;   //蜂鸣器   
   
uint temp;   
float f_temp;   
uint warn_l1=260;   
uint warn_l2=250;   
uint warn_h1=300;   
uint warn_h2=320;   
   
***it led0=P1^0;   
***it led1=P1^1;   
***it led2=P1^2;   
***it led3=P1^3;   
   
unsigned char code table[]={   
0x3f,0x06,0x5b,0x4f,   
0x66,0x6d,0x7d,0x07,   
0x7f,0x6f,0xbf,0x86,   
0xdb,0xcf,0xe6,0xed,   
0xfd,0x87,0xff,0xef};     //不带小数点的编码   
   
void delay(uint z)//延时函数   
{   
    uint x,y;   
    for(x=z;x>0;x--)   
        for(y=110;y>0;y--);   
}   
   
   
   
void dsreset(void)    //18B20复位,初始化函数   
{   
  uint i;   
  ds=0;   
  i=103;   
  while(i>0)i--;   
  ds=1;   
  i=4;   
  while(i>0)i--;   
}   
   
bit tempreadbit(void)   //读1位函数   
{   
   uint i;   
   bit dat;   
   ds=0;i++;          //i++ 起延时作用   
   ds=1;i++;i++;   
   dat=ds;   
   i=8;while(i>0)i--;   
   return (dat);   
}   
   
uchar tempread(void)   //读1个字节   
{   
  uchar i,j,dat;   
  dat=0;   
  for(i=1;i<=8;i++)   
  {   
    j=tempreadbit();   
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里   
  }   
  return(dat);   
}   
   
void tempwritebyte(uchar dat)   //向18B20写一个字节数据   
{   
  uint i;   
  uchar j;   
  bit testb;   
  for(j=1;j<=8;j++)   
  {   
    testb=dat&0x01;   
    dat=dat>>1;   
    if(testb)     //写 1   
    {   
      ds=0;   
      i++;i++;   
      ds=1;   
      i=8;while(i>0)i--;   
    }   
    else   
    {   
      ds=0;       //写 0   
      i=8;while(i>0)i--;   
      ds=1;   
      i++;i++;   
    }   
   
  }   
}   
   
void tempchange(void)  //DS18B20 开始获取温度并转换   
{   
  dsreset();   
  delay(1);   
  tempwritebyte(0xcc);  // 写跳过读ROM指令   
  tempwritebyte(0x44);  // 写温度转换指令   
}   
   
uint get_temp()         //读取寄存器中存储的温度数据   
{   
  uchar a,b;   
   
  dsreset();   
  delay(1);   
  tempwritebyte(0xcc);   
  tempwritebyte(0xbe);   
  a=tempread();         //读低8位   
  b=tempread();         //读高8位   
  temp=b;   
  temp<<=8;            //两个字节组合为1个字   
  temp=temp|a;   
  f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°   
  temp=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5是四舍五入   
  f_temp=f_temp+0.05;   
  return temp;         //temp是整型   
}   
   
   
////////////////////显示程序//////////////////////////   
void display(uchar num,uchar dat)   
{   
  uchar i;   
  dula=0;   
  P0=table[dat];   
  dula=1;   
  dula=0;   
   
  wela=0;   
  i=0XFF;   
  i=i&(~((0X01)<<(num)));   
  P0=i;   
  wela=1;   
  wela=0;      
  delay(1);   
}   
   
void dis_temp(uint t)   
{   
  uchar i;   
  i=t/100;   
  display(0,i);   
  i=t%100/10;   
  display(1,i+10);   
  i=t%100%10;   
  display(2,i);   
}   
//////////////////////////////////////////////   
void warn(uint s,uchar led)   //蜂鸣器报警声音 ,s控制音调   
{   
    uchar i;i=s;   
    dula=0;   
    wela=0;   
   
    beep=0;   
    P1=~(led);   
    while(i--)   
    {   
      dis_temp(get_temp());   
    }      
    beep=1;   
    P1=0XFF;     
    i=s;     
     while(i--)   
    {   
      dis_temp(get_temp());   
    }     
}   
void deal(uint t)   
{   
  uchar i;   
  if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度   
    {   
       warn(40,0x01);   
         
    }   
  else if(t<=warn_l2)                   //小于25度   
    {   
       warn(10,0x03);   
    }   
  else if((t=warn_h1)) //小于32度大于30度   
    {   
       warn(40,0x04);   
    }   
  else if(t>=warn_h2)                   //大于32度   
    {   
       warn(10,0x0c);   
    }   
  else   
    {   
       i=40;   
       while(i--)   
       {   
        dis_temp(get_temp());   
       }   
    }   
}   
   
void init_com(void)   
{   
     TMOD = 0x20;   
     CON = 0x00;   
     SCON = 0x50;   
     TH1 = 0xFd;   
     TL1 = 0xFd;   
     TR1 = 1;   
}   
   
void comm(char *parr)            
{   
    do   
    {   
     SBUF = *parr++;                                                           //发送数据                             
     while(!ti);                                                               //等待发送完成标志为1   
     TI =0;                                                                    //标志清零   
    }while(*parr);                                                             //保持循环直到字符为''   
}   
   
void main()   
{   
  uchar buff[4],i;   
  dula=0;   
  wela=0;   
  init_com();   
  while(1)   
{      
      tempchange();   
      for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
      deal(temp);   
   
      sprintf(buff,"%f",f_temp);   
   
    for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
   
      comm(buff);   
   
     for(i=10;i>0;i--)   
     {   
      dis_temp(get_temp());}   
      
}   
}   
我的代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
***it ds=P2^2;
***it ds0=P1^4;
***it ds1=P3^4;
uint temp;
float f_temp;
uchar code gtable[]="n";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(uchar k)
{
uint i;
switch(k)
{
case 1:
ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;
break;
case 2:
ds0=0;i=103;while(i>0)i--;ds0=1;i=4;while(i>0)i--;
break;
case 3:
ds1=0;i=103;while(i>0)i--;ds1=1;i=4;while(i>0)i--;
break;
}
}
bit tempreadbit(uchar k)
{
uint i;
bit dat;
switch(k)
{
case 1:
ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);
break;
case 2:
ds0=0;i++;ds0=1;i++;i++;dat=ds0;i=8;while(i>0)i--;return(dat);
break;
case 3:
ds1=0;i++;ds1=1;i++;i++;dat=ds1;i=8;while(i>0)i--;return(dat);
break;
}
}
uchar tempread(uchar k)      
{   
  uchar i,j,dat;
  dat=0;   
  switch(k)
  {
  case 1:
for(i=1;i<=8;i++)   
{   
   j=tempreadbit(1);   
   dat=(j<<7)|(dat>>1);   
}   
return(dat);
break;
    case 2:
for(i=1;i<=8;i++)   
{   
   j=tempreadbit(2);   
   dat=(j<<7)|(dat>>1);   
}   
return(dat);
break;
case 3:
for(i=1;i<=8;i++)   
{   
   j=tempreadbit(3);   
   dat=(j<<7)|(dat>>1);   
}   
return(dat);
break;
  }   
}
void tempwritebyte(uchar k,uchar dat)
{
uint i;
uchar j;
bit testb;
switch(k)
{
case 1:
for(j=1;j<=8;j++)   
{   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)      
   {   
     ds=0;   
     i++;i++;   
     ds=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds=0;         
     i=8;while(i>0)i--;   
     ds=1;   
     i++;i++;   
   }   
  }
  break;
case 2:
for(j=1;j<=8;j++)   
{   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)      
   {   
     ds0=0;   
     i++;i++;   
     ds0=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds0=0;         
     i=8;while(i>0)i--;   
     ds0=1;   
     i++;i++;   
   }   
  }
  break;
case 3:
for(j=1;j<=8;j++)   
{   
   testb=dat&0x01;   
   dat=dat>>1;   
   if(testb)      
   {   
     ds1=0;   
     i++;i++;   
     ds=1;   
     i=8;while(i>0)i--;   
   }   
   else   
   {   
     ds1=0;         
     i=8;while(i>0)i--;   
     ds1=1;   
     i++;i++;   
   }   
  }
  break;     
}
}
void tempchange(uchar k)
{
switch(k)
{
case 1:
dsreset(1);delay(1);tempwritebyte(1,0xcc);tempwritebyte(1,0x44);
break;
case 2:
dsreset(2);delay(1);tempwritebyte(2,0xcc);tempwritebyte(2,0x44);
break;
case 3:
dsreset(3);delay(1);tempwritebyte(3,0xcc);tempwritebyte(3,0x44);
break;
}
}
uint get_temp(uchar k)
{
uchar a,b;
switch(k)
{
case 1:
dsreset(1);   
delay(1);   
tempwritebyte(1,0xcc);   
tempwritebyte(1,0xbe);   
a=tempread(1);            
b=tempread(1);         
temp=b;   
temp<<=8;            
temp=temp|a;   
f_temp=temp*0.0625;      
temp=f_temp*10+0.5;     
f_temp=f_temp+0.05;   
return temp;  
break;
case 2:
dsreset(2);   
delay(1);   
tempwritebyte(2,0xcc);   
tempwritebyte(2,0xbe);   
a=tempread(2);            
b=tempread(2);         
temp=b;   
temp<<=8;            
temp=temp|a;   
f_temp=temp*0.0625;      
temp=f_temp*10+0.5;     
f_temp=f_temp+0.05;   
return temp;  
break;
case 3:
dsreset(3);   
delay(1);   
tempwritebyte(3,0xcc);   
tempwritebyte(3,0xbe);   
a=tempread(3);            
b=tempread(3);         
temp=b;   
temp<<=8;            
temp=temp|a;   
f_temp=temp*0.0625;      
temp=f_temp*10+0.5;     
f_temp=f_temp+0.05;   
return temp;  
break;         
}
return temp;
}  
void init_com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
void comm(char *parr)
{
do
{
SBUF=*parr++;
while(!TI);
TI=0;
}
while(*parr);
//SBUF=gtable[0];
}
void main()
{
uchar buff[4],i;
uint tt=0;
init_com();
while(1)
{
   
      tempchange(1);
delay(10);   
get_temp(1);
sprintf(buff,"%f",f_temp);
delay(10);     
      comm(buff);
delay(10);

tempchange(2);
delay(10);   
      get_temp(2);
sprintf(buff,"%f",f_temp);
delay(10);   
      comm(buff);
delay(10);

tempchange(3);
delay(10);   
      get_temp(3);
sprintf(buff,"%f",f_temp);
delay(10);   
      comm(buff);
delay(10);  
   
    }
}
  

回帖(1)

李萍

2019-7-29 09:46:40
代码跑之后的提示 是怎样的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分