打印
[ZLG-ARM]

那里有DS18B20 LPC2148驱动程序下载呀?

[复制链接]
2764|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fang2001|  楼主 | 2010-1-22 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
txm2006| | 2010-1-22 16:23 | 只看该作者
//给你一个LPC2103的,修改一下即可,12M晶体.主频60M
#include "LPC2103.h"                       

typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned long  DWORD;
typedef unsigned int   BOOL;

//------------------------------------------------------------------
//参数设置区
//------------------------------------------------------------------
#define DQ     1 << 7         // P0.7 控制  读取温度

//函  数: delay1u
//功  能: 延时t uS
//输  入: unsigned long t
//输 出:     无
//全局变量:   无
//调用模块:   无
void delay1u(unsigned long t)
{
T1PR   = 0x00000000;   //Load prescaler
  T1TCR  = 0x00000003;   //Reset counter and prescaler
  T1MCR  = 0x00000003;   //On match reset the counter and generate an interrupt
  T1MR0  = t*0x0f;       //Set the cycle time
  T1TCR  = 0x00000001;   //enable timer
  while((T1IR & 0x01) == 0);
  T1IR = 0x01;
  T1TCR  = 0x00000000;
}

//-------------------------------------------------
//            DS18B20温度读取部分
//-------------------------------------------------
//函  数: Init_DS18B20
//功  能: DS18B20初始化设置
//输  入:     无
//输 出:     无
//全局变量:   无
//调用模块:   无
BYTE Init_DS18B20(void)
{
  IODIR |= DQ;
  IOSET = DQ;              
  delay1u(48);             //稍做延时
  IOCLR = DQ;              //将DQ拉低
  delay1u(650);            //精确延时 大于 480us 480
  IODIR = IODIR&(~DQ);     //拉高总线输入
  delay1u(80);             //64
  //num = IOPIN&DQ;        //稍做延时后 如果x!=0则初始化失败 x=0则初始化成功
  if(IOPIN&DQ==0)
  {
   num=0;
  }
  else
  {
   num=1;
  }
  
  delay1u(200);             //300
  return num;
}
//函  数: WriteOneChar
//功  能: 向DS18B20写一个字节
//输  入: BYTE dat
//输 出:     无
//全局变量:   无
//调用模块:   无
void WriteOneChar(BYTE dat)
{
  BYTE i=0;
  for (i=8; i>0; i--)
  {
    IODIR |= DQ;         //改回输出
    IOCLR = DQ;
    delay1u(2);
    if(dat&0x01)
    {
      IODIR &= (~DQ);    //释放总线
    }
    else
    {   
      IOCLR = DQ;
    }
    delay1u(60);
    IODIR &= (~DQ);      //改回输入
    delay1u(2);
    dat>>=1;
  }
}
//函  数: ReadOneChar
//功  能: 从DS18B20读一个字节
//输  入:     无
//输 出: BYTE dat
//全局变量:   无
//调用模块:   无
BYTE ReadOneChar(void)
{
  BYTE i=0;
  BYTE dat = 0;
  for (i=8;i>0;i--)
  {
    dat>>=1;
    IODIR |= DQ;        //改回输出
    IOCLR = DQ;         // 给脉冲信号
    delay1u(2);
    IODIR = IODIR&(~DQ); // 拉高总线输入
    delay1u(12);
    if(IOPIN&DQ)
    dat|=0x80;
    delay1u(60);
  }
  return dat;
}
//函  数: read_temp
//功  能: 读温度值
//输  入:     无
//输 出:     无
//全局变量:   无
//调用模块:   无
//****延时中不能一直处于等待中断中间不能做任何事情***/
unsinged int Get_Temp(void)
{
  unsigned int temp;
  unsigned char num1;
  unsigned char  a=0;              //温度值低位
  unsigned char  b=0;              //温度值高位
  num0 = Init_DS18B20();
  WriteOneChar(0xCC);    // 跳过读序号列号的操作
  WriteOneChar(0x44);    // 启动温度转换
  delay1u(900000);       // 延时0.9S
  num1 = Init_DS18B20();
  WriteOneChar(0xCC);    // 跳过读序号列号的操作
  WriteOneChar(0xBE);    // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  a=ReadOneChar();
  b=ReadOneChar();
  temp=(b<<4)|(a>>4);
  return(temp);
}

int main(void)
{
   unsigned int Temp_Data;
   Temp_Data=Get_Temp();
}

}

使用特权

评论回复
板凳
txm2006| | 2010-1-22 16:24 | 只看该作者
不好意思,下面多了一个 “}”

使用特权

评论回复
地板
txm2006| | 2010-1-22 16:26 | 只看该作者
BYTE Init_DS18B20(void)
函数中增加
BYTE num;

使用特权

评论回复
5
午夜粪车| | 2010-2-3 21:29 | 只看该作者
到源码区看看

使用特权

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

本版积分规则

33

主题

53

帖子

1

粉丝