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

📄 18b20.c

📁 18B20 模块设置程序
💻 C
字号:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//      DS10B20.c
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#define  _Nop()  _nop_()      /*定义空指令*/
#include "DS1302.h"

//-------  DS18B20 Temper ---------------------------------------
#define TEMH_ALM   50
#define TEML_ALM   10
#define CONFIG     0x7f  // 1f=9; 3f=10; 5f=11; 7f=12A/D
bit  TEM_FD;     //-=1
//bit  TEM_100;    // >100,=1
sbit DT0 = P1^7; // Temper_0
sbit DT1 = P1^6; // Temper_1
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delay(UI use)
{
   for(; use>0; use--);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void yys(UC yscnt)     // 1=35ms
{
	UI  y;
	for(;yscnt>0;yscnt--)
		{
			y=0xfff;
			while(y!=0)
			{
				y--;
			}
		}
}

//**************************************************************
//       18B20_0
//******************************************************
//----reset0---------------------------
UC ow_reset0()
{
   UC presence=1;

   DT0 = 0;
   delay(40); // 40=480...960us
   DT0=1;
   delay(5);  // 15...60us,1=17us
   presence=DT0;
   delay(15); //  >60..240us
  return(presence);// ok=0, no=1
}
//------read byte-----------------------
UC read_byte0(void)
{
   UC i,ii;
   UC value=0;

   for(i=8; i>0; i--)
     {
        value>>=1;
        DT0=0;
        DT0=1;
        for(ii=0; ii<3; ii++);// >15us ,<20us ******
        if(DT0)
        value|=0x80;
        delay(3);   // 1=17us
     }
     return(value);
}
//------- write byte-------------------
void write_byte0(char val)
{
    UC i;

    for(i=8;i>0;i--)
      {
         DT0=0;
         DT0=val&0x01;
         delay(5); // 60...120us
         DT0=1;
         val=val/2;
      }
      delay(5); //60...120us
}
//------------------------------------------------------
//------- ini 18b02 -----------------------
void ini_18b20(void)
{
   ow_reset0();        // write byte
   write_byte0(0xcc);  //skip ROM
   write_byte0(CONFIG);
//   write_byte0(0x4e);
//   write_byte0(TEMH_ALM);
//   write_byte0(TEML_ALM);
}
//******************************************
//------read temperature_0   --------------------
UI read_temper0(void)
{
      UI teml,temh,temper,t,tt;

      teml=temh=0;
      ow_reset0();
      write_byte0(0xcc);
      write_byte0(0x44);  // start A/D
      yys(22);            // delay>750ms, 1=35ms, 22=782ms
      ow_reset0();        // read byte
      write_byte0(0xcc);
      write_byte0(0xbe);  // read 9 RAM
      teml=(unsigned int)read_byte0();    // L tem, in ds18b20 RAM 0,1,2,3,4
      temh=(unsigned int)read_byte0();    // H tem
      //t2=read_byte();
      //t3=read_byte();
      //t4=read_byte();
      //temh=(unsigned int)0x00;   // test T ***********************************************
      //teml=(unsigned int)0x08;   // test T ***********************************************
   temper=temh;
   if((temper&0x00f8)==0x00f8)   //负值 符号处理
      {
        temh= ~temh;
        teml= (~teml)&0x00ff;
        temper=((temh<<8)+teml)+1;
        teml=temper;
        tt=((temper/16)<<8);    // ZS(16)
        temper=(teml&0x000f)*100;
        t=(temper/16)&0x00ff;          // XS(16)
        temper=tt+t;
        TEM_FD=1;   //  负值符号
      }
      else
      {
        temper=((temh<<8)+teml)&0xfff0;
        tt=(temper/16)<<8;    // ZS(16)
        temper=(teml&0x000f)*100;
        t=temper/16;          // XS(16)
        temper=tt+t;
        TEM_FD=0;
       }
      return(temper);
}
//-----------------------------------------
//*********************************************************
//       DS18B20_1
//*********************************************************
//----reset------------------------------------------------
 UC ow_reset1(void)
{
   UC presence=1;

   DT1 = 0;
   delay(40); // 40=480...960us
   DT1=1;
   delay(5);  // 15...60us,1=17us
   presence=DT1;
   delay(15); //  >60..240us
  return(presence);// ok=0, no=1
}
//------read byte-----------------------
UC read_byte1(void)
{
   UC i,ii;
   UC value=0;

   for(i=8; i>0; i--)
     {
        value>>=1;
        DT1=0;
        DT1=1;
        for(ii=0; ii<3; ii++);// >15us ,<20us ******
        if(DT1)
        value|=0x80;
        delay(3);   // 1=17us
     }
     return(value);
}
//------- write byte-------------------
void write_byte1(char val)
{
    UC i;

    for(i=8;i>0;i--)
      {
         DT1=0;
         DT1=val&0x01;
         delay(5); // 60...120us
         DT1=1;
         val=val/2;
      }
      delay(5); //60...120us
}
//---------------------------------------
//------ ini 18B20_1-------------------------------------
void ini_18b21(void)
{
   ow_reset1();        // write byte
   write_byte1(0xcc);  //skip ROM
   write_byte1(CONFIG);
//   write_byte1(0x4e);
//   write_byte1(TEMH_ALM);
//   write_byte1(TEML_ALM);
}
//*****************************************************
//------read temperature_1-------------------------------
UI read_temper1(void)
{
      UI teml,temh,temper,t,tt;

      teml=temh=0;
      ow_reset1();
      write_byte1(0xcc);
      write_byte1(0x44);  // start A/D
      yys(22);            // delay>750ms, 1=35ms, 22=782ms
      ow_reset1();        // read byte
      write_byte1(0xcc);
      write_byte1(0xbe);  // read 9 RAM
      teml=(unsigned int)read_byte1();    // L tem, in ds18b20 RAM 0,1,2,3,4
      temh=(unsigned int)read_byte1();    // H tem
      //t2=read_byte();
      //t3=read_byte();
      //t4=read_byte();
      //temh=(unsigned int)0x00;   // test **************************************
      //teml=(unsigned int)0x00;   // test **************************************
      temper=temh;
   if((temper&0x00f8)==0x00f8)
      {
        temh= ~temh;
        teml= (~teml)&0x00ff;
        temper=((temh<<8)+teml)+1;
        teml=temper;
        tt=((temper/16)<<8);    // ZS(16)
        temper=(teml&0x000f)*100;
        t=(temper/16)&0x00ff;          // XS(16)
        temper=tt+t;
        TEM_FD=1;
      }
      else
      {
      temper=((temh<<8)+teml)&0xfff0;
      tt=(temper/16)<<8;    // ZS(16)
      temper=(teml&0x000f)*100;
      t=(temper/16)&0x00ff;          // XS(16)
      temper=tt+t;
      TEM_FD=0;
      }
      return(temper);
}
//------------------------------------------------
//  temer_0
void dis_t0(void)
{
      UI temp,t,tt;
      //timer_0
      led[6]=0x37; // display Home, 6, 7
      temp=read_temper0();
      t=tt=temp;
      if(TEM_FD)  //  负值符号
       {
         led[5]=0x01; // - 符号
         tt=temp>>8;
         led[4]=led_bcd[(unsigned char)tt/10];  tt%=10; // ZS (16) -> (10)
         if(led[4]==0x7e) // 0x7e=0,
            {
              led[5]=0x00;  // 0x00= ,
              led[4]=0x01;  // -
             }
         led[3]=led_bcd[(unsigned char)tt];        // DP. |0x80
         t=t&0x00ff;
         led[2]=led_bcd[(unsigned char)t/10];   t%=10;  // XS (16) -> (10)
         led[1]=led_bcd[(unsigned char)t];
       }
      else      // 正值 >99, max 120c.
       {
         tt=temp>>8;
         led[5]=led_bcd[(unsigned char)tt/100]; tt%=100; // ZS (16) -> (10)
         if(led[5]==0x7e) // 0x7e=0,
            led[5]=0x00;  // 0x00= ,
         led[4]=led_bcd[(unsigned char)tt/10];  tt%=10; // ZS (16) -> (10)
         if((led[5]==0x00)&&(led[4]==0x7e)) // 0x7e=0,
             led[4]=0x00;  // 0x00= ,
         led[3]=led_bcd[(unsigned char)tt];        // DP. |0x80
         t=t&0x00ff;
         led[2]=led_bcd[(unsigned char)t/10];   t%=10;  // XS (16) -> (10)
         led[1]=led_bcd[(unsigned char)t];
       }

}
//******************************************************************
// temer_1
void dis_t1(void)
{
      UI temp,t,tt;
      //timer_0
      led[6]=0x4f; // display E, 6, 7
      temp=read_temper1();
      t=tt=temp;
      if(TEM_FD)  //  负值符号
       {
         led[5]=0x01; // - 符号
         tt=temp>>8;
         led[4]=led_bcd[(unsigned char)tt/10];  tt%=10; // ZS (16) -> (10)
         if(led[4]==0x7e) // 0x7e=0,
            {
              led[5]=0x00;  // 0x00= ,
              led[4]=0x01;  // -
             }
         led[3]=led_bcd[(unsigned char)tt];        // DP. |0x80
         t=t&0x00ff;
         led[2]=led_bcd[(unsigned char)t/10];   t%=10;  // XS (16) -> (10)
         led[1]=led_bcd[(unsigned char)t];
       }
      else      // 正值 >99, max 120c.
       {
         tt=temp>>8;
         led[5]=led_bcd[(unsigned char)tt/100]; tt%=100; // ZS (16) -> (10)
         if(led[5]==0x7e) // 0x7e=0,
            led[5]=0x00;  // 0x00= ,
         led[4]=led_bcd[(unsigned char)tt/10];  tt%=10; // ZS (16) -> (10)
         if((led[5]==0x00)&&(led[4]==0x7e)) // 0x7e=0,
             led[4]=0x00;  // 0x00= ,
         led[3]=led_bcd[(unsigned char)tt];        // DP. |0x80
         t=t&0x00ff;
         led[2]=led_bcd[(unsigned char)t/10];   t%=10;  // XS (16) -> (10)
         led[1]=led_bcd[(unsigned char)t];
       }

}
//**************************************************************************

⌨️ 快捷键说明

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