Board logo

标题: LPC2210上用DS18B20的测温源程序 [打印本页]

作者: m1_ljp    时间: 2013-3-15 14:18     标题: LPC2210上用DS18B20的测温源程序

这是我在LPC2210上用DS18B20的测温源程序
一直在测量我家的室外温度 一切正常~

#include "config.h"

uint8   count;
fp32    tmax,tmin;

/************延时程序****************/
void DelayuS(uint32 dly)           //延时约9uS
{
  uint32 i;
  
  for(;dly>0;dly--)
    i++;// for(i=0;i<1;i++);   
}


/*********DS1820初始化****************/
int Init_DS1820(void)
{
  uint8 i;
  
  IO0DIR=IO0DIR|0x02000000;     //设置P0.25为输出
  IO0CLR=1<<25;                 //P0.25清零
  DelayuS(60);                 //延时480~960uS
  
  IO0DIR=IO0DIR&0xFDFFFFFF;     //设置P0.25为输入
  DelayuS(2);                    //延时16uS
  i=(IO0PIN&0x02000000)>>25;
  DelayuS(15);                 //延时60~240uS  
  return(i);
}


/********向DS1820写数据************/
void Wr_DS1820(uint8 dat)
{
  uint8 i;
  
  for(i=8;i>0;i--)
  {
    IO0DIR=IO0DIR|0x02000000;     //设置P0.25为输出
    IO0CLR=1<<25;                 //P0.25清零
    IO0PIN=((dat&0x01)<<25)|0xFDFFFFFF;   //向P0.25写入位数据
    DelayuS(2);                 // 延时15~60uS
    IO0SET=1<<25;                 //P0.25置位
    dat>>=1;
  }
}

/********从DS1820中读取数据***************/
int Rd_DS1820(void)
{
  uint8 i;
  uint8 dat;
  
  for(i=8;i>0;i--)
  {
    IO0DIR=IO0DIR|0x02000000;     //设置P0.25为输出
    IO0CLR=1<<25;                 //P0.25清零   
    dat=dat>>1;
    IO0DIR=IO0DIR&0xFDFFFFFF;     //设置P0.25为输入   
    if(1==(IO0PIN>>25)&0x00000001)
      dat|=0x80;
     i=i;                         //延时
  }
  return(dat);
}


/************温度测量任务*****************/
void TmptMeas(void *pdata)
{
  INT8U  dat1,dat2;
  INT16S t;
  FP32   temp;
  char   str[8];
  
  pdata=pdata;
  tmax=12;
  tmin=12;
  
  for(;;)
  {
    if((Init_DS1820())==0)
    {   
      Wr_DS1820(0xCC);
      Wr_DS1820(0x44);
      OSTimeDlyHMSM(0,0,1,0);
      Init_DS1820();
      Wr_DS1820(0xCC);
      Wr_DS1820(0xBE);
      dat1=Rd_DS1820();
      dat2=Rd_DS1820();
      
      t=dat2;
      t<<=8;
      t=t|dat1;
      temp=t*0.0625;                    //计算温度 并显示
     
      sprintf(str,"%f",temp);
      LCD_WS(2,12,(INT8U*)str);

      if((temp>-40)&&(temp<120))
      {   
        if(temp>tmax)                     //记录最高温度
          tmax=temp;
        if(temp<tmin)                     //记录最低温度
          tmin=temp;
        sprintf(str,"%f",tmax);
        LCD_WS(0,13,(INT8U*)str);
        sprintf(str,"%f",tmin);
        LCD_WS(15,13,(INT8U*)str);      
      }
      else
      {   
         count++;
         sprintf(str,"%d",count);
         LCD_WS(20,12,(INT8U*)str);
      }

    }
   
    OSTimeDlyHMSM(0,0,1,0);
  }
}





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0