英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 送上1-w总线读写函数。 [打印本页]

作者: winnie    时间: 2009-3-27 15:05
标题: 送上1-w总线读写函数。
PIC采用4M晶体,所有的延时经过严格调试,修改要小心!!
#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;
}




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2