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

📄 readromcode.c

📁 ds1820或ds18b20的读序列码子程序
💻 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 + -