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

[复制链接]
3287|10
 楼主| binsea 发表于 2011-2-3 23:07 | 显示全部楼层 |阅读模式
我是新手,请大家不要笑话我。

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

温度的采集与显示是从网上找的现成的,可以正常显示,具体内容我不放出来了。我把 主程序放出来,大家帮我看看哪里错了?

  1. #include <reg52.H>
  2. #include<intrins.h>
  3. #include <math.H>  
  4. sbit ds = P2^2; //ds18b20
  5. sbit jdq = P2^3;   //继电器
  6. int tempValue;     //温度值
  7. int settemp=35;  //预设温度
  8. void main()
  9.   {
  10.      unsigned char i;
  11.      while(1)
  12.       {
  13.          
  14.          sendChangeCmd();  //启动温度转换
  15.   tempValue = getTmpValue(); //读取温度
  16.          //显示5次
  17.          for(i = 0; i < 40; i++)
  18.           {
  19.              display(tempValue); //显示到数码管
  20.          }
  21.          
  22.    if (tempValue < settemp)  //这一部分是我自己加的,如果没有这一部分,读取和现实都很正常
  23.    jdq=0;  
  24.    else
  25.    jdq=1;
  26.      }
  27. }


我开始以为是变量的数据类型不一致导致对比错误,但是改来改去都没作用。把温度调至超过35度,P2.3的点位一点变化都没有,一直是高电平。当我把温度调至0度一下的时候才会变成低电平,不知道为什么?
chunyang 发表于 2011-2-3 23:09 | 显示全部楼层
你要先读懂程序,最好的方法是画程序流程图,其实懂得画流程图,编程根本就不是问题。
 楼主| binsea 发表于 2011-2-3 23:20 | 显示全部楼层
我是刚刚学习,看了很多书在学习,C语言的框架能够看懂,就是单片机的一些指令有点一知半解。

下面是 读取温度的函数:

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

粉丝
快速回复 在线客服 返回列表 返回顶部