微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 急求解答、关于温度

急求解答、关于温度

时间:10-02 整理:3721RD 点击:
temperature=tmrtemp()+256;    在主程序里面,为什么要加256?
附上有关的两个函数、详细登陆http://wenku.baidu.com/view/90942eda551810a6f52486ce.html !
uchar tmrtemp(void)     //读取温度transform read temperature
{
uchar a,b;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe);    //读内部RAM中9字节的内容
a=tmrbyte();    //LSB低八位
b=tmrbyte();       //LSB高八位
y3=b;
y3<<=8;
y3=y3|a;
ff=y3*0.0625;
y3=ff*10+0.5;
return(y3);
}

void main(void)      //主程序
{
uint temperature;
dianji=0;
tmstart();    //初始化DS18B20
dmsec(450);      
while(1)
{
tmstart();      //DS18B20开始初始化
dmsec(2);
temperature=tmrtemp()+256;  //读取温度
shi=temperature/100;
ge=(temperature%100)/10;
xiaoshu=(temperature%100)%10;
keyscan();
dmsec(2);
deal(temperature/10);
dianjik();
}
}

没人解答,有木有人呀

求老饼来拯救菜鸟

给你一个在我的开发板完美运行的正确程序自己看吧/*************************************************
                  
   
/**************************************************
*程序名称:shumaguan.c
*程序功能:实时采集当前环境温度值,并显示于数码管上,数码管前三位显示数值,第四位显示单位
*程序说明:18B20的数据口为P3^6,数码管的数据口为P1,段选,位选为P3^4,P 3^5
**************************************************/
#include <reg52.h>                //头文件
#define uchar unsigned char                //宏定义
#define uint unsigned int
sbit DS=P3^6;           //定义18B20的信号端
uint temp;             // 定义一变量,存储温度值
sbit dula=P3^4;                        //数码管的位选,段选
sbit wela=P3^5;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                        //数码管的数字编码,0-F
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={        //数码管的数字编码,0-9(与table[]的区别是,这些数带小数点)
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
uchar A1,A2,A2t,A3;
sbit boop=P3^7;
/**************************************************
*名称:void delay(uint count)
*功能:延时函数,用来延迟时间
*入口参数:count
*出口参数:无
*说明:通过不断地执行空语句,来延迟时间(延时可以用延时语句,也可以用定时器产生中断来延迟时间,此例属于延时语句)
*范例:void delay(uint xms);
**************************************************/
void delay(uint count)     
{
  uint i,j;
        for(i=count;i>0;i--)
                for(j=103;j>0;j--);
  
}
/**************************************************
*名称:void dsreset(void)
*功能:18B20的复位函数,18B20使用时一定要初始化
*入口参数:无
*出口参数:无
*说明:请参照18B20的时序图,看程序
*范例:void dsreset(void);
**************************************************/
void dsreset(void)      
{
  DS=0;                                //先让ds为低电平
  delay(1);                        //延迟一段时间
  DS=1;                                //拉高
  delay(1);                        //延时
}
/**************************************************
*名称:   bit tmpreadbit(void)
*功能:    从18B20读一位二进制数据,
*入口参数:无
*出口参数:dat
*说明:请参照18B20的读数据的时序图,看程序
*范例:bit tmpreadbit(void));
**************************************************/
bit tmpreadbit(void)   
{
   uint i;
   bit dat;                                        //定义返回值,注意类型       
   DS=0;i++;                  //短暂的延时,此时不用延时函数
   DS=1;i++;i++;                        //短暂的延时,期间单片机会对总线上的数据进行采样,获取数据值
   dat=DS;                                        //将获得的数值返回给dat
   i=8;while(i>0)i--;        //延时
   return (dat);
}
/**************************************************
*名称:   uchar tmpread(void)
*功能:    从18B20读一个字节的数据函数
*入口参数:无
*出口参数:dat
*说明:请参照18B20的读数据的时序图,看程序
*范例:uchar tmpread(void);
**************************************************/
uchar tmpread(void)   
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}
/**************************************************
*名称:  void tmpwritebyte(uchar dat)
*功能:   向18B20写一个字节的数据
*入口参数:dat
*出口参数:无
*说明:请参照18B20的读数据的时序图,看程序
*范例:void tmpwritebyte(uchar dat);
**************************************************/
void tmpwritebyte(uchar dat)   
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}
/**************************************************
*名称:   void tmpchange(void)
*功能:    18B20开始获取温度并转换,温度值存储在18B20的寄存器中
*入口参数:无
*出口参数:无
*说明:注意18B20的有关命令。
*范例:void tmpchange(void)
**************************************************/
void tmpchange(void)  
{
  dsreset();                                //先初始化
  delay(1);                                        //延时一会
  tmpwritebyte(0xcc);  // 跳过ROM,直接向18B20发温度变换命令,
  tmpwritebyte(0x44);  //  开始温度转换
}
/**************************************************
*名称:  uint tmp()
*功能:   从18B20的寄存器中读取温度
*入口参数:无
*出口参数:temp
*说明:注意18B20的有关命令。
*范例:uint tmp();
**************************************************/
uint tmp()     
{
  float tt;                                //定义一个浮点型数据
  uchar a,b;
  dsreset();                        //初始化
  delay(1);                                //延时一会
  tmpwritebyte(0xcc);        //跳过ROM,使用于只有一个18B20
  tmpwritebyte(0xbe);        //读暂存器
  a=tmpread();                                //读低八位,
  b=tmpread();                                //读高八位
  temp=b;
  temp<<=8;             //temp是个16位的数据,将b的值放在高八位,然后再将a的值放在低八位,组成一个十六位的数据
  temp=temp|a;
  tt=temp*0.0625;                        //temp*0.0625就是实际温度值,出厂时默认配置为12位,分辨率为0.0625,
  temp=tt*10+0.5;                        //转化为整数,加0.5表示四舍五入。经过temp=tt*10+0.5;后
  return temp;                                //假如实际温度为25.583度,现在temp的数值为256,如果不加0.5,则为255,由于只取前三位将会有较大的误差
}

/**************************************************
*名称:  void display(uint temp)
*功能:   在数码管上显示数据
*入口参数:temp
*出口参数:无
*说明:注意18B20的有关命令。
*范例:void display(uint temp);
**************************************************/
void display(uint temp)               
{       
   A1=temp/100;                        //以上面的数为例,temp为256,则A1为2
   A2t=temp%100;                        //A2T为56
   A2=A2t/10;                                //A2为5,
   A3=A2t%10;                                //A3为6
   dula=0;                                       
   P1=table[A1];                        //显示第一位
   dula=1;
   dula=0;
   wela=0;
   P1=0xfe;                       
   wela=1;
   wela=0;
   delay(1);                                //延时,时间太长会导致闪烁,时间太短,会导致有重影
   dula=0;
   P1=table1[A2];                        //显示第二位,注意这个数需要带小数点,用的是table1[]
   dula=1;
   dula=0;
   wela=0;
   P1=0xfd;
   wela=1;
   wela=0;
   delay(1);
   P1=table[A3];                //显示第三位
   dula=1;
   dula=0;
   P1=0xfb;
   wela=1;
   wela=0;
   delay(1);
        dula=0;
   P1=table[12];                //显示C,作为单位
   dula=1;
   dula=0;
   wela=0;
   P1=0xf7;
   wela=1;
   wela=0;
   delay(1);
}

void main()                        //主函数
{
        while(1)
        {
                tmpchange();
                display(tmp());
   }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top