有关18B20温度传感器的通信

全部回答1
默认 最新
  • 我这有调试好的程序,资料在课本上或者网都很多 /***************************************//*    延时子程序    *//***************************************/void delay1(uint i)    //delay      {    while(i--);   }/************************************************//*    初始化ds18b2子函数*    *//************************************************/Init_DS18B20(void){    uchar x=0;    DQ = 1;    //DQ复位    delay1(8);    //稍做延时    DQ = 0;    //单片机将DQ拉低    delay1(80);    //精确延时 大于 480us    DQ = 1;    //拉高总线    delay1(14);    x=DQ;    //稍做延时后 如果x=0则初始化成功 x=1则初始化失败    delay1(20);} /*************************************************//*    读字节子函数    *//*************************************************/ReadOneChar(void){    uchar i = 0;    uchar dat = 0;   for (i=8;i>0;i--)    {    DQ = 0;    // 给脉冲信号    dat>>=1;    // 数据右移一位    DQ = 1;    // 给脉冲信号    if(DQ)    // DQ为1    dat|=0x80;    // 读出数据    delay1(4);    // 延时    }   return(dat);}/*************************************************//*    写字节子函数    *//*************************************************/WriteOneChar(unsigned char dat){    uchar i = 0;    for (i=8; i>0; i--)    {    DQ = 0;    DQ = dat&0x01;   //写入一位数据    delay1(5);    DQ = 1;    dat>>=1;    //右移一位数据    }}/*************************************************//*    DS18B20写命令函数    *//*************************************************/void tmpwritebyte(uchar dat)   // write a byte to ds18b20 {    // 给温度传感器写一个字节    uint i;    uchar j;    bit testb;    for(j=1;j<=8;j++)    {    testb=dat&0x01;    dat=dat>>1;    if(testb)    //写入 1    {    DQ=0;    i++;i++;    DQ=1;    i=8;while(i>0)i--; // 适当延时    }    else    //写入 0    {    DQ=0;        i=8;while(i>0)i--; // 适当延时    DQ=1;    i++;i++;    }    }}/******************************************//*    发送温度转换命令    *//******************************************/void tmpchange(void)    // DS18B20 begin change   {Init_DS18B20();    // 初始化DS18B20delay1(200);    // 延时WriteOneChar(0xcc);    // 跳过序列号命令WriteOneChar(0x44);    // 发送温度转换命令}/******************************************//*    读出温度函数    *//******************************************/uint tmp()    //get the temperature{//float tt;Init_DS18B20();    // 初始化ds18b2子函数 delay1(1);WriteOneChar(0xcc);    // 跳过ROM命令WriteOneChar(0xbe);    // 发送读取数据命令temp_data[0]=ReadOneChar(); // 连续读两个字节数据temp_data[1]=ReadOneChar();temp=temp_data[1];temp<<=8;    temp=temp+temp_data[0];    // 两字节合成一个整型变量。//tt=temp*0.0625;    // 得到真实十进制温度值,因为DS18B20    // 可以精确到0.0625度,所以读回数据的最低位代表的是    // 0.0625度。//temp=tt*10+0.5;    // 放大十倍,这样做的目的将小数点后第一位    // 也转换为可显示数字,同时进行一个四舍五入操作。return temp;    // 返回温度值}/******************************************//*    读出序列号函数    *//******************************************//*void readrom()    // read the serial 读取温度传感器的序列号{    // 本程序中没有用到此函数uchar sn1,sn2;Init_DS18B20();    // DS18B20初始化delay1(1);WriteOneChar(0x33);    // Read ROMsn1=ReadOneChar();    // 8位系列编码sn2=ReadOneChar();    // 8位CRC码} /******************************************//*    温度数据显示处理函数    *//******************************************/void tem_deal(uint tem){/*************温度数据处理*****************/   if(tem>6348)    // 温度值正负判断    {tem=65536-tem;flag1=1;}    // 负温度求补码,标志位置1    // 取小数部分的值Dis_play[4]=tem&0x0f;    Dis_play[0]=ditab[Dis_play[4]];    // 存入小数部分显示值   Dis_play[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);    // 取中间八位,即整数部分的值   Dis_play[3]=Dis_play[4]/100;    // 取百位数据暂存   Dis_play[1]=Dis_play[4]%100;    // 取后两位数据暂存   Dis_play[2]=Dis_play[1]/10;    // 取十位数据暂存   Dis_play[1]=Dis_play[1]%10;    // 取个位数据暂存   if(!Dis_play[3])    // 最高位为0都不显示   {    Dis_play[3]=0x0a;   // 先判断百位是否为0    if(!Dis_play[2])   {    Dis_play[2]=0x00; // 再判断十位是否为0   }   }   if(flag1)   {    Dis_play[3]=0x0b;    // 为负数时,最高位显示 "-"   }}
    0 点赞

没有更多内容了

返回顶部
产品求购 求购