我这有调试好的程序,资料在课本上或者网都很多
/***************************************//* 延时子程序 *//***************************************/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; // 为负数时,最高位显示 "-" }}