搜索
bottom↓
回复: 40

[要求变酷]共享我的DS18B20的读写函数。使用IAR+MEGA168+DS18B20

[复制链接]

出0入0汤圆

发表于 2006-4-9 09:27:56 | 显示全部楼层 |阅读模式
共享我的DS18B20的读写函数。

1、可以直接粘贴使用。

2、如果和我的环境不一样,需要修改一下#define部分。

3、延时函数自己做。

4、可以用9位,10位,11位和12位操作。

5、只有在切换位数精度时才需要调用void temp_init(void)函数。只调用一次即可,重新上电后将使用上一次的配置,也就是调用这个函数后配置会自动保存的。在此建议把这个函数放在程序的最最开始处,也就是初始化处。

6、现在我默认使用的是10位精度,精度是0.25度应该可以,并且时间也短。

7、其他精度的程序都被我屏蔽了,如果有需要可以把10位的屏蔽,把需要的程序取消屏蔽即可。

8、如果程序空间允许或使用可变精度,要把所有屏蔽掉的程序都取消屏蔽,稍微修改一下,然后再自己的程序里去判断调用。







#define uchar unsigned char

#define uint unsigned int

#define BIT(X)        (1<<(X))

#define SETBIT(ADDRESS,X)    ADDRESS |= (1<<X )

#define CLEARBIT(ADDRESS,X)  ADDRESS &= ~(1<<X )

#define TESTBIT(ADDRESS,X)   ADDRESS &  (1<<X )

#define PORTTEMP PORTC

#define DDRTEMP  DDRC

#define PINTEMP  PINC

#define TEMP     4







/*

//以下是默认9位的温度精度

void temp_init(void)

{



        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        writeucharDS18B20(0x1f);

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);

}



uchar resetDS18B20(void)

{

        uchar errTime=0;

        SETBIT(DDRTEMP,TEMP);                //Maga16控制总线

        CLEARBIT(PORTTEMP,TEMP);        //强制拉低

        delay_nus(600);                 //以上的三个延时大于480us

        CLEARBIT(DDRTEMP,TEMP);                //释放总线,总线自动上拉

        delay_nus(8);               

        while(TESTBIT(PINTEMP,TEMP))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>20)

                return(0x00);                //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)

        }

        errTime=0;

        while(!(TESTBIT(PINTEMP,TEMP)))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>50)

                return(0x00);                //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

        }

        return(0xff);

}







uchar readucharDS18B20(void)

{

        uchar i;

        uchar retVal=0;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=8;i>0;i--)

        {

                 retVal>>=1;

                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_4us();                //延时大于1us       

                CLEARBIT(DDRTEMP,TEMP);        //释放总线,DS18B20会将总线强制拉低

                delay_4us();

                if(TESTBIT(PINTEMP,TEMP))retVal|=0x80;

                delay_nus(50);                 //14.92us

        }

        delay_2us();                         //2.71us(大于1us就行了)

        return(retVal);

}







void writeucharDS18B20(uchar wb)

{

        uchar i;

        uchar temp;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=0;i<8;i++)

        {



                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_nus(4);

                temp=wb>>i;

                temp&=0x01;

                if(temp==0x01)CLEARBIT(DDRTEMP,TEMP);//释放总线

                delay_nus(50);

                CLEARBIT(DDRTEMP,TEMP);        //释放总线

                delay_2us();                 //(大于1us就行了)

        }

}







uint readTempDS18B20(void)

{

        uchar tempL=0,tempH=0;

        uint x;



        resetDS18B20();

        writeucharDS18B20(0xcc);         //跳过ROM

        writeucharDS18B20(0x44);        //启动温度转换

        delay_nms(100);                 //100ms

        resetDS18B20();

        writeucharDS18B20(0xcc);        //跳过ROM

        writeucharDS18B20(0xbe);        //读数据

        tempL=readucharDS18B20();

        tempH=readucharDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}



*/





//以下是默认10位的温度精度

void temp_init(void)

{



        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        writeucharDS18B20(0x3f);

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);

}



uchar resetDS18B20(void)

{

        uchar errTime=0;

        SETBIT(DDRTEMP,TEMP);                //Maga16控制总线

        CLEARBIT(PORTTEMP,TEMP);        //强制拉低

        delay_nus(600);                 //以上的三个延时大于480us

        CLEARBIT(DDRTEMP,TEMP);                //释放总线,总线自动上拉

        delay_nus(8);               

        while(TESTBIT(PINTEMP,TEMP))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>20)

                return(0x00);                //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)

        }

        errTime=0;

        while(!(TESTBIT(PINTEMP,TEMP)))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>50)

                return(0x00);                //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

        }

        return(0xff);

}







uchar readucharDS18B20(void)

{

        uchar i;

        uchar retVal=0;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=8;i>0;i--)

        {

                 retVal>>=1;

                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_4us();                //延时大于1us       

                CLEARBIT(DDRTEMP,TEMP);        //释放总线,DS18B20会将总线强制拉低

                delay_4us();

                if(TESTBIT(PINTEMP,TEMP))retVal|=0x80;

                delay_nus(50);                 //14.92us

        }

        delay_2us();                         //2.71us(大于1us就行了)

        return(retVal);

}







void writeucharDS18B20(uchar wb)

{

        uchar i;

        uchar temp;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=0;i<8;i++)

        {



                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_nus(4);

                temp=wb>>i;

                temp&=0x01;

                if(temp==0x01)CLEARBIT(DDRTEMP,TEMP);//释放总线

                delay_nus(50);

                CLEARBIT(DDRTEMP,TEMP);        //释放总线

                delay_2us();                 //(大于1us就行了)

        }

}







uint readTempDS18B20(void)

{

        uchar tempL=0,tempH=0;

        uint x;



        resetDS18B20();

        writeucharDS18B20(0xcc);         //跳过ROM

        writeucharDS18B20(0x44);        //启动温度转换

        delay_nms(200);                 //200ms

        resetDS18B20();

        writeucharDS18B20(0xcc);        //跳过ROM

        writeucharDS18B20(0xbe);        //读数据

        tempL=readucharDS18B20();

        tempH=readucharDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}













/*

//以下是默认11位的温度精度

void temp_init(void)

{



        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        writeucharDS18B20(0x5f);

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);

}



uchar resetDS18B20(void)

{

        uchar errTime=0;

        SETBIT(DDRTEMP,TEMP);                //Maga16控制总线

        CLEARBIT(PORTTEMP,TEMP);        //强制拉低

        delay_nus(600);                 //以上的三个延时大于480us

        CLEARBIT(DDRTEMP,TEMP);                //释放总线,总线自动上拉

        delay_nus(8);               

        while(TESTBIT(PINTEMP,TEMP))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>20)

                return(0x00);                //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)

        }

        errTime=0;

        while(!(TESTBIT(PINTEMP,TEMP)))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>50)

                return(0x00);                //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

        }

        return(0xff);

}







uchar readucharDS18B20(void)

{

        uchar i;

        uchar retVal=0;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=8;i>0;i--)

        {

                 retVal>>=1;

                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_4us();                //延时大于1us       

                CLEARBIT(DDRTEMP,TEMP);        //释放总线,DS18B20会将总线强制拉低

                delay_4us();

                if(TESTBIT(PINTEMP,TEMP))retVal|=0x80;

                delay_nus(50);                 //14.92us

        }

        delay_2us();                         //2.71us(大于1us就行了)

        return(retVal);

}







void writeucharDS18B20(uchar wb)

{

        uchar i;

        uchar temp;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=0;i<8;i++)

        {



                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_nus(4);

                temp=wb>>i;

                temp&=0x01;

                if(temp==0x01)CLEARBIT(DDRTEMP,TEMP);//释放总线

                delay_nus(50);

                CLEARBIT(DDRTEMP,TEMP);        //释放总线

                delay_2us();                 //(大于1us就行了)

        }

}







uint readTempDS18B20(void)

{

        uchar tempL=0,tempH=0;

        uint x;



        resetDS18B20();

        writeucharDS18B20(0xcc);         //跳过ROM

        writeucharDS18B20(0x44);        //启动温度转换

        delay_nms(400);                 //400ms

        resetDS18B20();

        writeucharDS18B20(0xcc);        //跳过ROM

        writeucharDS18B20(0xbe);        //读数据

        tempL=readucharDS18B20();

        tempH=readucharDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}



*/













/*

//以下是默认12位的温度精度



void temp_init(void)

{

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        writeucharDS18B20(0x7f);

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);

}



uchar resetDS18B20(void)

{

        uchar errTime=0;

        SETBIT(DDRTEMP,TEMP);                //Maga16控制总线

        CLEARBIT(PORTTEMP,TEMP);        //强制拉低

        delay_nus(600);                 //以上的三个延时大于480us

        CLEARBIT(DDRTEMP,TEMP);                //释放总线,总线自动上拉

        delay_nus(8);               

        while(TESTBIT(PINTEMP,TEMP))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>20)

                return(0x00);                //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)

        }

        errTime=0;

        while(!(TESTBIT(PINTEMP,TEMP)))       

        {

                delay_nus(4);                 //5.15us

                errTime++;

                if(errTime>50)

                return(0x00);                //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

        }

        return(0xff);

}







uchar readucharDS18B20(void)

{

        uchar i;

        uchar retVal=0;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=8;i>0;i--)

        {

                 retVal>>=1;

                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_4us();                //延时大于1us       

                CLEARBIT(DDRTEMP,TEMP);        //释放总线,DS18B20会将总线强制拉低

                delay_4us();

                if(TESTBIT(PINTEMP,TEMP))retVal|=0x80;

                delay_nus(50);                 //14.92us

        }

        delay_2us();                         //2.71us(大于1us就行了)

        return(retVal);

}







void writeucharDS18B20(uchar wb)

{

        uchar i;

        uchar temp;

        CLEARBIT(DDRTEMP,TEMP);                //释放总线

        for(i=0;i<8;i++)

        {



                SETBIT(DDRTEMP,TEMP);        //Maga16控制总线

                CLEARBIT(PORTTEMP,TEMP);//强制拉低

                delay_nus(4);

                temp=wb>>i;

                temp&=0x01;

                if(temp==0x01)CLEARBIT(DDRTEMP,TEMP);//释放总线

                delay_nus(50);

                CLEARBIT(DDRTEMP,TEMP);        //释放总线

                delay_2us();                 //(大于1us就行了)

        }

}







uint readTempDS18B20(void)

{

        uchar tempL=0,tempH=0;

        uint x;



        resetDS18B20();

        writeucharDS18B20(0xcc);         //跳过ROM

        writeucharDS18B20(0x44);        //启动温度转换

        delay_nms(800);                 //800ms

        resetDS18B20();

        writeucharDS18B20(0xcc);        //跳过ROM

        writeucharDS18B20(0xbe);        //读数据

        tempL=readucharDS18B20();

        tempH=readucharDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}



*/

出0入0汤圆

发表于 2006-4-9 11:27:32 | 显示全部楼层
我支持你的要求。

出0入0汤圆

发表于 2006-4-10 08:04:12 | 显示全部楼层
估计你没有做成实际电路,要不你传上电路,还有实际运行的实物图,这样变酷的可能大些He...

出0入0汤圆

发表于 2006-4-10 08:18:56 | 显示全部楼层
资料齐,变酷快。

出0入0汤圆

 楼主| 发表于 2006-4-10 08:50:30 | 显示全部楼层
哦,那只能明天了。晚上回家照相。



18B20只有三个脚,连接那么简单,还用什么电路呢?



这个程序就是我目前用的程序呀,我用串口发送得到的数据,一种方式是等得到256个数据一起发送,在我的串口波形显示的软件上显示温度曲线,一种方式是把实时得到的温度发送到串口波形显示的软件上直接显示,这样的好处是当用高温或低温接触18B20时可以直接看到变化结果。呵呵!现在9、10、11、12位均正常工作哦。

出0入0汤圆

发表于 2006-4-10 09:16:59 | 显示全部楼层
对呀,这样变酷真的会容易一些,因为这样就可以当作范例了。

出0入0汤圆

发表于 2006-4-10 09:36:42 | 显示全部楼层
支持楼主共享精神,顺便留一标记

出0入0汤圆

 楼主| 发表于 2006-4-10 09:42:03 | 显示全部楼层
其实这个程序里的9、10、11、12位精度各段程序只有两点不同,一个是初始化时:

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        writeucharDS18B20(0x7f); //修改此处改精度

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);



一个是uint readTempDS18B20(void) 里那个延时,9位是100ms,10位是200ms,11位是400ms,12位是800ms而已。

所以可以很容易更改用一个程序

出0入0汤圆

 楼主| 发表于 2006-4-10 09:50:16 | 显示全部楼层
要不我就顺带给改了吧,通过更改jingdu来改变用几位精度,但每次该精度都必须调用初始化,初始化一次即可.







#define uchar unsigned char

#define uint unsigned int

#define BIT(X)   (1<<(X))

#define SETBIT(ADDRESS,X)    ADDRESS |= (1<<X )

#define CLEARBIT(ADDRESS,X)  ADDRESS &= ~(1<<X )

#define TESTBIT(ADDRESS,X)   ADDRESS &  (1<<X )

#define PORTTEMP PORTC   //用那个端口

#define DDRTEMP  DDRC  //用那个端口

#define PINTEMP  PINC  //用那个端口

#define TEMP     4    //用那个管脚



extern uchar jingdu;



void temp_init(void)

{



        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x4e);

        writeucharDS18B20(0x88);

        writeucharDS18B20(0x44);

        switch(jingdu)

        {

          case 9:  writeucharDS18B20(0x1f);

          case 10: writeucharDS18B20(0x3f);

          case 11: writeucharDS18B20(0x5f);

          case 12: writeucharDS18B20(0x7f);

          default: writeucharDS18B20(0x7f);

         }

        resetDS18B20();

        delay_nms(500);

        resetDS18B20();

        writeucharDS18B20(0xcc);

        writeucharDS18B20(0x48);

}



uchar resetDS18B20(void)

{

   uchar errTime=0;

        SETBIT(DDRTEMP,TEMP);      //Maga16控制总线

   CLEARBIT(PORTTEMP,TEMP);   //强制拉低

   delay_nus(600);            //以上的三个延时大于480us

   CLEARBIT(DDRTEMP,TEMP);      //释放总线,总线自动上拉

   delay_nus(8);      

   while(TESTBIT(PINTEMP,TEMP))   

   {

      delay_nus(4);       //5.15us

      errTime++;

      if(errTime>20)

      return(0x00);      //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)

   }

   errTime=0;

   while(!(TESTBIT(PINTEMP,TEMP)))   

   {

      delay_nus(4);       //5.15us

      errTime++;

      if(errTime>50)

      return(0x00);      //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

   }

   return(0xff);

}







uchar readucharDS18B20(void)

{

   uchar i;

   uchar retVal=0;

   CLEARBIT(DDRTEMP,TEMP);      //释放总线

   for(i=8;i>0;i--)

   {

       retVal>>=1;

           SETBIT(DDRTEMP,TEMP);   //Maga16控制总线

      CLEARBIT(PORTTEMP,TEMP);//强制拉低

      delay_4us();      //延时大于1us   

      CLEARBIT(DDRTEMP,TEMP);   //释放总线,DS18B20会将总线强制拉低

      delay_4us();

      if(TESTBIT(PINTEMP,TEMP))retVal|=0x80;

      delay_nus(50);       //14.92us

   }

   delay_2us();          //2.71us(大于1us就行了)

   return(retVal);

}







void writeucharDS18B20(uchar wb)

{

   uchar i;

   uchar temp;

   CLEARBIT(DDRTEMP,TEMP);      //释放总线

   for(i=0;i<8;i++)

   {



                SETBIT(DDRTEMP,TEMP);   //Maga16控制总线

      CLEARBIT(PORTTEMP,TEMP);//强制拉低

      delay_nus(4);

      temp=wb>>i;

      temp&=0x01;

      if(temp==0x01)CLEARBIT(DDRTEMP,TEMP);//释放总线

                delay_nus(50);

      CLEARBIT(DDRTEMP,TEMP);   //释放总线

      delay_2us();       //(大于1us就行了)

        }

}







uint readTempDS18B20(void)

{

   uchar tempL=0,tempH=0;

   uint x;



        resetDS18B20();

        writeucharDS18B20(0xcc);    //跳过ROM

        writeucharDS18B20(0x44);   //启动温度转换

       switch(jingdu)   

        {

         case 9: delay_nms(100);break;    //100ms

         case 10: delay_nms(200);break;   //200ms

         case 11: delay_nms(400);break;   //400ms

         case 12: delay_nms(800);break;   //800ms

         default: delay_nms(800);break;   //800ms

        }

      resetDS18B20();

      writeucharDS18B20(0xcc);   //跳过ROM

        writeucharDS18B20(0xbe);   //读数据

        tempL=readucharDS18B20();

   tempH=readucharDS18B20();

   x=(tempH<<8)|tempL;

   return(x);

}

出0入0汤圆

发表于 2006-4-10 12:05:35 | 显示全部楼层
不错!学习ING

出0入0汤圆

发表于 2006-4-10 22:19:46 | 显示全部楼层
谢谢hankw,辛苦,辛苦。

出0入0汤圆

发表于 2006-4-11 08:53:37 | 显示全部楼层
多谢楼主

出0入0汤圆

 楼主| 发表于 2006-4-11 09:13:34 | 显示全部楼层
上些图片看看。











出0入0汤圆

 楼主| 发表于 2006-4-11 09:20:23 | 显示全部楼层
大家注意看看我用的万用电源转换板,在我以前的帖子里出现过高精度高清晰的图片,质量不错哦,可以提供多种功能,现在我用的就是USB取电给整套系统供电,也用的是USB和我的仿真板通讯。当然USB是用FT232BM转的,具体搜索一下我发表的以前的相干帖子。

出0入0汤圆

发表于 2006-4-11 09:21:55 | 显示全部楼层
楼主也有Butterfly?也是申请的呀?



你的开发工具还真不少呀。羡慕ing。

出0入0汤圆

 楼主| 发表于 2006-4-11 09:39:35 | 显示全部楼层
我的butterfly是参加ATMEL研讨会得到的。

出0入0汤圆

 楼主| 发表于 2006-4-17 13:50:43 | 显示全部楼层
问一个问题,看谁能知道。



我上面贴出的程序在MEGA16上工作非常正常,不管是几位都工作很好,可我昨天移植到MEGA8上了,18B20的复位怎么也不成功,读出当然都是FFFF了,真不知道问题出在哪里。



总共就三个管脚,一个地,一个电源,一个IO,一个4.7K的上拉电阻,我用了MEGA8的27、28脚即PC4和PC5试验,都不行。后来干脆我不用18B20 的程序,而是直接控制管脚为低和高来检查,发现为高的时候可以,但我把IO拉低时电压还是5V,看来问题就出在这里,所以复位不能成功。



那位什么我拉低IO口电压还高呢?只要我把该IO和18B20断开就能正常控制为高和低了。问题也就是出在这个18B20上,所以我又把我原来在MEGA16上运行正常的18B20换过来,可症状依旧,还是不能拉低。究竟是为什么呢?为什么复位就是不能成功呢?

出0入0汤圆

 楼主| 发表于 2006-4-18 12:52:34 | 显示全部楼层
顶上来吧。

出0入0汤圆

发表于 2006-4-18 12:58:36 | 显示全部楼层
难道是IO口坏了,有没有换别的IO口试试,换另外的M8试试呢?还有就是有没有注意IO的状态呢?

出0入0汤圆

 楼主| 发表于 2006-4-18 13:26:40 | 显示全部楼层
我就换了PC4和PC5两个IO口来试验。



我也很郁闷。在MEGA16上程序和18B20 都很正常,原封不动挪过来就不行。



MEGA8和MEGA16一样,都设置的内部8M。

出0入0汤圆

发表于 2006-4-18 13:53:47 | 显示全部楼层
sfr初始化是不是有不同之处?M8和M16引脚不兼容的。

出0入0汤圆

发表于 2006-4-18 14:35:13 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2006-4-18 14:37:27 | 显示全部楼层
呵呵,管脚不兼容,熔丝位不一样,这我当然知道了,翻看了好几遍资料了已经。

出0入0汤圆

 楼主| 发表于 2006-4-19 09:08:27 | 显示全部楼层
呵呵,18楼的提醒很对亚,巧的是我只试验了PC4和PC5,所以还是有问题,昨天我试验了PC3 就没问题了,后来才发现PC4和PC5是IIC用到的SDA和SCL,我虽然没有用到IIC,但把TWI开启了,所以导致复位不了18B20。





问题解决了,大家也要多注意呀,只要有问题肯定是自己的毛病的哦 。仔细检查吧。

出0入0汤圆

发表于 2006-4-28 15:16:10 | 显示全部楼层
我做的也是用的m8,初始化程序经过测试了没有问题,能检测到da18b20的存在,但是读出来的温度值也是FFFF....

用的是PC0,目前还查不出哪里出了问题

出0入0汤圆

 楼主| 发表于 2006-4-28 16:56:51 | 显示全部楼层
县确定温度为数正确,

然后问题多出在复位子程序上,自己稍微调整一下中间的延时,肯定能解决。



因为每个芯片都可能有些小区别,还跟使用环境、设置参数有关,所以这个延时可能有偏差的。

出0入0汤圆

发表于 2006-5-17 09:21:09 | 显示全部楼层
void temp_init(void)

小声点问一下,temp_init()中resetDS18B20();函数这么用是什么意思呢?

它不是太返回值吗?

忘大侠解答。

出0入0汤圆

 楼主| 发表于 2006-5-17 15:32:23 | 显示全部楼层
其实返回值可以不去考虑的,我打部分都没管它的。



用resetDS18B20(),实际上就是建立通讯而已。然后才能对它操作 。

出0入0汤圆

发表于 2006-5-17 17:15:38 | 显示全部楼层
明白了,谢谢!

出0入0汤圆

发表于 2006-5-20 08:40:44 | 显示全部楼层
真是晕了

不知是我的DS18B20坏了还是怎么的,如果我把复位失败那个地方的反回值取掉用WHILE(1);代替的话,程序是停在那里转了。说明我的DS18B20根本没动作,感觉它像死的一样。V如果不改楼主的程序,读出来的,就是65535。加了外部上接。所以可以肯定我的DS18B20根本没有启动。

   是不是我的延时有问题呢?自己写了个不行,最后改用WINAVR自带的,也还是没反应。

楼主可以把你的延时贴出来让我试下到底是我的器件问题还是怎么的吗?我用的是4M晶振。

M16用PA。7应该没有问题吧?看了DATASHEET,好像它就只有用作AD和IO口了,没别的功能在上面了。

出0入0汤圆

 楼主| 发表于 2006-5-21 09:55:32 | 显示全部楼层
当初我用在TWI的端口上,虽然我没用TWI,但我初始化时初始化了,所以一直没反应。我说这个意思就是你先检查一下看程序有没有用到这个管脚,或者程序没用但初始化时设置了的。





延时是个很头疼的问题,同样的延时如while(i--);在不同的编译器编译出来延时时间绝对不一样,所以我的延时没有贴,要自己去把握,我在程序里大概写了延时多长时间的,你要自己按照你的程序和编译器去修正,确认你的delay_nus(10)是10us,而delay_nms(10)是10ms,还有就是适当修改延时时间,我觉得和你编译环境,硬件环境,设置参数等都有关系。





可以肯定的是,如果是好的DS18B20,我上面的程序绝对可以,只是要适当修改延时,告诉你一个简单的方法,我当时就是这样调试的。在复位成功的地方做个标志或设置断点,修改延时的数值,看在多少时能复位成功。

出0入0汤圆

发表于 2006-5-21 10:39:18 | 显示全部楼层
多谢楼上。呵呵,人懒,原想偷懒过去,呵呵,看来不行了。

好的,我再调调延时。延时这东西确实头痛。我又没仿真机,全靠一颗LED才判断出它复位没成功。

晚上弄到STDUIO上看看能否调出来。

出0入0汤圆

发表于 2006-5-22 18:22:28 | 显示全部楼层
我用M8加载上述程序却一直不会初始化,读出都是0000,不知道大家遇到过这种情况没有

出0入0汤圆

发表于 2006-5-22 18:39:11 | 显示全部楼层
加上拉了没有?我的也是初始化不行,精确延时,难得弄。打算用定时器来控制!

出0入0汤圆

发表于 2006-5-22 22:59:10 | 显示全部楼层
加了上拉,输出为FFFF,而且初始化也不行!

出0入0汤圆

发表于 2006-5-22 23:13:33 | 显示全部楼层
改了改,虽然初始化顺利啦,但是温度一直是29、5度比实际温度计读到的数值要高一些不知道怎么办??

出0入0汤圆

 楼主| 发表于 2006-5-24 14:55:42 | 显示全部楼层
这个东西没有什么参数可以调整的,读出来时多大温度就是多大了,就算不对叶没办法呀。





我一般试验就是先用烙铁烫,配合我的串口波形显示的软件,看温度升高到多少,然后用冰块冰镇看温度下降到多少。

出0入0汤圆

发表于 2009-6-10 11:13:18 | 显示全部楼层
支持

出0入0汤圆

发表于 2009-6-10 12:56:53 | 显示全部楼层
记号一个 谢谢了 分享啦

出0入0汤圆

发表于 2009-6-10 22:11:00 | 显示全部楼层
我觉得楼主写的有些复杂了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-8 08:33

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

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