原创 刚学了一点18B20

2008-7-10 19:24 2123 4 4 分类: MCU/ 嵌入式

这个程序是在学习板上完成的


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


sbit DS="P2"^2;           //define interface 定义DS18B20接口
sbit dula="P2"^6;
sbit wela="P2"^7;


uint temp;             // variable of temperature
uchar flag1;            // sign of the result positive or negative



unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。


unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点编码。


void delay(uint count)      //delay
{
  uint i;
  while(count)
  {
    i="200";
    while(i>0)
    i--;
    count--;
  }
}


void dsreset(void)       //send reset and initialization command
{
  uint i;                //DS18B20初始化
  DS="0";
  i="103";
  while(i>0)i--;
  DS="1";
  i="4";
  while(i>0)i--;
}


 


bit tmpreadbit(void)       //read a bit 读一位
{
   uint i;
   bit dat;
   DS="0";i++;          //i++ for delay  小延时一下
   DS="1";i++;i++;
   dat="DS";
   i="8";while(i>0)i--;
   return (dat);
}


uchar tmpread(void)   //read a byte date 读一个字节
{
  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)   //write a byte to ds18b20
{                           //写一个字节到DS18B20里
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb="dat"&0x01;
    dat="dat">>1;
    if(testb)     //write 1    写1部分
    {
      DS="0";
      i++;i++;
      DS="1";
      i="8";while(i>0)i--;
    }
    else
    {
      DS="0";       //write 0   写0部分
      i="8";while(i>0)i--;
      DS="1";
      i++;i++;
    }
  }
}


 


void tmpchange(void)  //DS18B20 begin change 发送温度转换命令
{
  dsreset();             //初始化DS18B20
  delay(1);             //延时
  tmpwritebyte(0xcc);  // 跳过序列号命令
  tmpwritebyte(0x44);  //发送温度转换命令
}


uint tmp()               //get the temperature 获得温度


{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  
  tmpwritebyte(0xbe);    //发送读取数据命令
  a="tmpread"();          //连续读两个字节数据
  b="tmpread"();
  temp="b";
  temp<<=8;             //two byte  compose a int variable
  temp="temp|a";         //两字节合成一个整型变量。
  tt="temp"*0.0625;       //得到真实十进制温度值,因为DS18B20


//可以精确到0.0625度,所以读回数据的最低位代表的是


//0.0625度。


  temp="tt"*10+0.5;   //放大十倍,这样做的目的将小数点后第一位


//也转换为可显示数字,同时进行一个四舍五入操作。


  return temp;     //返回温度值
}



void display(uint temp)              //显示程序
{
   uchar A1,A2,A2t,A3,ser;
   ser="temp/10";           //分离出三位要显示的数字
   SBUF="ser";
   A1=temp/100;
   A2t=temp%100;
   A2=A2t/10;
   A3=A2t%10;
   dula="0";
   P0=table[A1];       //显示百位
   dula="1";
   dula="0";


   wela="0";
   P0=0xfb;
   wela="1";
   wela="0";
   delay(1);


   dula="0";


   P0=table1[A2];          //显示十位 带小数点的
   dula="1";
   dula="0";
   wela="0";
   P0=0xfd;
   wela="1";
   wela="0";
   delay(1);


   P0=table[A3];       //显示个位
   dula="1";
   dula="0";
   P0=0xfe;
   wela="1";
   wela="0";
   delay(1);
}


void main()               //主函数


{
 while(1)
 {
     tmpchange();      //温度转换
 
  display(tmp());   


 }


}

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条