打印
[51单片机]

ds18b20里的 温度值正负判断 为什么要判断大于6348

[复制链接]
6218|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hfuter|  楼主 | 2013-8-1 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
叶伤| | 2013-8-2 07:44 | 只看该作者
6348=18CCH=0001 1000 1100 1100,怎么看都不像最高位判断,你到底是怎么读出来的,前面对数据进行了什么变换,你不说清楚这没法玩。

一般是直接取最高位判断就行了,就是比较第12位,没必要去判断>140算负(8C也可以认为-116),在负整数里数越大(负号后面的数越小)它的二进制数越大,所以你这样判断也可以,毕竟1820最高到125,你用大于140判断,这是特殊情况特殊对待。换个芯片可能就不行了。

俺进制这方面还不行,一直开着计算器换算,唉

使用特权

评论回复
板凳
568581185| | 2013-8-2 10:00 | 只看该作者
这个判断还真没见过呢,呵呵

使用特权

评论回复
地板
coody| | 2013-8-2 10:35 | 只看该作者
个人爱好吧,一般是判断负数

使用特权

评论回复
5
ningling_21| | 2013-8-2 13:09 | 只看该作者
看不懂
也可以这样判断:
if((MSB&0XF8)==X0F8)//满足为负温度
........

使用特权

评论回复
6
hfuter|  楼主 | 2013-8-2 21:16 | 只看该作者
叶伤 发表于 2013-8-2 07:44
6348=18CCH=0001 1000 1100 1100,怎么看都不像最高位判断,你到底是怎么读出来的,前面对数据进行了什么变 ...

网上好多这种程序,这个6348就是出自这些程序
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define Disdata  P0         // 段码入口
sbit DQ=P3^7;               // 温度输入口
uint temp;                  // variable of temperature  定义一个变量
uchar flag1;                // 定义一个标志,标志温度是负还是正,1为负,0为正
sbit DIN=P0^7;              // 小数点控制  
#define  discan  P2         // 数码管位选扫描
uchar h;                    // 定义变量

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};  
//共阳数码管段码表           "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "灭"  "-"

uchar data temp_data[2]={0x00,0x00};//读出温度暂放

uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用

uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数部分对应十进制   "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "A"  "B"  "C"  "D"  "E"  "F"

uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};    //列扫描控制字

/*******************************************************************
*函数名称:void delay(uint i)                                                               *
*函数功能:延时子程序                                                                                    *
*形式参数:i                                                                                                             *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
void delay(uint i)      //delay   
   {
      while(i--);
   }

/*******************************************************************
*函数名称:void Init_DS18B20(void)                                                            *
*函数功能:初始化函数                                                                                    *
*形式参数:无                                                                                                             *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
//初始化函数
void Init_DS18B20(void)
{
        uchar x=0;
        DQ = 1; //DQ复位
        delay(8); //稍做延时
        DQ = 0; //单片机将DQ拉低
        delay(80); //精确延时 大于 480us
        DQ = 1; //拉高总线
        delay(14);
        x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay(20);
}
/*******************************************************************
*函数名称:uchar ReadOneChar(void)                                                            *
*函数功能:读一个字节                                                                                    *
*形式参数:无                                                                                                             *
*返回参数:dat                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
uchar ReadOneChar(void)
{
        uchar i=0;
        uchar dat = 0;
        for (i=8;i>0;i--)
        {
                DQ = 0; // 给脉冲信号
                dat>>=1;
                DQ = 1; // 给脉冲信号
                if(DQ)  dat|=0x80;
                delay(4);
        }
        return(dat);
}
/*******************************************************************
*函数名称:void WriteOneChar(uchar dat)                                                        *
*函数功能:写一个字节                                                                                    *
*形式参数:dat                                                                                                             *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
void WriteOneChar(uchar dat)
{
        uchar i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;
                delay(5);
                DQ = 1;
                dat>>=1;
        }
}
/*******************************************************************
*函数名称:void tmpchange(void)                                                                           *
*函数功能:发送温度转换命令                                                                                     *
*形式参数:无                                                                                                           *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/   
void tmpchange(void)          // DS18B20 begin change   
{
  Init_DS18B20();             // 初始化DS18B20
  delay(200);                 // 延时
  WriteOneChar(0xcc);         // 跳过序列号命令
  WriteOneChar(0x44);         // 发送温度转换命令
}
/*******************************************************************
*函数名称:uint tmp()                                                                                   *
*函数功能:读出温度函数                                                                                          *
*形式参数:无                                                                                                           *
*返回参数:temp                                                                                                             *
*使用说明:无                                                                                                           *
*******************************************************************/  
uint tmp()                    //get the temperature
{
//  float tt;
  Init_DS18B20();             // 初始化ds18b2子函数  
  delay(1);
  WriteOneChar(0xcc);         // 跳过ROM命令
  WriteOneChar(0xbe);         // 发送读取数据命令
  temp_data[0]=ReadOneChar(); // 连续读两个字节数据
  temp_data[1]=ReadOneChar();
  temp=temp_data[1];
  temp<<=8;                                                
  temp=temp|temp_data[0];     // 两字节合成一个整型变量。
//  tt=temp*0.0625;           // 得到真实十进制温度值,因为DS18B20
                              // 可以精确到0.0625度,所以读回数据的最低位代表的是
                              // 0.0625度。
//  temp=tt*10+0.5;           // 放大十倍,这样做的目的将小数点后第一位
                              // 也转换为可显示数字,同时进行一个四舍五入操作。
  return temp;                // 返回温度值
}

/*******************************************************************
*函数名称:void tem_deal(uint tem)                                                                   *
*函数功能: 温度数据显示处理函数                                                                      *
*形式参数:无                                                                                                           *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
void tem_deal(uint tem)
  {
/*************温度数据处理*****************/
   if(tem>6348)                       // 温度值正负判断
     {
                 tem=65536-tem;
                 flag1=1;
         }         // 负温度求补码,标志位置1
   Dis_play[4]=tem&0x0f;           // 取小数部分的值
   Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值

   Dis_play[4]=tem>>4;             // 取中间八位,即整数部分的值
   
   Dis_play[3]=Dis_play[4]/100;    // 取百位数据暂存
   Dis_play[1]=Dis_play[4]%100;    // 取后两位数据暂存                                     
   Dis_play[2]=Dis_play[1]/10;     // 取十位数据暂存
   Dis_play[1]=Dis_play[1]%10;     // 取个位数据暂存

   if(!Dis_play[3])       // 最高位为0都不显示
   {
        Dis_play[3]=0x0a;   // 先判断百位是否为0
                if(!Dis_play[2])
                {
                 Dis_play[2]=0x0a; // 再判断十位是否为0
                }
   }
   if(flag1)
   {
      Dis_play[3]=0x0b;    // 为负数时,最高位显示 "-"
   }
  }
/*******************************************************************
*函数名称: void display()                                                                          *
*函数功能: 温度数据显示                                                                              *
*形式参数:无                                                                                                           *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
void display()
  {
  char k;
  for(k=0;k<4;k++)                     //4位LED扫描控制
  {
           Disdata=table[Dis_play[k]];          //数据显示
           if (k==1)
                   DIN=0;                  //小数点显示
           else
                   DIN=1;
           discan=scan_con[3-k];                 //位选
           delay(90);                          //延时
           discan=0xf;
  }
  }

/*******************************************************************
*函数名称:void main (void)                                                                                   *
*函数功能:主函数                                                                                                     *
*形式参数:无                                                                                                           *
*返回参数:无                                                                                                              *
*使用说明:无                                                                                                           *
*******************************************************************/
void main(void)
{
  Disdata=0xff;   //端口初始化
  P2=0xff;
   do
   {
     tmpchange();      //温度转换
     tem_deal(tmp());  //显示温度值
     //display();
        // display();
         display();
   }
     while(1);
}

使用特权

评论回复
7
hfuter|  楼主 | 2013-8-2 21:17 | 只看该作者
coody 发表于 2013-8-2 10:35
个人爱好吧,一般是判断负数

为什么这么判断负数???

使用特权

评论回复
8
coody| | 2013-8-5 11:23 | 只看该作者
hfuter 发表于 2013-8-2 21:17
为什么这么判断负数???

那得问写程序的人。我一般就是按标准的负号来判断,即最高位为1。

使用特权

评论回复
9
highgear| | 2013-8-5 11:29 | 只看该作者
估计6348是一个经验值,温度为0度时tem的数值

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hfuter + 1 很给力!
10
yaoyuanytu| | 2013-8-8 16:35 | 只看该作者
还是按DATASHEET上的来操作吧 这样清楚些,这个数据是个人的喜好,只有当事人之间清楚。

使用特权

评论回复
11
hfuter|  楼主 | 2013-9-5 16:09 | 只看该作者
还是百度知道上的这个好啊 ,,这个地址 :zhidao.baidu.com/question/576118682.html?quesup2&oldq=1

使用特权

评论回复
12
outstanding| | 2013-9-6 09:02 | 只看该作者
判断高位不就可以么

使用特权

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

本版积分规则

6

主题

31

帖子

0

粉丝