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

📄 ds18b20-.txt

📁 ds18b20驱动
💻 TXT
📖 第 1 页 / 共 2 页
字号:
void delay1ms(void)
{
   uchar  i,j;
   for(i=0;i<2;i++)
     for(j=0;j<255;j++);
}

/**************************************************
;系统初始化子程序
***************************************************/
void sys_init(void)
{
  uchar   i;
  EA="0";
  s1_flag=0;
  for(i=0;i<6;i++)
     dispbuf[i]=0;
  TMOD="0X01";
  TH0=0XD8;
  TL0=0XF0;
  CNT="0";
  ET0=1;
  TR0=1;
  EA="1";
}
/***************************************************
;MAX7219初始化函数
****************************************************/
void init_7219(void)
{
      uchar   address,cmd;
      address="0x0c";
      cmd="0"; 
      write7219(0x0c,0);
      delay1ms();
      delay1ms();
      delay1ms();
      address="0x0b";
      cmd="0x07";
      write7219(0x0b,0x07);
      address="0x0a";
      cmd="0x0d";
      write7219(0x0a,0x0d);
      address="0x09";
      cmd="0xff";
      write7219(0x09,0xff);
      address="0x0c";
      cmd="0x01";
      write7219(0x0c,0x01);
}
/*****************************************************
;MAX7219写入函数
;参数:address寄存器地址,cmd为命令数据
*****************************************************/
void write7219(uchar address,uchar cmd)
{
     uchar  out,i;
     LOAD7219=1;
     out="address";
     for(i=0;i<8;i++)
     {
         DIN7219=(bit)(out&0x80);
         out="out"<<1;
         _nop_();
         _nop_();
         _nop_();
         CLK7219=0;
         _nop_();
         _nop_();
         _nop_();
         CLK7219=1;
       }
     out="cmd";
     for(i=0;i<8;i++)
     {
         DIN7219=(bit)(out&0x80);
         out="out"<<1;
         _nop_();
         _nop_();
         _nop_();
         CLK7219=0;
         _nop_();
         _nop_();
         _nop_();
         CLK7219=1;
      }
     LOAD7219=0;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     LOAD7219=1;
}
/**************************************************
;显示函数
;入口:显示内容在disbuf中(BCD码形式)
***************************************************/
void display(void)
{     
   uchar  i,st,add,dat;
   st="MAX7219STA";
   for(i=0;i<8;i++)
   {

       dat="dispbuf"[i];
       if(i==6)dat=dat|0x08;
       add="st";
       write7219(add,dat);
       st++;
     }
}
/****************************************************
;定时器0溢出中断函数,每10ms中断
****************************************************/
void time0(void)interrupt 1 using 1
{
    TH0=0XD8;
    TL0=0XF0;
    TH1=0;
    TL1=0;
    sta_flag=1;
    CNT="1";
    TR1=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    CNT="0";
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    count++;

}


/*******************************************************************
;距离计算函数
*******************************************************************/
void computer(void)
{
   float   c;
   uint    t;
   float   tp;
   if(temp<0x8000)
       tp="temp"*0.0625;
   else 
       tp="temp"*(-0.0625);
   t="jsh"*256+jsl;
   c="331".4+0.61*tp;
   distance="c"*t*0.001/2;

}

/********************************************************************
;数据转换函数
   将转换后的数据存入显示缓冲区以供显示
   待转换的数据有:温度值,距离值,并送存相应的显示缓冲区
*********************************************************************/
void hex2bcd(void)
{

    float tp;
    unsigned long int tmp;
    fuhao="0";
    if(temp<0x8000)
        tp="temp"*0.0625;
    else
        {

           bm();
           tp="temp"*0.0625;
           fuhao="1";
 
          }
    tp="tp"*10000.0;
    tmp="tp";
    dispbuf[5]=tmp/100000;
    dispbuf[5]=dispbuf[5]%10;
    if(fuhao)dispbuf[5]=dispbuf[5]|0x80;
 tmp=tmp%100000;
 dispbuf[4]=tmp/10000;
 tmp=distance;
 dispbuf[3]=tmp/10000;
 tmp=tmp%10000;
 dispbuf[2]=tmp/1000;
    tmp="tmp"%1000;
 dispbuf[1]=tmp/100;
 tmp=tmp%100;
 dispbuf[0]=tmp/10;

}

/*************************************************************************
;ds18b20复位函数
   读存在脉冲,无存在脉冲刚清标志
*************************************************************************/
void init_18b20(void)
{
    WDIO="1";
 _nop_();
 WDIO=0;
 delay15(36);
 WDIO=1;
 delay15(6);
 if(WDIO==0)
     flag2=1;
 else 
     flag2=0;
 delay15(18);
}

/*************************************************************************
字节写DS18b20函数
待写参数:wr
*************************************************************************/
void write_18b20(uchar wr)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      WDIO="0";
   delay15(1);
   _nop_();
   _nop_();
   WDIO="wr"&0x01;
   delay15(1);
   WDIO="1";
   wr>>=1;
 }
}

/***********************************************************************
字读DS18b20函数
***********************************************************************/
uint read_word(void)
{
     uchar i;
  uint u;
  for(i=0;i<16;i++)
  {
     WDIO="0";
  u>>=1;
  WDIO=1;
  delay15(1);
  if(WDIO==1)
      u|=0x8000;
  _nop_();
  _nop_();
  _nop_();


    }
    return(u);
}

/**********************************************************************
启动温度函数
  注意:必须启动后750ms才能读温度
**********************************************************************/
uint wd(void)
{
   init_18b20();
   if(flag2)
   {
        write_18b20(0xcc);
  write_18b20(0xbe);
  return(read_word());
    }
}

/**********************************************************************
延时15us函数
***********************************************************************/
void delay15(uchar us)
{
     do
  {
     _nop_();
  _nop_();
  _nop_();
     _nop_();
  _nop_();
  _nop_();
     _nop_();
  _nop_();
  _nop_();
     _nop_();
  _nop_();
  _nop_();
  _nop_();
  us--;
   }while(us);
}

/***********************************************************************
对读出的温度值temp求补码函数,得到原码
***********************************************************************/
void bm(void)
{
    temp=~temp;
 temp=temp+1;
}

⌨️ 快捷键说明

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