}
void tmprchange(void) {
dsreset(); delay(1); dswrite(0xcc); dswrite(0x44); }
void getspeed(void) {
uint temp;
float tempr;
uchar a,b;
dsreset(); //初始化 delay(1);
dswrite(0xcc); //跳过ROM dswrite(0xbe); //读温度命令 a=dsread(); //读低八位 b=dsread(); //读高八位 temp=b;
temp<<=8;
temp=temp|a; //高低八位合并
if(b > 127){ //判断温度正负,并作相应处理
temp=~temp+1; tempr=temp*0.0625;
speed=(((331.4-tempr*0.61)/1000000)*10)/2;
20
}else{
temp=temp;
tempr=temp*0.0625;
speed=(((331.4+tempr*0.61)/1000000)*10)/2;
} }
DS18B20的内部高速暂存RAM共有9字节,其中第一字节为温度值低位,第二字节为温度值高位,命令0xBE可一次读出9字节的数据,但我们只需要前两个字节。
高速暂存RAM第一、二个字节格式如图4-7所示。
tmp=tempr;
图 4-7
DS18B20出厂时默认温度配置为12位,其中最高5位为符号位,在读数据时,一次读取16位,将低11位转化为十进制数再乘以0.0625便得到所需温度值。前5位为1时,读取温度为负值,需要取反加1再乘以0.0625 才可以得到我们需要的温度值。
21
第五章 调试与测试
5.1 硬件调试
按电路图焊接电路,检查通路,上电,发现单片机未工作,再次检查电路,发现EA、ALE引脚未接高电平。连接EA、ALE引脚与电源,上电,单片机工作,但LCD显示屏无显示,调节对比度直至显示清晰字符。用万用表检查各模块电压、电流,修改电路,直至各模块工作正常,硬件调试完毕。
5.2 软件调试
软件采用 Keil 编程环境编写,检查源程序无误后,编译HEX文件,将HEX文件导入ISIS仿真环境,调试程序。
5.3 系统调试
将编译好的HEX文件写入单片机,系统上电测试,逐个检查各模块工作情况。
5.4 实际测试
系统调试完后,对测量误差和重复一致性进行多次实验分析,不断优化系统,使其达到实际使用的测量要求。
室温下进行测试(室温19℃),测量距离为0.2m-1.2m,测试作品的测量精度。试验结果如表5-1所示。
22
表 5-1
标准值/m 0.2 0.4 0.6 0.8 1.0 1.2 测距1/m 0.193 0.386 0.589 0.786 0.980 1.190 测距2/m 0.191 0.393 0.593 0.777 0.976 1.189 绝对误差1/m 绝对误差2/m 相对误差1 0.007 0.014 0.011 0.014 0.020 0.010 0.009 0.007 0.007 0.023 0.024 0.011 0.035 0.035 0.018 0.018 0.020 0.008 相对误差2 0.045 0.018 0.012 0.029 0.024 0.009
23
受电路结构限制,无法准确标定测距起点,为消除系统误差,再对数据进行一次处理。处理结果如表5-2所示。
表 5-2
标准值/m 测距1/m 测距2/m 0.2 0.4 0.6 0.8 1.0 1.2 0.193 0.386 0.589 0.786 0.980 1.190 0.191 0.393 0.593 0.777 0.976 1.189 差1 差2 绝对误差1/m 绝对误差2/m 相对误差1 相对误差2 -0.007 0.003 -0.003 -0.006 0.010 0.002 0.000 -0.016 -0.001 0.013 -0.035 0.015 -0.015 -0.030 0.050 0.010 0.000 -0.080 -0.005 0.065 0.193 0.202 0.203 0.200 0.197 0.184 0.194 0.199 0.210 0.213 综上,系统误差满足实际使用要求。
24