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

📄 w_1.c

📁 一线制通讯 communication
💻 C
字号:
#define false 0
#define true  1
#define uchar unsigned char
#define uint  unsigned int
#define bool  unsigned char
#define ulong unsigned long

 

#define Hi 1
#define Low 0
#define DQ RA4
#define SetDQ TRISA4


void delay(unsigned int val){
 while(val--);
}

bool OWReset(){
 unsigned char presence;
 unsigned char i=2;
 SetDQ=Hi;
 SetDQ=Low;                                                 //设定TRIS来控制总线高低,这是PIC独特的形式
 DQ=0;                                                           //刷新PORT,避免干扰
 delay(42);  //480us
 SetDQ=Hi;
 while(--i);  //7us
 if(!DQ)
  i=1;                                                               //7us后检测总线,正常情况下总线不可能为低。
 delay(4);  //61us
 presence=DQ;
 delay(35);  //400us
 if(i || presence)
  return false;
 return true;
}

bool OWReadBit(){
 unsigned char sampling=2;
 SetDQ=Low;
 while(--sampling);
 SetDQ=Hi;
 sampling=0; 
 NOP();NOP();NOP();NOP();
 if(DQ)sampling++;                                         //10us后连续3次采样总线
 if(DQ)sampling++;
 if(DQ)sampling++;
 delay(4);  //60us
 if(sampling>=2)                                                   //采3取2,提高可靠性
  return 1;
 return 0;
}

unsigned char OWReadByte(){
 unsigned char i;
 unsigned char val=0;
 for(i=8;i!=0;i--){
  val>>=1;
  if(OWReadBit())
   val|=0x80;                                                         //最接近汇编的写法
 }
 return val;
}   

bool OWWriteBit(bool bitval){
 unsigned char sampling=0;
 SetDQ=Low;
 NOP();NOP();
 if(bitval&0x01)
  SetDQ=Hi;
 NOP();NOP();NOP();NOP();
 if(DQ)sampling++;
 NOP();NOP();NOP();NOP();
 if(DQ)sampling++;
 NOP();NOP();NOP();NOP();
 if(DQ)sampling++;                                                      //采3取2来判断总线状态是否和写位一致,如果有干扰或短路

                                                                                    //可以及时检查出。
 delay(2);
 sampling=(sampling>=2);
 SetDQ=Hi;
 if(sampling==bitval)
  return true;
 return false;
}

bool OWWriteByte(unsigned char val){
 unsigned char i;
 for(i=8;i!=0;i--){
  if(!OWWriteBit(val&0x01))
   return false;
  val>>=1;
 }
 return true;
}

⌨️ 快捷键说明

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