单总线驱动程序(DS18B20) - zhliao

时间:2024-01-30 09:25:49
单总线驱动程序(DS18B20)

sbit DQ=P3^7;                    //DS18B20数据传输线接单片机的相应的引脚

 

void delaymm(uint z)

{

     uint x,y;

     for(x=z;x>0;x--)

     for(y=110;y>0;y--);

}

 

 //向DS18B20读一字节数据 ,从低位开始读

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;   //如果最DQ是1的话,最高位置1

         delay(4);

         }

    return(dat);

}

 

//向DS18B20写一字节数据,从最低位开始写

void WriteOneChar(unsigned char dat) 

{

     unsigned char i=0;         

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

     {

         DQ=0;   

         DQ=dat&0x01;  //如果最低位是1的话则写1

         delay(5);

         DQ=1;

         dat>>=1;  //左移一位,如把i = 8,经过比较,符合,i = 7是第一次左移一位,使之在下一个循环比较的是第二位&0X01

     }

     delay(4);

}

 

void Init_DS18B20(void)/*函数功能:DS18B20初始化子程序*/

{

     unsigned char x=0;

     DQ=1;                       //DQ先置高

     delay(8);              //延时

     DQ=0;                  //发送复位脉冲

     delay(85);             //延时(>480ms)

     DQ=1;                       //拉高数据线

     delay(14);             //等待(15~60ms)

}

 

//函数功能:向DS18B20读温度值

ReadTemperature(void) 

     Init_DS18B20();               //初始化

     WriteOneChar(0xcc);         //跳过读序列号的操作

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

     delaymm(125);                  //转换需要一点时间,延时

     Init_DS18B20();               //初始化

     WriteOneChar(0xcc);         //跳过读序列号的操作

     WriteOneChar(0xbe);         //读温度寄存器(头两个值分别为温度的低位和高位)

     delaymm(125);

     tempL=ReadOneChar();        //读出温度的低位LSB

     tempH=ReadOneChar();        //读出温度的高位MSB 

     //温度转换,把高低位做相应的运算转化为实际温度

     temperature=((tempH*256)+tempL)*0.0625;

     delay(200);

     return(temperature);

}