/*------------------------------------------------ 读取温度 ------------------------------------------------*/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 DelayUs2x(1000); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; t=(float)t*0.625; //t为实际温度的十倍,这样方便取小数点后一位 return t; }
void ReadTemperature() { static unsigned char num=0; if(0==num) { Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x4E); // //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器 //先写TH,再写TL,最后写配置寄存器 WriteOneChar(0x6e); //写入想设定的温度报警上限 WriteOneChar(0x00); //写入想设定的温度报警下限 WriteOneChar(0x3f); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1 //R1R0=00分辨率娄9位,R1R0=11分辨率为12位 */ } else if(1==num) { // delay_18B20(80); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 } else if(2==num) { // delay_18B20(80); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 } else if(3==num) { // delay_18B20(80); low_byte=ReadOneChar(); //读取温度值低位 high_byte=ReadOneChar(); //读取温度值高位 num=0; return ; } num++; }
void Config18b20 (void) //重新配置报警限定值和分辨率 { Init_DS18B20(); WriteOneChar(0xcc); //skip rom WriteOneChar(0x4e); //write scratchpad WriteOneChar(0xff); //上限 WriteOneChar(0x00); //下限 WriteOneChar(0x7f); //set 12 bit Init_DS18B20(); WriteOneChar(0xcc); //skip rom WriteOneChar(0x48); //保存设定值 Init_DS18B20(); WriteOneChar(0xcc); //skip rom WriteOneChar(0xb8); //回调设定值 }
void Read_RomCord(void) { unsigned char j; Init_DS18B20(); WriteOneChar(0x33); // 读序列码的操作 for (j = 0; j < 8; j++) { RomCode[j] = ReadOneChar() ; } }
//--------------------------------------------------------------------------- //读取温度 unsigned int ReadTemperature(void) { unsigned int tp=0; unsigned char temp_L,temp_H; //高位 和 低位 DS18B20_RST(); // 步骤 1 WriteOneChar(0xCC); // 跳过读序号列号的操作 步骤 2 WriteOneChar(0x44); // 启动温度转换 步骤 3 while(DQ==0); //等待转换完成 DQ=0表示正在转换,DQ=1表示转换完成 12位需要最多750ms DS18B20_RST(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 temp_L = ReadOneChar(); //低8位(先低后高的发过来的) temp_H = ReadOneChar(); //高八位 tp|=temp_H; tp<<=8; tp|=temp_L; return tp; }
//读取温度 unsigned char ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; //float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(2000); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); b<<=4; b+=(a&0xf0)>>4; t=b; //tt=t*0.0625; //t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); }
/*****读取温度*****/ int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; t=Init_DS18B20(); if(t) return Real_temp; WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 // delay(10); t=Init_DS18B20(); if(t) return Real_temp; WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; if(t<=0||t>0x900) return Real_temp; return(t); }
/****************************************************** 函数名称:int ReadOneTemperature(void) 返回值:int t 参数: 无 作用:读温度值 *******************************************************/ int get_temp(void) ////////***读取温度值***********///// 每次读写均要先复位 { uchar a=0; uchar b=0; uint16 t=0; Init_DS18B20(); WriteOneChar(0xcc);//发跳过ROM命令 WriteOneChar(0x44);//发读开始转换命令 Init_DS18B20(); WriteOneChar(0xcc);//发跳过ROM命令 WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值 a=ReadOneChar(); //a存低字节 b=ReadOneChar(); //b存高字节 t=((b<<8)|a); return((t>>4)*10+table_tempfh[t&0x0f]); /* t=b; t<<=8;//高字节转换为10进制 t=t|a; tep=t*0.0625;//转换精度为0.0625/LSB t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值) */ }
void Write_Temperature_alarm(void) { Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x4e); //将设定的温度报警值写入 DS18B20 WriteOneChar(temp_alarm[0]); //写TH WriteOneChar(temp_alarm[1]); //写TL WriteOneChar(0x7f); //12位精确度 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x48); //把暂存器里的温度报警值拷贝到EEROM }