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

📄 iwire.bak

📁 自己设计的pic单片机开发板源程序和说明书(内有原理图)支持pic16系列28脚和40脚器件。串口输出信息。4个LED数码管驱动;4个LED驱动;4个按键驱动;1个RS232接口;1个RS485接口;
💻 BAK
字号:
/*************************************************************
****************1wire总线操作函数*****************************
*************************************************************/
#define  IB_RDROM 0X33     //读1820的rom命令
#define  IB_SKIP  0xcc     //1820调过命令
#define  IB_CNVT  0X44     //转换温度命令
#define  IB_COPY  0X48     //COPY SCRATCHPAD
#define  IB_RDPAD 0XBE     //READ SCRATCHPAD
#define  IB_WRPAD 0X4E     //WRITE SCRATCHPAD
#define  IB_RECALL  0XB8     //RECALL EEPROM
#define  IB_RDPOW    0XB4     //READ POWER SUPLY COMMAND
int8 ibus_reset(){
int8 i;
   output_low(iwire);
   delay_us(500);
   output_float(iwire);
   delay_us(60);
   if(!input(iwire))
   {
       i=0;
   }
   else{
      i=0xff;
   }
   delay_us(400);
   return(i);
}
//-------------------------------
//-------------------------------
int8   read_byte(){
int8   value ,i;
   value=0;
   for(i=0;i<8;i++){
      output_low(iwire);
      delay_us(3);
	  output_float(iwire);
	  delay_us(6);
      if(input(iwire)){
         bit_set(value,i);
      }
      delay_us(60);     //读时隙至少需要60us
   }
   return(value);
}
//---------------------------------
//---------------------------------
void  write_byte(int bt){
short  b;
int8 i;
   for(i=0;i<8;i++){
      if(bit_test(bt,i)){
        b=1;
      }
      else{
         b=0;
      }
      output_low(iwire);
      //output_high(iwire);
      if(b)
	  {
		output_float(iwire);
	  }
      delay_us(60);
      output_float(iwire);   //trec>=1us.一位写入结束。
   }
  // delay_us(60);
}
//----------------------------------
void  read_rom(){
int8 i;
   write_byte(IB_RDROM);
   for(i=0;i<8;i++){
      buffer[i]=read_byte();
   }
}
//----------------------------------
void  skip(){
   write_byte(IB_SKIP);
}
//----------------------------------
void  write_scratchpad(){
int8 i;
   write_byte(IB_WRPAD);
   for(i=0;i<3;i++){
      write_byte(buffer[i+2]);
   }
}
//----------------------------------
void  read_scratchpad(){
int8 i;
write_byte(IB_RDPAD);
for(i=0;i<5;i++){
   buffer[i]=read_byte();
}
}
//----------------------------------
void  read_temperature(){        //读转换温度,同读scratchpad命令一样,只是读pad的前2个字节
int8 i;
   write_byte(IB_RDPAD);
   for(i=0;i<2;i++){
      buffer[i]=read_byte();
   }
}
//----------------------------------
void  copy_scratchpad(){
   write_byte(IB_COPY);
   delay_ms(10);
}
//----------------------------------
void  convert_t(){
//long	x=0;
   write_byte(IB_CNVT);
/*
   while(++x<2000)
	{
		if(read_byte()==0xff)
		{
			break;
		}
	}
*/

	delay_ms(400);
}
//----------------------------------
void  recall_eeprom(){
   write_byte(IB_RECALL);
   while(read_byte()!=0xff);        //1820在操作完成以后,数据线上全部为1,反之为0。
}
/****************************************************************/
/*******************************/
void Test_1820()
{
int8 var1,var2,t;
while(TRUE)
{
   ibus_reset();
   read_rom();
   while(buffer[0]!=0x28){
      puts("There is not a DS1820. Please check the circurt\n");
	  return;
	  
   }//判断有没有ds1820
   //--------------------
  ibus_reset();
  skip();
  read_scratchpad();
  buffer[4]&=0x60;
  if(buffer[4]!=0x40){
      buffer[4]=0x5f;     //11bit convert
      ibus_reset();
      skip();
      write_scratchpad();
      copy_scratchpad();
  }
   ibus_reset();
   skip();
   convert_t();
   ibus_reset();
   skip();
   read_temperature();
   var1=(buffer[1]&0x0f)<<4;
   var2=buffer[0]>>4;
   t=var1|var2;      //t是当前测量的温度,没有小数部分。
	putc(t);
	putc(\n);
}
}

⌨️ 快捷键说明

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