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

📄 ds18b20的驱动.txt

📁 ds18b20的keil c 编程 实现了温度的采集 并用数码管显示 有温度报警功能
💻 TXT
字号:
温度传感器DS18B20驱动upsd单片机的C51源程序 
By  西谱单片机 发表于 2006-4-20 19:10:13   


#i nclude "upsd3200.h"
#i nclude"intrins.h"


sbit DQ= P1^7;
char WEN_ZERO=0;
bit  flag;                        //DS18B20器件是否正常标志
extern uint wendu;

///////////////延时//////////////////
void delay (uint us)
{
 while (us--);
}

//////////////DS18B20初始化--外部调用//////////
void init_18b20 (void)
{
   DQ=1;
   _nop_();
   DQ=0;
   delay(90);              //delay 530 uS
  DQ=1;
   delay(6);               //delay 100 uS
   if(DQ==0)
      flag=1;             //detect 1820 success!
   else
      flag=0;             //detect 1820 fail!
   delay(20);
   DQ=1;      
}

/////////////DS18B20写//////////////
void write (uchar wr)
{
   uchar i;
   for (i=0;i<8;i++)
   {
      DQ=0;
     _nop_();
      DQ=wr&0x01;
      delay(5);            //delay 45 uS
      DQ=1;
      wr>>=1;
    }  
}

/////////////DS18B20读/////////////////
uint read_word (void)
{ 
   uchar i;
   uint u=0;
   for(i=0;i<16;i++)
    {
     DQ=0;
      u>>=1;
      DQ=1;
      if(DQ==1)
        u|=0x8000;        
      delay (4);   
    }  
   return(u); 
}
/*
///////DS18B20寄存器配置--外部调用///////////
void config (void)
{
   if(flag)
    {
      write (0xcc);        //跳过ROM命令
      write (0x4e);        //写暂存存储器
      write (0x19);        //TH=0
      write (0x1a);        //TL=0
      write (0x7f);        //set 11 bit (0.125)
      init_18b20();
      write (0xcc);        //跳过ROM命令
      write (0x48);        //复制暂存存储器,在发出此命令之后,主机必须等待6ms,以待复制操作的完成
      init_18b20();
      write (0xcc);        //跳过ROM命令
      write (0xb8);        //recall
      delay (254);
      delay (250);
      init_18b20();
      write (0xcc);
      write (0xbe);        //读暂存存储器命令
      one=read_word();
      two=read_word();
      three=read_word();
    }
}

*/
///////////读取温度--外部调用////////////////
void get_wendu (void)
{ 
   uint bdata tem;
   init_18b20();
   if (flag)
   {
      write (0xcc);               //跳过ROM命令
      write (0x44);               //启动温度转换
      init_18b20 ();            
      write (0xcc);               //跳过ROM命令
      write (0xbe);               //读暂存存储器命令
      tem=read_word();            //读取温度
      if(tem<0x8000)
     {
         wendu=tem*6.25;         //温度大于0;
         WEN_ZERO=0;
     }
      else
     {
         wendu=tem*(-0.0625);    //温度小于0;
          WEN_ZERO=1;
      }
      //write (0xec);         //search alarm
   }

}

 

























3.驱动程序


/********************数码管显示DS18B20 温度与报警控制******************
*作者:☆华仔☆    QQ:656037228  欢迎交流
*时间:2008年12月04日
*更新时间:2008年12月15日晚
-----------------------------------------------
*主要功能:
     正常的温度显示、报警控制。
-----------------------------------------------
*显示格式:
    102.8°C   或   -21.3°C
-----------------------------------------------------------------------
*电路连接:
    采用STC12C2052单片机,24兆赫晶振(其他频率晶振,只要修改延时就可以了),
    用5位8段数码显示管,
    4位显示温度(包括显示零下温度符号“-”),1位用作符号“°C”(倒放)
-----------------------------------------------------------------------
*DS18B20 端口位定义: 
    DQ →   P3^5    ; 数据传送总线
-----------------------------------------------
    BEEP →   P3^7    ;蜂鸣器
    PORT  →   P1   ;数码管数据总线
-----------------------------------------------
*显示方式:
     数码管动态扫描
----------------------------------------------------------------
*报警方式:
     在DS18B20检测出错或超出规定的温度范围报警,
     报警时数码管闪动显示数字,在DS18B20检测出错时闪动显示ERROR
----------------------------------------------------------------
*****************下面是C51源程序********************/
//#include < reg51.h > //8051头文件
#include "STC12C2052AD.h"//2051头文件
//#include < intrins.h >
#define uchar unsigned char;
#define uint unsigned int;
typedef bit BOOL;
#define PORT P1  //数码管显示数据总线
sbit DQ = P3^5;  //DS18B20数据总线 
sbit BEEP=P3^7 ; //蜂鸣控制端
BOOL FLAG ;//初始化标志
BOOL ZF_FLGE;
void NoTemp();//DS18B20出错
uchar code DISData[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};//共阳数码管编码表*/
/*uchar code DISData[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴数码管编码表*/
uchar data temp_data[2] = {0x00,0x00};//温度数据寄存,存放格式【低位,高位】
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};//存放编辑,存放格式【小数位,个位,十位,百位,编辑位】
uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,
                        0x05,0x06,0x07,0x07,0x08,0x08,0x09,0x09};//小数值
sbit DIN = P1^7;//小数点
BOOL flash=0;//显示开关标记
/********************************************************
*名称:Delay()
*功能:微妙级延时
*********************************************************/
void Delay(unsigned int Dtime)//延时函数
{
  while( --Dtime );
}
/********************************************************
*名称:Delayms()
*功能:毫秒级延时
*********************************************************/
void Delayms(unsigned int Dtime)
{ unsigned char j;
  for (; Dtime>0; Dtime--)
    { for (j=0; j<125; j++){;;}
    }
}
/********************************************************
*名称:beep()
*功能:蜂鸣
*********************************************************/
void beep()
  {
    BEEP=0;                //BEEP取反
    Delayms(500); 
    BEEP=1;                      //关闭蜂鸣器
  }
/********************************************************
*名称:Init_DS18B20()
*功能:初始化DS18B20,
*调用:Delay();
*返回值:FLAG
*********************************************************/
Init_DS18B20(void)//初始化ds1820
{
  DQ = 1; //DQ复位
  Delay(20);//稍做延时
  DQ = 0;//单片机将DQ拉低
  Delay(200); //精确延时 大于 480us
  DQ = 1; //拉高总线
  Delay(20);
  FLAG = DQ; //如果=0则初始化成功 =1则初始化失败
  Delay(240);
  DQ = 1; 
  return(FLAG); //返回信号,等于0初始化成功,等于1则初始化失败
}
/********************************************************
*名称:ReadOneByte()
*功能:从DS18B20读出1字节数据
*调用:Delay();
*返回值:dat
*********************************************************/
ReadOneByte(void)//读一个字节
{
  unsigned char i = 0;
  unsigned char dat = 0;
   for (i = 0; i < 8; i++)
     {
      DQ = 0; // 脉冲信号
      dat = dat>>1;
      DQ = 1; // 脉冲信号
      if(DQ)
        dat |= 0x80;
      Delay(10);
     }
  return (dat);
}
/********************************************************
*名称:WriteOneByte()
*功能:往DS18B20写入1字节数据
*调用:Delay();
*返回值:无
*********************************************************/
void WriteOneByte(unsigned char dat)//写一个字节
{
  unsigned char i = 0;
   for (i = 8; i > 0; i--)
     {
      DQ = 0;// 脉冲信号
      DQ = dat&0x01;//LSB在前
      Delay(12);
      DQ = 1;// 脉冲信号
      dat>>=1;
     }
}
/********************************************************
*名称:Read_Temp()
*功能:读取DS18B20温度数据
*调用:Init_DS18B20(); WriteOneByte(); ReadOneByte();
*返回值:无
*********************************************************/
Read_Temp(void)//读取温度
{
Init_DS18B20();//初始化DS18B20
if(FLAG==1) //等于1初始化失败
  { //beep();//DS18B20不正常,蜂鸣器报警
    flash=1;//返回不正常标志
  } 
else 
  {
   flash=0;//返回显示标志
   WriteOneByte(0xCC); // 跳过ROM匹配操作
   WriteOneByte(0x44); // 启动温度转换
   Init_DS18B20();//读温度前先复位
   WriteOneByte(0xCC); //跳过ROM匹配操作
   WriteOneByte(0xBE); //读取温度寄存器
   temp_data[0] = ReadOneByte(); //温度低8位
   temp_data[1] = ReadOneByte(); //温度高8位 
  }
}
/*********************************************************
*名称:Edit_bit()
*功能:编辑显示位
*调用:无
*返回值:无
**********************************************************/
Edit_bit()
{    //编辑每一位要显示的内容
        display[4]=temp_data[0]&0x0f;//小数编辑
        display[0]=ditab[display[4]]; //查表得小数位的值
        display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//温度值
        display[3]=display[4]/100;//取最高位
        display[2]=(display[4]%100)/10;//次高位
        display[1]=display[4]%10;//个位
}
/*********************************************************
*名称:Edit_Temp()
*功能:编辑读取的正负温度
*调用:Edit_bit()
*返回值:无
**********************************************************/
void Edit_Temp()//编辑温度
{
   if ((temp_data[1]&0x0f8)>0) //高五位是正负温度值符号1=零下
       {ZF_FLGE=1;//零下标志置位
        temp_data[0]=(~temp_data[0])+1;//负温度算法
        temp_data[1]=~temp_data[1];
        Edit_bit();//编辑显示位
       }
    else
       {ZF_FLGE =0;
        Edit_bit();//编辑显示位
      }
}
/*********************************************************
*名称:Disp_bit()
*功能:数码管位扫描
*调用:Delay()
*返回值:无
**********************************************************/
Disp_bit()
{
                //PORT= 0x33; //显示小 °C符号 

⌨️ 快捷键说明

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