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

📄 ds1802.c

📁 基于51单片机
💻 C
字号:
//这是一个温度采集模块的驱动程序。
/*
    |----|
    | DS |   DS18B20管脚排列
    +----+
    |  | |
    |  | |
    |  | |----------Vdd        
    |  |------------DQ-->P2.7
    |---------------GND
*/
#include <reg51.h>
#include "intrins.h"

//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44  //开始温度转换
#define T_READ 0xbe    //读暂存器
#define T_WRITE 0x4e   //写暂存器
#define T_ROM_JMP 0xcc  //忽略64ROM地址
//------------------------------------------------------

sbit DQ=P2^7;  //DS18B20数据输出端
bit REC_suc=0;  //DS18B20成功复位标志位(1为成功0为失败)


void DS18B20_init();  //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
extern void delay(unsigned int i);



/****************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init()
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/14
/**********************************************************************/
void DS18B20_init()
{
  unsigned char i=1;
  DQ=0;
  DQ=1;
  delay(16);  //延时227(230)us=(22+16*13)us 
  DQ=0;
  delay(37);  //延时502us(503)us=(22+37*13)us 
  DQ=1;
  delay(2);  //等待DS18B20作出相应 延时40us(48)us=(22+2*13)us
  i=DQ;
  if(i==0)
    {
	 REC_suc=1; //复位信号标志1为成功0为失败
	}
  else
    {
     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;
	}
	 delay(3);  //延时62us(61)us=(22+3*13)us
	 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;
	 }
	 delay(2);  //延时51us(48)us=(22+2*13)us
	 DQ=1;
	 in_data=_cror_(in_data,1); //循环右移1位
   }
   return(in_data);
}
   
/**************************DS18B20读取温度函数*********************/
/*函数原型:void ReadTemperature()
/*函数功能:DS18B20读取温度转换好的数据
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/15
/******************************************************************/
int ReadTemperature()
{
unsigned char T_L=0;
unsigned char T_H=0;
unsigned char k;
int temp;  //转换好的温度数值
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
if(REC_suc==1)
 {
  DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
  DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

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

  k=T_H&0x01; //T_H&0xf8; 
  if(k==0x01)
   {temp=0-(256-T_L)*5;}  //温度是负数  
  else
   {temp=T_L*5;}          //温度是正数
  }
else
  {
    temp=9999;//ERROR代码
  }
  return(temp);
}

⌨️ 快捷键说明

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