📄 readromcode.c
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define nop _nop_()
void write_bits(unsigned char,unsigned char);
void write_byte(unsigned char,unsigned char);
unsigned char read_bit(unsigned char);
unsigned char read_byte(void);
unsigned char reset_18b20(void);
unsigned char correct(unsigned char*,unsigned char,unsigned char);
void dly(void);
unsigned char SearchRom(unsigned char *);
sbit sline=P3^4;
unsigned char LastDiscrepancy;
unsigned char LastDeviceFlag;
void main(void)
{
unsigned char Romnum[8];
unsigned char result;
unsigned char i;
bit first;
for(i=0;i<8;i++)
{
Romnum[i]=0;
}
first=1;
do
{
if(first)
{
LastDiscrepancy=0;
LastDeviceFlag=0;
}
result=SearchRom(Romnum);
if(first)
first=0;
}while(result);
}
unsigned char SearchRom(unsigned char *Romnum)
{
unsigned char mask,rom_byte_num,last_zero;
unsigned char id_bit,cmp_id_bit,id_bit_number;
unsigned char SearchDirection;
mask=0x01;
rom_byte_num=0;
id_bit_number=1;
last_zero=0;
if(!LastDeviceFlag)
{
if(reset_18b20())
{
write_byte(0xfe,0xf0);
do
{
id_bit=read_bit(0xfe);
cmp_id_bit=read_bit(0xfe);
if(id_bit==1&&cmp_id_bit==1)
{
return(0);
}
if(id_bit!=cmp_id_bit)
{
SearchDirection=id_bit;
}
else
{
if(id_bit_number<LastDiscrepancy)
{
SearchDirection=((Romnum[rom_byte_num]&mask)>0);
}
else
{
SearchDirection=(id_bit_number==LastDiscrepancy);
}
if(SearchDirection==0)
{
last_zero=id_bit_number;
}
}
if(SearchDirection==1)
Romnum[rom_byte_num]|=mask;
else
Romnum[rom_byte_num]&=~mask;
write_bits(0xfe,SearchDirection);
id_bit_number++;
mask<<=1;
if(mask==0)
{
rom_byte_num++;
mask=0x01;
}
}while(rom_byte_num<8);
if(id_bit_number==65)
{
LastDiscrepancy=last_zero;
if(LastDiscrepancy==0)
LastDeviceFlag=1;
}
if(!correct(Romnum,8,0))
{
return(1);
}
}
}
return(0);
}
void write_bits(unsigned char bitsite,unsigned char bitval)
{
unsigned char i;
_nop_();
P1=bitsite;
for(i=0;i<3;i++);
if(bitval)
P1=0xff;
for(i=0;i<7;i++);
P1=0xff;
for(i=0;i<3;i++);
}
unsigned char read_bit(unsigned char bitsite)
{
unsigned char i,temp;
_nop_();
P1=bitsite;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P1=0xff;
for(i=0;i<3;i++);
temp=P1;
for(i=0;i<7;i++);
P1=0xff;
for(i=0;i<5;i++);
return(temp&(~bitsite));
}
void write_byte(unsigned char cablesite,unsigned char val)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=val&0x01;
val>>=1;
write_bits(cablesite,temp);
dly();
}
}
unsigned char reset_18b20(void)
{
unsigned char j;
bit tmp;
_nop_();
sline=0;
for(j=0;j<167;j++);
sline=1;
for(j=0;j<20;j++);
_nop_();
for(j=0;j<255;j++)
{
tmp=sline;
if(!tmp)
{
for(j=0;j<167;j++);
return(1);
}
}
return(0);
}
void dly(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
unsigned char correct(unsigned char*p,unsigned char length,unsigned char creatcode)
{
unsigned char i=0;
while(length--)
{
for(i=0;i<8;i++)
{
if((creatcode^*p)&0x01)
creatcode=(creatcode>>1)^0x8c;
else
creatcode=creatcode>>1;
*p=_cror_(*p,1);
}
p++;
}
return(creatcode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -