C51读DS18B20 ROM CRC

2020-01-27 11:43发布

#include <reg51.h>   
#include "intrins.h"


unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit DQ=P3^3;                                  
unsigned char tempL=0;                        
unsigned char tempH=0;                       
unsigned char temp2=0;                        
unsigned char temp3=0;                       
unsigned char temp4=0;                
unsigned char temp5=0;                       
unsigned char temp6=0;                        
unsigned char temp7=0;                       
unsigned char temp8=0;                        

float temperature;                            



void delay(unsigned int k)
{         
        unsigned int n=0;     
        while(n< k)      
        {
          n++;
  }  
        return;      
}  


void delay1(void)
{
        int k;
        for(k=0;k<400;k++);
}



void display(int k)
{
        P2=0xfe;                       
        P0=tab[k/1000];
        delay1();

        P2=0xfd;
        P0=tab[k%1000/100];
        delay1();

        P2=0xfb;
        P0=tab[k%100/10];
        delay1();

        P2=0xf7;
        P0=tab[k%10];
        delay1();

        P2=0xff;
}



Init_DS18B20(void)
{
        unsigned char x=0;
          DQ=1;                                 
          delay(15);                  

          DQ=0;                            
          delay(70);                     


          DQ=1;                                 
          delay(15);                     


}


ReadOneChar(void)                         
{
        unsigned char i=0;                
        unsigned char dat=0;
    for (i=8;i>0;i--)                 
                {
                        DQ=1;
                    delay(1);
                    DQ=0;      
                    dat>>=1;
                           DQ=1;
                    if(DQ)
                           dat|=0x80;
                    delay(4);
                }
    return(dat);
}



WriteOneChar(unsigned char dat)
{
        unsigned char i=0;                
        for(i=8;i>0;i--)         
        {
                DQ=0;           
                DQ=dat&0x01;
                delay(5);
                DQ=1;
                dat>>=1;
        }
        delay(4);
}



ReadTemperature(void)
{  
       
        Init_DS18B20();                 
        WriteOneChar(0xcc);       
        WriteOneChar(0x33);
       
//         Init_DS18B20();                         
//         WriteOneChar(0xcc);                 
//         WriteOneChar(0x44);                
//         delay(125);                                  
//         Init_DS18B20();                         
//         WriteOneChar(0xcc);                 
//         WriteOneChar(0xbe);                
        tempL=ReadOneChar();        
        tempH=ReadOneChar();        
        temp2=ReadOneChar();
        temp3=ReadOneChar();
        temp4=ReadOneChar();
        temp5=ReadOneChar();
        temp6=ReadOneChar();
        temp7=ReadOneChar();
        temp8=ReadOneChar();
//         temperature=((tempH*256)+tempL)*0.0625;
//         delay(200);
//         return(temperature);
}



void  main()
{
        float i;
        while(1)
        {
                i=ReadTemperature();
                display(i);
        }
}



请大家告诉我怎么读ROM中的数值和CRC和设定寄存器中的HI和LI,如果我想增加8个或者更远DS18B20,程序需要怎么修改,谢谢大家指导。。。。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。