新闻  |   论坛  |   博客  |   在线研讨会
ADuC7026控制DS18b20源程序
mayer | 2009-06-02 18:26:08    阅读:1097   发布文章

ADuC7026控制DS18b20源程序

 

/*********************************************************************

 功能: 控制数字温度传感器DS18B20,熟悉1总线操作
  
*********************************************************************/

#include<ADuC7026.H>
#define PIN     GP2DAT = 0x00;  // 设置P2.7为输入,由于总线存在上拉电阻,所以此时是高电平1
#define POUT_0  GP2DAT = 0x80000000;  // 设置P2.7为输出,同时输出低电平0
#define POUT_1  GP2DAT = 0x80800000;  // 设置P2.7为输出,同时输出高电平1

unsigned char data_H, data_L;  
unsigned short int  data_T; 

void delay_us(int lengh)   // 微妙延时子程序
{
  int i="lengh"*9;
  while(i>0)
     i--;
}
void delay_ms(int a)   // 毫秒延时子程序
{
  int i;
  for(i=0;i<1000*a;i++)
    delay_us(1);
}

// 1总线初始化子程序
void monobus_init()    
{       
  POUT_1;          // 复位脉冲(下降沿)
  POUT_0;
  delay_us(60);   // 延时480-960us
  PIN;        // 拉高总线
  delay_us(45);    // 延时15-60us
  if((GP2DAT&0x80)==0x80)   // 判断DS18B20是否存在,如果存在会产生一个低电平60-240us
    while(1);
  PIN;             // 拉高总线
  delay_us(3);
}
//读数据子程序(先传输低位后传输高位)
unsigned char read_monobus(void)
{
  unsigned char data_18b20=0;  
  unsigned char n="1"; 
  while(n)
  {
    POUT_1;
    POUT_0;
    delay_us(1);        // 拉低总线1-3us,通知从机准备收发数据
    PIN;                // 释放总线
    delay_us(2);        // 从机在1-15us内会向总线输出数据的某一位(1或者0)
 if((GP2DAT&0x80)==0x80)
   data_18b20+=n;    // 读取总线数据
    delay_us(1);       // 等待从机释放总线
    n<<=1;
  } 
  return data_18b20;
}
//写数据子程序(先写低位再写高位)   
void write_monobus(unsigned char data)

  unsigned char n="1"; 
  while(n)
  {
    POUT_1;
    POUT_0;  
    if(data&n)
   { POUT_1;}
 else   
   POUT_0;      // 向总线写数据的某一位(1或者0)
    delay_us(60);  // 等待60us保证从机有足够的时间进行采样
    PIN;           // 释放总线    
    delay_us(2);   // 释放总线时间要大于1us   
    n<<=1;
  }
}
int DS18B20(void)  

  
         monobus_init();        // 调用初始化子程序
         write_monobus(0xCC);   // 跳过ID码匹配,适用于一个DS18B20
         
         //可以使用8条语句代替上面的那条语句依次写入8个ID码,这样就是ID码匹配了
         //如果不知道18B20的ID码,可以在总线上接入单个18B20
         //然后参考下面的读取语句,依次读取18B20的8个ID码
         //记得使用CRC8校验一下是否正确
         
         write_monobus(0x44);   // 启动温度转换          
         delay_ms(100);         // 等待转换结束
         monobus_init();        // 调用初始化子程序
         write_monobus(0xCC);   // 跳过ID码匹配
         write_monobus(0xBE);   // 通知DS18B20,准备读数据

         data_L=read_monobus();   // 读取第一个数据(温度低字节)
         data_H=read_monobus();   // 读取第二个数据(温度高字节)
         
         //此时如果有需要可以继续读取第三个到第九个RAM数据    
         data_T=data_H*256+data_L;   // 合并后得到原始温度数据
         
         if(data_H>15)
     data_T=(~data_T+1)/16;
   else
     data_T/=16;            // 计算实际温度
  
   return data_T;
      
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客