找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2975|回复: 6
收起左侧

大家给我看看程序,为什么我的DS18B20有时候数据出错

[复制链接]
ID:94642 发表于 2016-1-20 14:58 | 显示全部楼层 |阅读模式
我用的单片机是STC12C5a60S2,晶振是22.1184MHZ

#include "ds18b20.h"

sbit DQ_1820A                 = P1^1;                        //¼óèè°å
sbit DQ_1820B                         = P1^4;                        //¼óèèí°
sbit DQ_1820C                         = P1^0;                        //±¸óÃ



unsigned int sdate1;//2aá¿μ½μÄζèμÄÕûêy2¿·Ö
unsigned char xiaoshu11;//D¡êyμúò»Î»
unsigned char xiaoshu12;//D¡êyμú¶tλ
unsigned char xiaoshu1;//á½Î»D¡êy


unsigned int sdate2;//2aá¿μ½μÄζèμÄÕûêy2¿·Ö
unsigned char xiaoshu21;//D¡êyμúò»Î»
unsigned char xiaoshu22;//D¡êyμú¶tλ
unsigned char xiaoshu2;//á½Î»D¡êy

unsigned int sdate3;//2aá¿μ½μÄζèμÄÕûêy2¿·Ö
unsigned char xiaoshu31;//D¡êyμúò»Î»
unsigned char xiaoshu32;//D¡êyμú¶tλ
unsigned char xiaoshu3;//á½Î»D¡êy


bit  fg1=1;        //ζèÕy¸o±êÖ¾
bit xdate1;

bit  fg2=1;        //ζèÕy¸o±êÖ¾
bit xdate2;

bit  fg3=1;        //ζèÕy¸o±êÖ¾
bit xdate3;

/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbit( )

¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öλ
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
//******************************************************************************/
bit rdbit1(void)
{
        uint i;
        bit a;
        //EA=0;
        DQ_1820A=0;
        i++;
        i++;
        i++;
        i++;//±£3ÖμíÖáéù1us
        DQ_1820A=1;
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        a=DQ_1820A;
        sysUtilsUSecDelay(90);
        return (a);
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbyte( )
¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öêy¾Yà′
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uchar rdbyte1(void)
{
        uchar i,j,a;
        a=0;       
        for(i=1;i<=8;i++)
        {
                j=rdbit1();
                a=(j<<7)|(a>>1);//½óêÕμ½μÄêy¾Y′ó×î¸ßÎaíùÏÂòÆ
        }
        return(a);       
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿wrbyte( )
¡¾1|ÄüÃèêö¡¿D′èë18B20ò»¸ö×Ö½ú
¡¾êä¡¡  èë¡¿D′èëμÄêy¾YÖμ
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
void wrbyte1(uchar a)
{
        uint i;
        uchar j;
        bit btmp;
        //EA=0;
        for(j=1;j<=8;j++)
        {
                btmp=a&0x01;
                a=a>>1;
                if(btmp)//D′1
                {
                        DQ_1820A=0;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        DQ_1820A=1;
                        sysUtilsUSecDelay(90);
                }
                else
                {
                        DQ_1820A=0;//D′0
                        sysUtilsUSecDelay(90);
                        DQ_1820A=1;
                        sysUtilsUSecDelay(90);
                }
        }
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿Init_DS18B20A( )
¡¾1|ÄüÃèêö¡¿3õê¼»ˉ18B20
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uint check_numb1;/*¼ì2a18B20êÇ·ñ′æÔú′Îêy*/
void Init_DS18B20A(void)
{
AAA:
           _nop_();//*/
        _nop_(); //*/
        //EA=0;       
        DQ_1820A=1;
        _nop_();
        _nop_();
        DQ_1820A=0;                                        //·¢Ëí¸′λÂö3å
        sysUtilsUSecDelay(1000);                 //Ñóê±(>480us)         880
        DQ_1820A=1;                                        //à-¸ßêy¾YÏß          
        sysUtilsUSecDelay(60);                  //μè′y(15~60us) 50
        xdate1=((1==DQ_1820A)?1:0);        //óÃXμÄÖμà′ÅD¶Ï3õê¼»ˉóDûóD3é1|£¬18B20′æÔúμÄ»°X=0£¬·ñÔòX=1

        if((1==xdate1))                                        //ûóD¼ì2aμ½18B201رÕêä3ö£¬·äÃùÆ÷±¨¾ˉ
        {
                  
                 SendData(8);  
                sysUtilsUSecDelay(500);
                //        wdt();  
                sysUtilsUSecDelay(500);
                       
                goto        AAA;
        }

        while(xdate1);                           //¼ì2aμ½¸′λDÅoÅ£¬3õê¼»ˉ3é1|

        check_numb1=0;
        sysUtilsUSecDelay(180);        
        DQ_1820A=1;
        //EA=1;                                       
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿ReadTemperature1(void)
¡¾1|ÄüÃèêö¡¿Î¶è¼ü×ó3ìDò  
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿N
¡¾è«¾Ö±äá¿¡¿N
¡¾Ëμ    Ã÷¡¿N
******************************************************************************/
uchar  adcount1;

uchar  tempL1,tempH1;
unsigned int    adtemp1;
unsigned int ReadTemperature1(void)
{
        //unsigned int    adtemp;
        Init_DS18B20A();                 //3õê¼»ˉ
        wrbyte1(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte1(0x44);         //Æô¶ˉζè×a»»
        sysUtilsUSecDelay(4000);
        Init_DS18B20A();                 //3õê¼»ˉ
        wrbyte1(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte1(0xbe);         //¶áζè¼Ä′æÆ÷£¨í·á½¸öÖμ·Ö±eÎaζèμÄμíλoí¸ß룩
        tempL1=rdbyte1();        //¶á3öζèμÄμíλLSB
        tempH1=rdbyte1();         //¶á3öζèμĸßλMSB
       
                if(tempH1>0x7f)      //×î¸ßλÎa1ê±Î¶èêǸo
                {
                 tempL1=~tempL1;         //21Âë×a»»£¬è¡·′¼óò»
                 tempH1=~tempH1+1;      
                 fg1=0;      //¶áè¡Î¶èÎa¸oê±fg=0
       }
           sdate1 = tempL1/16+tempH1*16;      //Õûêy2¿·Ö
           xiaoshu11 = (tempL1&0x0f)*10/16; //D¡êyμúò»Î»
           xiaoshu12 = (tempL1&0x0f)*100/16%10;//D¡êyμú¶tλ
           xiaoshu1=xiaoshu11*10+xiaoshu12; //D¡êyá½Î»
         if(xiaoshu1>=50)
                         {
                                 sdate1=sdate1+1;
                         }
                         else
                                 sdate1=sdate1;
        adtemp1=((tempH1*256)+tempL1)*6.25;  //ζè×a»»,à©′ó100·μ»Ø
        return(adtemp1) ;
                       
}

////μú¶t¸öDS18B20μĸ÷¸ö¶«Î÷


/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbit( )

¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öλ
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
bit rdbit2(void)
{
        uint i;
        bit b;
        //EA=0;
        DQ_1820B=0;
        i++;
        i++;
        i++;
        i++;//±£3ÖμíÖáéù1us
        DQ_1820B=1;
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        b=DQ_1820B;
        sysUtilsUSecDelay(90);
        return (b);
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbyte( )
¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öêy¾Yà′
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uchar rdbyte2(void)
{
        uchar i,j,b;
        b=0;       
        for(i=1;i<=8;i++)
        {
                j=rdbit2();
                b=(j<<7)|(b>>1);//½óêÕμ½μÄêy¾Y′ó×î¸ßÎaíùÏÂòÆ
        }
        return(b);       
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿wrbyte( )
¡¾1|ÄüÃèêö¡¿D′èë18B20ò»¸ö×Ö½ú
¡¾êä¡¡  èë¡¿D′èëμÄêy¾YÖμ
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
void wrbyte2(uchar b)
{
        uint i;
        uchar j;
        bit btmp;
        //EA=0;
        for(j=1;j<=8;j++)
        {
                btmp=b&0x01;
                b=b>>1;
                if(btmp)//D′1
                {
                        DQ_1820B=0;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        DQ_1820B=1;
                        sysUtilsUSecDelay(90);
                }
                else
                {
                        DQ_1820B=0;//D′0
                        sysUtilsUSecDelay(90);
                        DQ_1820B=1;
                        sysUtilsUSecDelay(90);
                }
        }
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿Init_DS18B20A( )
¡¾1|ÄüÃèêö¡¿3õê¼»ˉ18B20
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uint check_numb2;/*¼ì2a18B20êÇ·ñ′æÔú′Îêy*/
void Init_DS18B20B(void)
{
BBB:
           _nop_();//*/
        _nop_(); //*/
        EA=0;       
        DQ_1820B=1;
        _nop_();
        _nop_();
        DQ_1820B=0;                                        //·¢Ëí¸′λÂö3å
        sysUtilsUSecDelay(1000);                 //Ñóê±(>480us)         880
        DQ_1820B=1;                                        //à-¸ßêy¾YÏß          
        sysUtilsUSecDelay(60);                  //μè′y(15~60us) 50
        xdate2=((1==DQ_1820B)?1:0);        //óÃXμÄÖμà′ÅD¶Ï3õê¼»ˉóDûóD3é1|£¬18B20′æÔúμÄ»°X=0£¬·ñÔòX=1

        if((1==xdate2))                                        //ûóD¼ì2aμ½18B201رÕêä3ö£¬·äÃùÆ÷±¨¾ˉ
        {
               

            
                 SendData(9);  
                sysUtilsUSecDelay(500);
                //        wdt();  
                sysUtilsUSecDelay(500);
                       
                goto        BBB;
        }

        while(xdate2);                           //¼ì2aμ½¸′λDÅoÅ£¬3õê¼»ˉ3é1|

        check_numb2=0;
        sysUtilsUSecDelay(180);        
        DQ_1820B=1;
        EA=1;                                       
}
/////******************************************************************************
////¡¾oˉêyÃû3Æ¡¿ReadTemperature1(void)
////¡¾1|ÄüÃèêö¡¿Î¶è¼ü×ó3ìDò  
////¡¾êä¡¡  èë¡¿N
////¡¾êä¡¡  3ö¡¿N
////¡¾è«¾Ö±äá¿¡¿N
////¡¾Ëμ    Ã÷¡¿N
////******************************************************************************/
uchar  adcount2;

uchar  tempL2,tempH2;
unsigned int    adtemp2;
unsigned int ReadTemperature2(void)
{
        //unsigned int    adtemp;
        Init_DS18B20B();                 //3õê¼»ˉ
        wrbyte2(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte2(0x44);         //Æô¶ˉζè×a»»
        sysUtilsUSecDelay(4000);
        Init_DS18B20B();                 //3õê¼»ˉ
        wrbyte2(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte2(0xbe);         //¶áζè¼Ä′æÆ÷£¨í·á½¸öÖμ·Ö±eÎaζèμÄμíλoí¸ß룩
        tempL2=rdbyte2();        //¶á3öζèμÄμíλLSB
        tempH2=rdbyte2();         //¶á3öζèμĸßλMSB
       
                if(tempH2>0x7f)      //×î¸ßλÎa1ê±Î¶èêǸo
                {
                 tempL2=~tempL2;         //21Âë×a»»£¬è¡·′¼óò»
                 tempH2=~tempH2+1;      
                 fg2=0;      //¶áè¡Î¶èÎa¸oê±fg=0
       }
           sdate2 = tempL2/16+tempH2*16;      //Õûêy2¿·Ö
           xiaoshu21 = (tempL2&0x0f)*10/16; //D¡êyμúò»Î»
           xiaoshu22 = (tempL2&0x0f)*100/16%10;//D¡êyμú¶tλ
           xiaoshu2=xiaoshu21*10+xiaoshu22; //D¡êyá½Î»
                         
         if(xiaoshu2>=50)
                         {
                                 sdate2=sdate2+1;
                         }
                         else
                                 sdate2=sdate2;
        //adtemp2=((tempH2*256)+tempL2)*6.25;  //ζè×a»»,à©′ó100·μ»Ø
        return(sdate2) ;

                         //return ()
}

//μúèy¸ö18B20μĶ«Î÷

/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbit( )

¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öλ
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
bit rdbit3(void)
{
        uint i;
        bit b;
        //EA=0;
        DQ_1820C=0;
        i++;
        i++;
        i++;
        i++;//±£3ÖμíÖáéù1us
        DQ_1820C=1;
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        b=DQ_1820C;
        sysUtilsUSecDelay(90);
        return (b);
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿rdbyte( )
¡¾1|ÄüÃèêö¡¿′ó18B20¶á3öò»¸öêy¾Yà′
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿¶á3öμÄêy¾YÖμ
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uchar rdbyte3(void)
{
        uchar i,j,b;
        b=0;       
        for(i=1;i<=8;i++)
        {
                j=rdbit3();
                b=(j<<7)|(b>>1);//½óêÕμ½μÄêy¾Y′ó×î¸ßÎaíùÏÂòÆ
        }
        return(b);       
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿wrbyte( )
¡¾1|ÄüÃèêö¡¿D′èë18B20ò»¸ö×Ö½ú
¡¾êä¡¡  èë¡¿D′èëμÄêy¾YÖμ
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
void wrbyte3(uchar c)
{
        uint i;
        uchar j;
        bit btmp;
        //EA=0;
        for(j=1;j<=8;j++)
        {
                btmp=c&0x01;
                c=c>>1;
                if(btmp)//D′1
                {
                        DQ_1820C=0;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        i++;i++;
                        DQ_1820C=1;
                        sysUtilsUSecDelay(90);
                }
                else
                {
                        DQ_1820C=0;//D′0
                        sysUtilsUSecDelay(90);
                        DQ_1820C=1;
                        sysUtilsUSecDelay(90);
                }
        }
        //EA=1;
}
/******************************************************************************
¡¾oˉêyÃû3Æ¡¿Init_DS18B20A( )
¡¾1|ÄüÃèêö¡¿3õê¼»ˉ18B20
¡¾êä¡¡  èë¡¿N
¡¾êä¡¡  3ö¡¿N
¡¾Ëμ    Ã÷¡¿
******************************************************************************/
uint check_numb3;/*¼ì2a18B20êÇ·ñ′æÔú′Îêy*/
void Init_DS18B20C(void)
{
CCC:
           _nop_();//*/
        _nop_(); //*/
        EA=0;       
        DQ_1820C=1;
        _nop_();
        _nop_();
        DQ_1820C=0;                                        //·¢Ëí¸′λÂö3å
        sysUtilsUSecDelay(1000);                 //Ñóê±(>480us)         880
        DQ_1820C=1;                                        //à-¸ßêy¾YÏß          
        sysUtilsUSecDelay(60);                  //μè′y(15~60us) 50
        xdate3=((1==DQ_1820C)?1:0);        //óÃXμÄÖμà′ÅD¶Ï3õê¼»ˉóDûóD3é1|£¬18B20′æÔúμÄ»°X=0£¬·ñÔòX=1

        if((1==xdate3))                                        //ûóD¼ì2aμ½18B201رÕêä3ö£¬·äÃùÆ÷±¨¾ˉ
        {
               

            
                 SendData(10);  
                sysUtilsUSecDelay(500);
                //        wdt();  
                sysUtilsUSecDelay(500);
                       
                goto        CCC;
        }

        while(xdate3);                           //¼ì2aμ½¸′λDÅoÅ£¬3õê¼»ˉ3é1|

        check_numb3=0;
        sysUtilsUSecDelay(180);        
        DQ_1820C=1;
        EA=1;                                       
}
/////******************************************************************************
////¡¾oˉêyÃû3Æ¡¿ReadTemperature1(void)
////¡¾1|ÄüÃèêö¡¿Î¶è¼ü×ó3ìDò  
////¡¾êä¡¡  èë¡¿N
////¡¾êä¡¡  3ö¡¿N
////¡¾è«¾Ö±äá¿¡¿N
////¡¾Ëμ    Ã÷¡¿N
////******************************************************************************/
uchar  adcount3;

uchar  tempL3,tempH3;
unsigned int    adtemp3;
unsigned int ReadTemperature3(void)
{
        //unsigned int    adtemp;
        Init_DS18B20C();                 //3õê¼»ˉ
        wrbyte3(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte3(0x44);         //Æô¶ˉζè×a»»
        sysUtilsUSecDelay(4000);
        Init_DS18B20C();                 //3õê¼»ˉ
        wrbyte3(0xcc);         //ìø1y¶áDòáDoÅμÄ2ù×÷
        wrbyte3(0xbe);         //¶áζè¼Ä′æÆ÷£¨í·á½¸öÖμ·Ö±eÎaζèμÄμíλoí¸ß룩
        tempL3=rdbyte3();        //¶á3öζèμÄμíλLSB
        tempH3=rdbyte3();         //¶á3öζèμĸßλMSB
       
                if(tempH3>0x7f)      //×î¸ßλÎa1ê±Î¶èêǸo
                {
                 tempL3=~tempL3;         //21Âë×a»»£¬è¡·′¼óò»
                 tempH3=~tempH3+1;      
                 fg3=0;      //¶áè¡Î¶èÎa¸oê±fg=0
       }
           sdate3 = tempL3/16+tempH3*16;      //Õûêy2¿·Ö
           xiaoshu31 = (tempL3&0x0f)*10/16; //D¡êyμúò»Î»
           xiaoshu32 = (tempL3&0x0f)*100/16%10;//D¡êyμú¶tλ
           xiaoshu3=xiaoshu31*10+xiaoshu32; //D¡êyá½Î»
                         
         if(xiaoshu3>=50)
                         {
                                 sdate3=sdate3+1;
                         }
                         else
                                 sdate3=sdate3;
        //adtemp2=((tempH2*256)+tempL2)*6.25;  //ζè×a»»,à©′ó100·μ»Ø
        return(sdate3) ;

                         //return ()
}

回复

使用道具 举报

ID:94642 发表于 2016-1-20 15:00 | 显示全部楼层
一般情况下没问题,但加热的时候有时候会突然出现一个值,一闪而过
回复

使用道具 举报

ID:103999 发表于 2016-1-21 13:44 | 显示全部楼层
budong
回复

使用道具 举报

ID:94642 发表于 2016-1-21 15:20 | 显示全部楼层
正常情况能够读出来,但是到达设定值后,会突然闪出一个值,然后又恢复正常了
回复

使用道具 举报

ID:96500 发表于 2016-1-21 19:28 来自手机 | 显示全部楼层
建议你直接复制历程代码
回复

使用道具 举报

ID:104294 发表于 2016-1-24 16:16 | 显示全部楼层
扫描时间?
回复

使用道具 举报

ID:104294 发表于 2016-1-24 16:28 | 显示全部楼层
扫描频率呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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