单线挂载16个DS18B20传感器51程序

2019-03-24 16:55发布

最近做个项目,需要采集16个DS18B20的信息并显示,I/O口有限于是采用单线传输的方式,找了相关资料,但很多地方看不懂,获取序列号和自动匹配这地方一头雾水,求完整程序和获取序列号处的解析。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
ABSWITCH
2019-03-25 04:01
doublezz 发表于 2018-12-26 15:58
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20与单片机连接 ...

//下面是测试过的DS18B20的程序

uchar shuju[2];
uchar i;
int t = 0;

sbit DQ = P1^0; //óÃóú′®¿ú·¢Ëí¼°1¤×÷×′ì¬Ö¸ê¾

BYTE TPH; //′æ·ÅζèÖμμĸß×Ö½ú
BYTE TPL; //′æ·ÅζèÖμμÄμí×Ö½ú

void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();

void delay(uint x)//Ñóê±
{
  uint a,b;
    for(a=0;a<200;a++)
  for(b=x;b>0;b--);
}

uchar get_AD_result(uchar channel)
{
      uchar AD_finished = 0; // ′æ′¢ A/D ×a»»±êÖ¾
      ADC_DATA = 0;
      ADC_CONTR = channel; // Ñ¡Ôñ A/D μ±Ç°í¨μà?
                        //ê1êäèëμçÑ1′ïμ½Î趨
      ADC_CONTR |= 0x88; //1000,1000 áî ADC_START = 1, Æô¶ˉA/D ×a»»
      delay(1);
      AD_finished = 0;
      while ( AD_finished == 0 ) // μè′yA/D ×a»»½áêø
             { AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==12aêÔA/D×a»»½áêø·ñ
      }
     ADC_CONTR &=0x80; //10000000 áî ADC_START = 0, 1رÕA/D ×a»»
      return (ADC_DATA); // ·μ»Ø A/D ×a»»½á1û
}

int get_temper()//¶áζè′«¸DÆ÷
{
        unsigned int temp;
        unsigned int wen;

        DS18B20_Reset(); //é豸¸′λ
        DS18B20_WriteByte(0xCC); //ìø1yROMÃüáî
        DS18B20_WriteByte(0x44); //¿aê¼×a»»Ãüáî
        while (!DQ); //μè′y×a»»íê3é

        DS18B20_Reset(); //é豸¸′λ
        DS18B20_WriteByte(0xCC); //ìø1yROMÃüáî
        DS18B20_WriteByte(0xBE); //¶áÔY′æ′æ′¢Æ÷Ãüáî
        TPL = DS18B20_ReadByte(); //¶áζèμí×Ö½ú
        TPH = DS18B20_ReadByte(); //¶áζè¸ß×Ö½ú

/*        temp=(TPH<<8)|TPL; //oÏ2¢
        if(TPH>200) temp=~temp+1;
        wen=(temp*6/10)+(temp*2/100)+(temp*5/1000); //×a»»*/
        if(!t){
                temp = TPL;
                t = 1;
        }
        else{
                temp = TPH;
                t = 0;
        }
        return(temp); //·μ»Øζè
}       

/**************************************
Ñóê±X΢Ãë(STC12C5A60S2@5.2M)
2»í¬μÄ1¤×÷»·¾3,Dèòaμ÷Õû′Ëoˉêy
′ËÑóê±oˉêyêÇê1óÃ1TμÄÖ¸áîÖüÆú½øDD¼ÆËã,óë′«í3μÄ12TμÄMCU2»í¬
**************************************/
void DelayXus(BYTE n)
{
        while (n--)
        {
        _nop_();
        }
}

void inint_ser()//3õê¼»ˉ′®¿ú,2¨ìØÂê9600
{
    TMOD=0x20;
    TH1=0xfd;
    TL1=0xfd;
        REN=1;
    TR1=1;          
        ES=1;
    EA=1;
        SM0=0;
        SM1=1;
        PCON=0X80;
}

/**************************************
¸′λDS18B20,2¢¼ì2aé豸êÇ·ñ′æÔú
**************************************/
void DS18B20_Reset()
{
        CY = 1;
        while (CY)
        {
                DQ = 0; //Ëí3öμíμçƽ¸′λDÅoÅ
                DelayXus(180); //Ñóê±Öáéù480us
                DelayXus(180);
                DQ = 1; //êí·Åêy¾YÏß
                DelayXus(40); //μè′y60us
                CY = DQ; //¼ì2a′æÔúÂö3å
                DelayXus(200); //μè′yé豸êí·Åêy¾YÏß
                DelayXus(150);
        }
}

/**************************************
′óDS18B20¶á1×Ö½úêy¾Y
**************************************/
BYTE DS18B20_ReadByte()
{
        BYTE i;
        BYTE dat = 0;

        for (i=0; i<8; i++) //8λ¼ÆêyÆ÷
        {
                dat >>= 1;
                DQ = 0; //¿aê¼ê±¼äƬ
                DelayXus(0); //Ñóê±μè′y
                DQ = 1; //×¼±¸½óêÕ
                DelayXus(0); //½óêÕÑóê±
                if (DQ) dat |= 0x80; //¶áè¡êy¾Y
                DelayXus(40); //μè′yê±¼äƬ½áêø
        }

        return dat;
}

/**************************************
ÏòDS18B20D′1×Ö½úêy¾Y
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
        char i;

        for (i=0; i<8; i++) //8λ¼ÆêyÆ÷
        {
                DQ = 0; //¿aê¼ê±¼äƬ
                DelayXus(0); //Ñóê±μè′y
                dat >>= 1; //Ëí3öêy¾Y
                DQ = CY;
                DelayXus(40); //μè′yê±¼äƬ½áêø
                DQ = 1; //»Ö¸′êy¾YÏß
                DelayXus(0); //»Ö¸′Ñóê±
        }
}

void send_data(uchar x)
{

    ES=0;   
    SBUF=shuju[x];
        delay(20);
    while(!TI);
        TI=0;       
        ES=1;
}

void send_dataA()
{

    ES=0;   
    SBUF=0xAA;
        delay(20);
    while(!TI);
        TI=0;       
        ES=1;
}

void send_dataB()
{

    ES=0;   
    SBUF=0xBB;
        delay(20);
    while(!TI);
        TI=0;       
        ES=1;
}

void main()
{  
        int k;
        inint_ser();

           P1M0=0XFF;
           P1M1=0xFF;
           P1=0XFF;
           while(1)
           {
                send_dataA();
                for(k = 0;k < 2;k++)
                {
                          shuju[k]=get_temper();
                          send_data(k);
                }
                send_dataB();
                delay(100);
        }
}

一周热门 更多>