⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 温度采集模块DS1302的驱动程序,包括启动 结束 读写字节等程序
💻 C
字号:
//这是一个温度采集模块的驱动程序。
/*
    |----|
    | DS |   DS18B20管脚排列
    +----+
    |  | |
    |  | |
    |  | |----------Vdd        
    |  |------------DQ-->P0.0
    |---------------GND
*/
#include <config.h>

//外部函数
//--------------dealy.c--------------------
extern void dealy(unsigned int dealy_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=P0^0;  //DS18B20数据输出端
sbit LED=P1^5;  //LED
bit REC_suc=0;  //DS18B20成功复位标志位
bit T_sign;   //温度正负符号
float temp=0;  //转换好的温度数值
signed char temp_TH=25,temp_TL=10;  //温度上下限
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初始化
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/14
/**********************************************************************/
void DS18B20_init()
{
  unsigned char i=1;
  DQ=0;
  DQ=1;
  dealy(20);  //延时227us
  while(REC_suc==0)
 { 
   DQ=0;
   dealy(45);  //延时502us
   DQ=1;
   dealy(3);  //等待DS18B20作出相应 延时40us
   while(1)
  { i=DQ;
     if(i==0)
    {
	 REC_suc=1;
	 dealy(20);  //延时227us
	 break;
	}
  }
 }
  REC_suc=0;
}

/****************************DS18B20发送函数**************************/
/*函数原型:void DS18B20_send(unsigned char in_data)
/*函数功能:DS18B20发送数据
/*输入参数:要发送的数据
/*输出参数:无
/*调用模块:无
/*建立时间: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;
	}
	 dealy(5);  //延时62us
	 DQ=1;
     out_data=_cror_(out_data,1);  //循环左移1位
  }
}
 
/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:无
/*建立时间: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;
	 }
	 dealy(4);  //延时51us
	 DQ=1;
	 in_data=_cror_(in_data,1); //循环左移1位
   }
   return(in_data);
}
   
/**************************DS18B20读取温度函数**************************/
/*函数原型:void ReadTemperature()
/*函数功能:DS18B20读取温度转换好的数据
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间: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;
}



//------------------调试记录-----------------
//2005/11/14
//早上要完成对DS1820的读写操作函数的编制。
//查看了资料发现时序操作非常严格,需好好整理。

//2005/11/15
//接着昨天未完成的。资料已整理清楚。
//自己编制的驱动程序仍然不行,需修改。

//2005/11/16
//昨天的问题,今天解决了,发现问题出现在DS18B20_send()上,时序操作上也有点问题。
//现已全搞好,温度显示正常。
//将温度的精度提高到0.1度。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -