新人请教为什么采集来的温度与预设对比会出错?

[复制链接]
1645|10
手机看帖
扫描二维码
随时随地手机跟帖
binsea|  楼主 | 2011-2-3 23:07 | 显示全部楼层 |阅读模式
我是新手,请大家不要笑话我。

我用的AT89c52 + ds18b20 +继电器 想从采集来的温度与我预设的温度对比,如果超出预设温度,那么就关断继电器。但是在仿真的过程中发现升高18b20温度后,继电器那个引脚的电平没有任何动作。

温度的采集与显示是从网上找的现成的,可以正常显示,具体内容我不放出来了。我把 主程序放出来,大家帮我看看哪里错了?
 
#include <reg52.H>
#include<intrins.h>
#include <math.H>  
sbit ds = P2^2; //ds18b20
sbit jdq = P2^3;   //继电器
int tempValue;     //温度值
int settemp=35;  //预设温度
void main()
  {
     unsigned char i;
     while(1)
      {
         
         sendChangeCmd();  //启动温度转换
  tempValue = getTmpValue(); //读取温度
         //显示5次
         for(i = 0; i < 40; i++)
          {
             display(tempValue); //显示到数码管
         }
         
   if (tempValue < settemp)  //这一部分是我自己加的,如果没有这一部分,读取和现实都很正常
   jdq=0;  
   else
   jdq=1;
     }
}


我开始以为是变量的数据类型不一致导致对比错误,但是改来改去都没作用。把温度调至超过35度,P2.3的点位一点变化都没有,一直是高电平。当我把温度调至0度一下的时候才会变成低电平,不知道为什么?

相关帖子

chunyang| | 2011-2-3 23:09 | 显示全部楼层
你要先读懂程序,最好的方法是画程序流程图,其实懂得画流程图,编程根本就不是问题。

使用特权

评论回复
binsea|  楼主 | 2011-2-3 23:20 | 显示全部楼层
我是刚刚学习,看了很多书在学习,C语言的框架能够看懂,就是单片机的一些指令有点一知半解。

下面是 读取温度的函数:

int getTmpValue()
  {
     unsigned int tmpvalue;
     int value; //存放温度数值
     float t;
     unsigned char low, high;
     sendReadCmd();
     //连续读取两个字节数据
     low = readByte();
     high = readByte();
     //将高低两个字节合成一个整形变量
     //计算机中对于负数是利用补码来表示的
     //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
     tmpvalue = high;
     tmpvalue <<= 8;
     tmpvalue |= low;
     value = tmpvalue;
     
     //使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
     t = value * 0.0625;
     //将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
     //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
     //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
     return value;
}

使用特权

评论回复
NE5532| | 2011-2-4 11:36 | 显示全部楼层
建议你别仿真了,硬件上不对再来问。

使用特权

评论回复
ZMing_PH| | 2011-2-4 17:43 | 显示全部楼层
建议单步调试,看看各个值的变化,找出问题,同是新手。。。

使用特权

评论回复
dtmcp| | 2011-2-4 17:51 | 显示全部楼层
温度要加滞环控制,这是最起码的常识

使用特权

评论回复
binsea|  楼主 | 2011-2-4 19:24 | 显示全部楼层
温度要加滞环控制,这是最起码的常识
dtmcp 发表于 2011-2-4 17:51


你好,我是新手,滞缓控制 是什么意思?能不能说的通俗一点? 再一个我觉得显示采集来的温度已经正常,而且我看了很多遍, 采集来的温度是个可以和10进制数直接对比的量。找不出什么问题了啊?

使用特权

评论回复
binsea|  楼主 | 2011-2-4 19:26 | 显示全部楼层
建议单步调试,看看各个值的变化,找出问题,同是新手。。。
ZMing_PH 发表于 2011-2-4 17:43


首先握个手。

这个程序里面有一个等待 18b20应答的,在KEIL里面没法给他一个应答,程序就在那里走不过去了,它的值一直是 0x0000,不知道为什么变量是双字节的。

使用特权

评论回复
XXXxingXXX| | 2011-2-4 22:39 | 显示全部楼层
我同为新手,看了一下程序,没发现问题。你确定18b20接对了吧!

使用特权

评论回复
mohanwei| | 2011-2-5 11:56 | 显示全部楼层
按照你对温度值的定义,你应该把“int settemp=35;  //预设温度”改成:
int settemp=3500;  //即35.00摄氏度

使用特权

评论回复
binsea|  楼主 | 2011-2-6 22:21 | 显示全部楼层
谢谢楼上的,得到了正确答案。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

34

帖子

1

粉丝