搜索
bottom↓
回复: 14

请教多个IO口接多个DS18B20的程序问题。

[复制链接]

出0入0汤圆

发表于 2010-4-2 16:54:07 | 显示全部楼层 |阅读模式
我开始用单片机的P1.0口接了一个DS18B20,用单片机读出然后用数码管显示出来,都很正常,部分程序代码如下。(部分省略没写出来)
#include<intrins.h>
........
......
sbit DQ=P1^0;
......

void reset()
{  do{
       DQ=0;
       time500();//  延时500微妙程序
       DQ=1;
       time60();//延时60微妙程序
      }
     while(DQ!=DQ);
     DQ=1;


}
..........
....
  省略其他程序...
.....
uchar  readtemp(void)
{
   reset();
   time500();
   writebyte(0xCC);
   writebyte(0x44);
   rest();
  time500();
  writebyte(0xCC);
  writebyte(0xBE);
  c[1]=readbyte();
  c[0]=readbyte();
return (c[2]);
}
实验完全正确,能准确读出温度并显示,但当我在做如下修改时就不行了
sbit temp1=P1^0;
sbit temp2=P1^1;
....
main()
{
   DQ=temp;
  readtemp();
  ......

}

这样修改后就不能读出温度了,请各位大虾指教指教如何修改。难道每多加一个DS18B20就要多重复写一遍代码?(不采用一个IO口挂多个DS18B20的方式)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-4-2 16:56:38 | 显示全部楼层
是 main()
{

    DQ=temp1;
     readtemp();
}

出0入0汤圆

 楼主| 发表于 2010-4-3 09:11:30 | 显示全部楼层
请会的朋友指教一下!

出0入0汤圆

 楼主| 发表于 2010-4-6 09:45:10 | 显示全部楼层
没人会么?

出0入0汤圆

 楼主| 发表于 2010-4-6 10:57:23 | 显示全部楼层
是这个问题太难,目前没有人知道还是太简单大家都不屑一回啊?

出0入0汤圆

 楼主| 发表于 2010-4-13 17:26:14 | 显示全部楼层
再次请教各位大侠!

出0入0汤圆

发表于 2010-4-13 18:04:00 | 显示全部楼层
你 Reset函数里面有没有改DQ

出0入0汤圆

 楼主| 发表于 2010-4-14 08:59:33 | 显示全部楼层
没有  就是不想改 想采用用调用函数的方法  结果是不行  看来只能老老实实的把每步都再写一遍了

出0入0汤圆

发表于 2010-4-15 16:22:30 | 显示全部楼层
回复【1楼】lmly
-----------------------------------------------------------------------

sbit temp1=P1^0;
sbit temp2=P1^1;

bit DQ;//这个应该是全局变量

void main(void)
{
   DQ=temp1; //或者DQ=temp2;
  readtemp();

}

出0入0汤圆

 楼主| 发表于 2010-4-20 11:34:29 | 显示全部楼层
程序修改了下,实验通过  P1口前5位分别接5个DS18B20

  /******************延时20us********************/
void time20(void)
{      
        unsigned char a,b;
        for(b=1;b>0;b--)
        for(a=16;a>0;a--);
}
  /******************延时60us********************/
void time60(void)
{      
        unsigned char a,b;
        for(b=1;b>0;b--)
        for(a=48;a>0;a--);
}

/****************延时500us********************/
void time500(void)
{
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=142;b>0;b--)
        for(a=2;a>0;a--);
}


/*****************复位和等待应答************/
void reset(void)
{                 
        
        do
             {     
                                    xsf=0;
                         P1=(P1|0x1F)&0xE0;                  //前五位写0
                             time500();
                             P1=P1|0x1F;                         //前五位写1
                             time60();
                            // time20();
                            // time20();
                                // time20();
                                 _nop_();
                                 _nop_();
                                 _nop_();
                                 _nop_();
                               
             }while(bust&fdjt&hrt&fst&lnt);
              gx=(P1&0x1F)|(gx&0xE0);  //gx=0正常,否则有故障
                   P1=P1|0x1F;                                                 //前五位写1
                        xsf=1;
                 
                  

}
/********************读一字节数据********************/
void readbyte(void)
{
         uchar i;
         if(p==0)
         {
              for(i=0;i<8;i++)
              {                 
                        
                                  P1=P1|0x1F;
                          
                                  _nop_();
                                  P1=(P1|0x1F)&0xE0;
                           _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                           
                                   P1=P1|0x1F;
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                                  
                                   a=P1;
                           time60();
                        
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
              }
                        }
                        else
                        for(i=0;i<8;i++)
              {                 
                        
                                  P1=P1|0x1F;
                          
                                  _nop_();
                                  P1=(P1|0x1F)&0xE0;
                           _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                           
                                   P1=P1|0x1F;
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                                  
                                   b=P1;
                           time60();
                        
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
              }
             
}

/**************************写一位******************/
void write(uchar tt )
{
    if(tt==1)     //***写1*/
         {          
                  
                  P1=(P1|0x1F)&0xE0;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
          _nop_();
             
                  P1=P1|0x1F;
                  time60();
                 
              time20();
               
                  P1=P1|0x1F;
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
                  _nop_();
                  _nop_();
          _nop_();
          _nop_();
         }
         else                                        //***写0****//
         {       
                  
                        P1=(P1|0x1F)&0xE0;
                    time60();
                    
                        time20();
                  
                        P1=P1|0x1F;
            _nop_();
                        _nop_();
            _nop_();
            _nop_();
                    _nop_();
                        _nop_();
            _nop_();
            _nop_();
     }

}


/*****************写一字节数据***********************/
void writebyte(uchar comd)
{
        uchar temp1;
             char i;
             for(i=0;i<8;i++)
             {       
                        temp1=comd&0x01;
                        write(temp1);
                    comd>>=1;

             }

}


/***************读温度********************/
void readtemp(void)
{     //  EA=0;
     
          
                        p=0;
        
                 reset();
                 time500();
                 writebyte(0xCC); //跳过读DS18B20序列号
             writebyte(0x44); //启动温度转换
             reset();                  
             time500();
             writebyte(0xCC);
             writebyte(0xBE);  //读取温度寄存器
       
                 readbyte();  //读温度低字节
                 p=1;
            readbyte();  //读温度高字节
               
        t[0]=(a[4]&1)|((a[5]&1)<<1)|((a[6]&1)<<2)|((a[7]&1)<<3)|((b[0]&1)<<4)|((b[1]&1)<<5)|((b[2]&1)<<6);
   t[1]=((a[4]&2)>>1)|(a[5]&2)|((a[6]&2)<<1)|((a[7]&2)<<2)|((b[0]&2)<<3)|((b[1]&2)<<4)|((b[2]&2)<<5);
        t[2]=((a[4]&4)>>2)|((a[5]&4)>>1)|(a[6]&4)|((a[7]&4)<<1)|((b[0]&4)<<2)|((b[1]&4)<<3)|((b[2]&4)<<4);
   t[3]=((a[4]&8)>>3)|((a[5]&8)>>2)|((a[6]&8)>>1)|(a[7]&8)|((b[0]&8)<<1)|((b[1]&8)<<2)|((b[2]&8)<<3);
   t[4]=((a[4]&16)>>4)|((a[5]&16)>>3)|((a[6]&16)>>2)|((a[7]&16)>>1)|(b[0]&16)|((b[1]&16)<<1)|((b[2]&16)<<5);
}

出0入0汤圆

 楼主| 发表于 2010-4-20 11:41:07 | 显示全部楼层
sbit bust=P1^0 ;   
sbit fdjt=P1^1 ;   
sbit hrt=P1^2 ;      
sbit fst=P1^3 ;     
sbit lnt=P1^4 ;

出0入0汤圆

发表于 2010-9-9 13:39:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-9 18:51:25 | 显示全部楼层
谢谢,正好是我想要的

出0入0汤圆

发表于 2013-4-19 08:43:53 | 显示全部楼层
mark,多IO口接多个18b20
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表