pingfang 字体下载:DS18B20的c读写程序

来源:百度文库 编辑:中财网 时间:2024/05/08 09:46:50
DS18B20的c读写程序(转)2009-05-08 17:55

//这是一个温度采集模块的驱动程序。
/*
    |----|
    | DS |   DS18B20管脚排列
    +----+
    | | |
    | | |
    | | |----------Vdd       
    | |------------DQ-->P0.0
    |---------------GND
*/

//--------------delay.c--------------------
void delay(unsigned int delay_time)   //延时子程序
{for(;delay_time>0;delay_time--)
{}
}
//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44 //开始温度转换
#define T_CONFIG 0x5f //11位转换
#define T_READ 0xbe    //读暂存器
#define T_WRITE 0x4e   //写暂存器
#define T_ROM_JMP 0xcc //忽略64ROM地址
#define T_COPY_E2 0x48 //将温度上下限数值写到E2ROM
#define T_RECALL_E2 0xb8 //将E2中存储的温度上下限数值复制到上下限寄存器中。
#define T_cont 0.0625 //温度转换常数
//------------------------------------------------------
sbit DQ=P3^4; //DS18B20数据输出端
sbit LED=P3^2; //LED
bit REC_suc=0; //DS18B20成功复位标志位
bit T_sign;   //温度正负符号
float temp=0; //转换好的温度数值
signed char temp_TH=25,temp_TL=18; //温度上下限
unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
void DS18B20_init(); //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
void ReadTemperature(); //读取温度数值
void temp_data_turn(float in_data); //温度转换
//--------------------------------------------------------


/****************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init()
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:丁霄
/**********************************************************************/
void DS18B20_init()
{
unsigned char i=1;
DQ=0;
DQ=1;
delay(20); //延时227us
while(REC_suc==0)
{
   DQ=0;
   delay(45); //延时502us
   DQ=1;
   delay(3); //等待DS18B20作出相应 延时40us
   while(1)
{ i=DQ;
     if(i==0)
    {
REC_suc=1;
delay(20); //延时227us
break;
}
}
}
REC_suc=0;
}

/****************************DS18B20发送函数**************************/
/*函数原型:void DS18B20_send(unsigned char in_data)
/*函数功能:DS18B20发送数据
/*输入参数:要发送的数据
/*输出参数:无
/*调用模块:_cror_()
/*建立时间:2005/11/14
/*作者:丁霄
/**********************************************************************/
void DS18B20_send(unsigned char in_data)
{
   unsigned char i,out_data,k;
    out_data=in_data;
   for(i=1;i<9;i++) //串行发送数据
   {
    DQ=0;
DQ=1;
_nop_();
    _nop_();
    k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
    }
else   //写0
    {
DQ=0;
}
delay(5); //延时62us
DQ=1;
     out_data=_cror_(out_data,1); //循环左移1位
}
}


/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:丁霄
/******************************************************************/
unsigned char DS18B20_read()
{
   unsigned char i,in_data,k;
   in_data=0;
    for(i=1;i<9;i++) //串行发送数据
   {
      DQ=0;
   DQ=1;
   _nop_();
   _nop_();
      k=DQ; //读DQ端
   if(k==1) //读到的数据是1
{
    in_data=in_data|0x01;
}
   else
{
    in_data=in_data|0x00;
}
delay(4); //延时51us
DQ=1;
in_data=_cror_(in_data,1); //循环左移1位
   }
   return(in_data);
}
  
/**************************DS18B20读取温度函数**************************/
/*函数原型:void ReadTemperature()
/*函数功能:DS18B20读取温度转换好的数据
/*输入参数:无
/*输出参数:无
/*调用模块:DS18B20_send(),DS18B20_send(),DS18B20_init(),DS18B20_send(),DS18B20_send(),
           T_L=DS18B20_read(),T_H=DS18B20_read()
/*建立时间:2005/11/15
/*作者:丁霄
/******************************************************************/
void ReadTemperature()
{
unsigned char T_L=0;
unsigned char T_H=0;
unsigned char k;
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

T_L=DS18B20_read();
T_H=DS18B20_read();

k=T_H&0xf8;
if(k==0xf8)
T_sign=1;   //温度是负数
else
T_sign=0; //温度是正数

T_H=T_H&0x07;
temp=(T_H*256+T_L)*T_cont;
}

/**************************DS18B20温度转换函数**************************/
/*函数原型:void temp_data_turn(float in_data)
/*函数功能:DS18B20读取温度转换
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/16
/*作者:丁霄
/******************************************************************/
void temp_data_turn(float in_data)
{
unsigned int y;
in_data=in_data*10; //数值扩大10倍,精度到0.1
t_bai=in_data/1000;
y=(unsigned int)in_data%1000;
t_shi=y/100;
y=y%100;
t_ge=y/10;
t_feng=y%10;
}