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

📄 ds18b20.txt

📁 DS18B20的驱动程序
💻 TXT
字号:
#include <reg2051.h>      //头文件
#include <intrins.h>      //包含延时函数

sbit DQ=P3^7;             //定义接口
sbit Key_Set=P3^2;        //设定键和数码管十号位
sbit Key_Up=P3^3;         //上调键和数码管十位
sbit Key_Down=P3^4;       //下调键和数码管个位
sbit Key_Com=P3^5;        //复合键盘公共端
sbit Out_1=P3^0;
sbit Out_2=P3^1;

/***********************以下声明函数*************************/
void delay(unsigned int time);
void delay_led(void);
void Init_DS18B20(void);
ReadOneByte(void);
WriteOneByte(unsigned char dat);
ReadTemperatrue(void);
void Reset_DS18B20(void);
void Read_Alarm(void);
void WriteAlarm(unsigned char a,unsigned char k);
void display(unsigned char k);
void display_set(bit a,unsigned char b);
void key(unsigned char k);
/***********************声明函数结束*************************/

unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x89,0xC7,0xBF};        //定义LED笔画
unsigned char AL=0;                 //定义下限报警变量(全局变量)
unsigned char AH=0;                 //定义上限报警变量(全局变量)
unsigned char se=0;                 //按键防抖
bit o=0;

void main(void)                     //主函数
{
      unsigned char tmp,j;
      P1=0xFF;
      Key_Com=1;
      for(j=0;j<10;j++)      //自检
      {
       for(tmp=0;tmp<40;tmp++)
{
       Key_Set=0;
       P1=led[j];
       delay_led();
       Key_Set=1;
       Key_Up=0;
       P1=led[j];
       delay_led();
       Key_Up=1;
       Key_Down=0;
       P1=led[j];
       delay_led();
       Key_Down=1;
}
      }
      Reset_DS18B20();       //读出上限、下限温度值,并对DS18B20进行检测,如果是新器件则初始化新器件。
      for(j=0;j<30;j++)      //等待DS18B20进入正常状态
      {
        tmp=ReadTemperatrue();
      }
      while(1)
      {
        tmp=ReadTemperatrue();
      for(j=0;j<125;j++)
      {
        Key_Com=1;
        display(tmp);
        key(tmp);
      }
      }
}



/*************************************************************
函数功能:延时子程序(用于DS18B20时序中延时)
入口参数:
出口参数:
*************************************************************/
void delay(unsigned int time)
{
      unsigned int n;
      n=0;
      while(n<time)
      {n++;}
}

/*************************************************************
函数功能:延时子程序(用于数码管扫描)
入口参数:
出口参数:
*************************************************************/
void delay_led(void)
{
      int k;
      for(k=0;k<600;k++);
}

/*************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
*************************************************************/
void display(unsigned char k)
{
      if((o==1)||(k>=100))
      {
        if(o==1)                //零下标志位,1为零下温度,百位显示-已表示零下温度。
        {
        Key_Set=0;
        P1=led[12];
        delay_led();
        Key_Set=1;
        }
        if(k>=100)             //温度值小于100时百位消隐
        {
        Key_Set=0;
        P1=led[k/100];
        delay_led();
        Key_Set=1;
        }
      }
      else delay_led();      //只做延时
      if(k>=10)
      {
        Key_Up=0;
        P1=led[k%100/10];
        delay_led();
        Key_Up=1;
      }
      else delay_led();
      Key_Down=0;
      P1=led[k%10];
      delay_led();
      Key_Down=1;
}

/*************************************************************
函数功能:数码管显示子程序(上下限设置)
入口参数:a,k
出口参数:
*************************************************************/
void display_set(bit a,unsigned char k)
{
      if(a==0)             //通过a来判断上下限
      {
        Key_Set=0;
        P1=led[10];
        delay_led();
        Key_Set=1;
      }
      else
      {
        Key_Set=0;
        P1=led[11];
        delay_led();
        Key_Set=1;
      }
      Key_Up=0;
      P1=led[k/10];
      delay_led();
      Key_Up=1;
      Key_Down=0;
      P1=led[k%10];
      delay_led();
      Key_Down=1;
      a=0;
}

/*************************************************************
函数功能:按键检测及上、下降报警输出
入口参数:
出口参数:
*************************************************************/
void key(unsigned char k)
{
      unsigned char a=0,b=0,temp=0;
      bit c=0;
      P1=0xFF;         //关闭显示
      Key_Com=0;       //公共端输出0
      if(Key_Set==0)
      {
        se++;
        if(se==30)
      {
        temp=AH;
        while(a!=2)
        {
        Key_Com=1;
        display_set(c,temp);
        Key_Com=0;
        if(Key_Up==0)           //响应上调设置
        {
          b++;
        if(b==25)
        {
          temp++;             //上调
        if(temp==100)         //当值设到最大时,从0加起
        {
          temp=0;
        }
        b=0;
        }
        }
        if(Key_Down==0)         //响应下调设置
        {
          b++;
        if(b==25)
        {
          temp--;               //下调设置
        if(temp==0)
        {
          temp=99;            //当上限值高到最小时,从99减起
        }
        b=0;
        }
        }
        if(Key_Set==0)          //响应设置键
        {
          b++;
        if(b==25)
        {
           switch(a)
         {
           case 0:
         {
               a++;
             c=1;
                     AH=temp;
             temp=AL;
           b=0;
         }
         break;
         case 1:
         {
           a++;
           AL=temp;
           b=0;
         }
         break;
         }
        }
        }
      }        //while
      se=0;
          WriteAlarm(AH,AL);
      }       //if
      }        //if
      if(k<150)
      {
        if(AH!=AL)
        {
          if(k>=AH)
          {
            Out_1=0;
          }
          else
          {
            Out_1=1;
          }
          if(k<=AL)
          {
            Out_2=0;
          }
          else
          {
            Out_2=1;
          }
        }
      else
      {
        Out_1=1;
      Out_2=1;
      }
      }
      else
      {
        Out_1=1;
      Out_1=1;
      }
  
}
   
/*********************************以下DS18B20驱动程序*********************************/
/*************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
*************************************************************/
void Init_DS18B20(void)
{
      DQ=1;               //总线释放
      _nop_();            //稍延时
      _nop_();
      DQ=0;               //发送复位脉冲
      delay(85);          //延时(>480us)
      DQ=1;               //释放总线
      delay(8);          //等待(15~60us)DS18B20发送存在脉冲
      while(DQ==1)
      {
       Key_Set=0;
       P1=led[12];
       delay_led();
       Key_Set=1;
       Key_Up=0;
       P1=led[12];
       delay_led();
       Key_Up=1;
       Key_Down=0;
       P1=led[12];
       delay_led();
       Key_Down=1;
        DQ=0;
        delay(85);
        DQ=1;
        delay(8);
      }
      delay(35);
}

/*************************************************************
函数功能:向DS18B20读1字节数据
入口参数:
出口参数:dat
*************************************************************/
ReadOneByte(void)
{
      unsigned char i=0;
      unsigned char dat=0;
      for(i=8;i>0;i--)
      {
        DQ=1;
      delay(1);
      DQ=0;
      dat>>=1;
      DQ=1;
      if(DQ)
        dat|=0x80;
      delay(4);
      }
      return(dat);
}

/*************************************************************
函数功能:向DS18B20写1字节数据
入口参数:dat
出口参数:
*************************************************************/
WriteOneByte(unsigned char dat)
{
      unsigned char i=0;
      for(i=8;i>0;i--)
      {
        DQ=0;
      DQ=dat&0x01;
      delay(5);
      DQ=1;
      dat>>=1;
      }
      delay(4);
}

/*************************************************************
函数功能:读温度值
入口参数:
出口参数:temperature
*************************************************************/
ReadTemperatrue(void)
{
      unsigned char tempL=0,tempH=0,temperature=0;
      Init_DS18B20();              //初始化
      WriteOneByte(0xCC);          //跳过ROM操作
      WriteOneByte(0x44);          //温度转换
      delay(25);                  //等待DS18B20转换温度
      Init_DS18B20();              //初始化
      WriteOneByte(0xCC);          //跳过ROM操作
      WriteOneByte(0xBE);          //读暂存器中的温度值
      tempL=ReadOneByte();
      tempH=ReadOneByte();
      o=0;
      if(tempH>0xF0)
      {
        o=1;
        tempL=~tempL;
      tempH=~tempH;
      tempL=tempL+1;
      }
      temperature=((tempH*256)+tempL)*0.0625;
      return(temperature);
}

/*************************************************************
函数功能:新DS18B20重新设置
入口参数:
出口参数:
*************************************************************/
void Reset_DS18B20(void)
{
      unsigned char temp=0;
      Init_DS18B20(); 
      WriteOneByte(0xCC);
      WriteOneByte(0xBE);
      temp=ReadOneByte();
      temp=ReadOneByte();
      AH=ReadOneByte();           //读出上限值
      AL=ReadOneByte();           //读出下限值
      temp=ReadOneByte();         //读到配置字节
      if(temp!=0x1F)
      {
        Init_DS18B20();
       WriteOneByte(0xCC);
      WriteOneByte(0x4E);       //写暂存器
      WriteOneByte(0x05);
      WriteOneByte(0x05);
      WriteOneByte(0x1F);       //写入分辨率为0.5
      Init_DS18B20();
      WriteOneByte(0xCC);
      WriteOneByte(0x48);
      }
}

/*************************************************************
函数功能:向DS18B20写入上限下限值
入口参数:a,b
出口参数:
*************************************************************/
void WriteAlarm(unsigned char a,unsigned char b)
{
      Init_DS18B20();
      WriteOneByte(0xCC);
      WriteOneByte(0x4E);       //写暂存器
      WriteOneByte(a);          //写入TH
      WriteOneByte(b);          //写入TL
      Init_DS18B20();
      WriteOneByte(0xCC);
      WriteOneByte(0x48);
}
/*********************************以上DS18B20驱动程序*********************************/

⌨️ 快捷键说明

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