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

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3893|回复: 0
打印 上一主题 下一主题

送上1-w总线读写函数。

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-27 15:05:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-26 09:20 , Processed in 0.055994 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表