单片机课程设计报告
4.2.6.读取测量结果
/*----------------- 读取温度值 -----------------*/ void RdTemp(void) {
short int temp; uint x; bit flag = 1;
TxReset(); //初始化DS18B20 RxWait(); //等待DS18B20应答 Delay(125); //延时
WrByte(0xcc); //跳过ROM命令 WrByte(0xbe); //读暂存存储器命令
templow = RdByte(); //温度值低字节,低4位为小数 temphigh = RdByte(); //温度值高字节
temp = (temphigh << 8) | templow; //温度为16位补码 if(temp<0) //负温度 {
flag = 0; temp = ~temp + 1; }
tempzheng = temp >> 4; //温度值整数 x = temp & 0x000f;
tempxiao = (x*10)/16; //温度值小数 if(flag) //正温度
disp[0] = tempzheng/100; //百位 else //负温度
disp[0] = 16; //负号
disp[1] = (tempzheng0)/10; //十位 disp[2] = tempzheng; //个位
12
单片机课程设计报告
disp[3] = tempxiao; //小数 }
4.2.7.各算法流程图
初始化 发DS18B20复位命令 调用显示子程序 发跳过ROM命令 N 1S到? Y Y 初次上电 N 读出温度值温度计算处理显示数据刷新 发读取温度命令 读取操作,CRC校验 Y N 9字节完? Y CRC校验正?N 移入温度暂存器 发温度转换开始命令
结束 图 4.2.7.1 主程序流程图 图4.2.7.2 读温度流程图
13
单片机课程设计报告
温度数据移入显示寄存器 N 发DS18B20复位命令 十位数0? Y 发跳过ROM命令 百位数0? Y 十位数显示符号百位数不显示 百位数显示数据(不显示符号) N 发温度转换开始命令 结束
结束 图4.2.7.3 温度转换流程图 图4.2.7.5显示数据刷新流程图
开始 N 温度零下? Y 温度值取补码置“—”标志 计算小数位温度BCD值 计算整数位温度BCD值 结束 置“+”标志 图4.2.7.4 计算温度流程图
4.3 数码管显示
/*---------------- 数码管显示 -----------------*/ void Display() {
uchar i,j;
14
单片机课程设计报告
j=0x08;
for(i=0;i<4;i++) {
P1=j; //数码管位码输出 LOCK=1; //打开锁存
if(i==2) P0=led[disp[i]]|0x01; //显示小数点 else P0=led[disp[i]]; //数码管段码输出 LOCK=0; //关闭锁存 j=j>>1; //调整位码 Delay(125); P0=0x00; } }
5 系统的测试和总结
5.1 测试时的图片
图5.1.1温度传感器图
5.1.2测试时室内温度显示图 5.1.3测试时手握住传感器时的温度显示
5.2 总结
通过此次课程设计,使我更加扎实的掌握了有关基于单片机的数字温度计设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍所在,
15

