#include"config.h" #include"Port.h" #include"One_Line.h" static uint8 accep; //用来保存接收数据 /*************************************************************** *名称:reset *功能:复位和等待应答 *参数:无 *返回:无 *说明:发送复位低电平至少要为480us ****************************************************************/ void reset(void) { do{ DQ =0; /*发送复位信号 */ time500(); /*延时大概500us */ DQ =1; /*上拉等待应答 */ time20(); time20(); time20(); }while (DQ!=0); /*查询是否接收到应答信号*/ DQ =1; } /*************************************************************** *名称:readbyte *功能:使用1—wire读一个字节 *参数:无 *返回:读到的数据 *说明:读时必须注意时序问题 ****************************************************************/ uint8 readbyte(void) { uint8 i; for (i=0;i<8;i++) { DQ = 1; accep=accep>>1; /* accep中的各位数右移一位*/ DQ =0; /*发读信号 */ _nop_(); DQ =1; _nop_(); /*等待数据输入 */ _nop_(); _nop_(); _nop_(); _nop_(); if (DQ==1) /*读取ID号的一位数,存放accep中*/ accep|=0x80; time20(); /*等待数据释放 */ time20(); time20(); time20(); _nop_(); _nop_(); } return(accep); /*返回读取到accep中的数据 */ } /*************************************************************** *名称:read *功能:读NUMBER个字节子程序 *参数:number--读取的长度,ff--存放读取数据的缓冲区 *返回:无 *说明:该函数直接调用readbyte来读取N个字节 ****************************************************************/ uint8 read(uint8 number,uint8 ff[]) { sint8 j; uint8 crc_temp=0; for (j=number-1;j>=0;j--) { ff[j]=readbyte(); crc_temp=do_crc(ff[j],crc_temp);/*每读一个字节进行CRC校验*/ } return(crc_temp); } /*************************************************************** *名称:write *功能:写一位子程序 *参数:tt--要写的一位数据,值了0或者1 *返回:无 *说明:该函数直接调用readbyte来读取N个字节 ****************************************************************/ void write(uint8 tt) { if (tt==1) /*写1时*/ { DQ =0; _nop_(); DQ =1; time20(); time20(); time20(); DQ =1; _nop_(); } else /*写0时*/ { DQ =0; time20(); time20(); time20(); DQ =1; _nop_(); } } /*************************************************************** *名称:writebyte *功能:写一个字节程序 *参数:comd--要写的一个字节数据 *返回:无 *说明:该函数直接调用write函数来写1个字节 ****************************************************************/ void writebyte(uint8 comd) { uint8 temp1; uint8 i; for (i=0;i<8;i++) { temp1=comd&0x01; write(temp1); comd=comd>>1; } } /*************************************************************** *名称:do_crc *功能:CRC校验 *参数:testcrc--要做CRC校验的值 crc--CRC校验本身的值 *返回:无 *说明: ****************************************************************/ uint8 do_crc(uint8 testcrc,uint8 crc) { uint8 i; uint8 bb,cc,dd; dd=testcrc; for (i=0;i<8;i++) { bb=dd^crc; cc=bb; bb=crc; switch (cc&0x01!=0) { case 1: bb=bb^0x18; bb=bb>>1; bb=bb|0x80; crc=bb; dd=dd>>1; break; case 0: bb=bb>>1; crc=bb; dd=dd>>1; break; } } return(crc); } /*************************************************************** *名称:time20 *功能:延时 20us 子函数 *参数:无 *返回:无 *说明:使用定时器0,在方式1下,定时20us ****************************************************************/ void time20(void) { TH0=0xFF; TL0=0xF6; TR0=1; do{}while (!TF0); TF0=0; TR0=0; } /*************************************************************** *名称:time500 *功能:延时 500us 子函数 *参数:无 *返回:无 *说明:使用定时器0,在方式1下,定时500us ****************************************************************/ void time500(void) { TH0=0xFF; TL0=0x06; TR0=1; do{}while (!TF0); TF0=0; TR0=0; }