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

📄 code.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
字号:
#include <REG52.H>    
#include <INTRINS.H>  

//***************************宏定义***********************************
#define uchar unsigned char
#define uint   unsigned int
#define T4us _nop_();_nop_();_nop_();_nop_() 			//延时4μs 
#define T6us _nop_();_nop_();_nop_();_nop_();_nop_() //延时6μs 
//***************************端口定义***********************************
sbit DATA_BIT=P1^0;			  //定义1-Wire总线
sbit sda=P3^6;			   	//AT24C02数据线
sbit scl=P3^7;			   	// AT24C02时钟线

//**********************端口复位程序**************************
bit Reset1990A(void)   
{   
    uchar i;   
    bit a;   
    DATA_BIT=0;                   		//拉低总线    
    for (i=230;i>0;--i);          	//保持500us
    DATA_BIT=1;                   		//释放总线    
    i=255;                        		//超时1.6ms 
    while (--i)   
    if (DATA_BIT==1)       			//等待总线拉高    
    {   
        a=0;   
        for (i=63;i>0;--i)     		//延时480us    
        a|=!DATA_BIT;    				//采集总线状态    
        return a;             			//返回总线状态    
    }   
    return  0;                    		//返回失败标示    
}

//*************************读写位程序*****************************
void Bit1990A (void)   
{   
    uchar i;   
    DATA_BIT=0;                      	//总线拉低    
    T4us;                            	//延时4us    
    DATA_BIT=CY;                     	//写入电平 CY=PSW^7
    T6us;                            	//延时6us    
    CY=DATA_BIT;                     	//读入电平    
    i=23;   
    while(--i);                      	//延时50us    
    DATA_BIT=1;                      	//释放总线    
} 

//*************************写数据字节程序*****************************
void WriteByte(uchar indata)   
{   
    uchar i;   
    for(i=8;i>0;--i)              		//共写8位    
    {   
        indata>>=1;           			//低位先写    
        Bit1990A();           			//写1位    
    }    
}

//*************************读数据字节程序*****************************
uchar ReadByte(void)   
{   
    uchar a=0xFF,i;                		//读数据类似于写0xFF    
    for(i=8;i>0;--i)   
    {   
        a>>=1;                  			//移出低位    
        Bit1990A();             			//读1位    
        if(CY)   
            a|=0x80;   
     }   
     return a;
 } 

//*************************读数CRC校验程序*****************************
uchar Data_Crc(uchar indata,uchar crc)   
{   
    uchar i;   
    bit b;   
    for(i=8;i>0;--i)   
    {   
       if(b=(bit)((indata^crc)&0x01))     	//判断与x7异或的结果(x8)    
            crc^=0x18;                  		//反馈到x5 x4    
       crc>>=1;                            		//移位    
       if(b)   
          crc|=0x80;                  			//x7异或的结果送x0    
       indata>>=1;   
   }   
   return crc;   
}  

//*************************读DS1990A程序*****************************
bit Read1990A(uchar idata *pt)   
{   
    uchar c,i,crc;   
    for(c=10;c>0;--c)                                 //最多读10次    
    {   
        if (Reset1990A())                             //检查复位是否正确    
           {   
               WriteByte(0x33);                       //发出读ROM命令    
               crc=0;                                	 //CRC校验赋初值    
               for (i=7;i>0;--i,++pt)                //读出前面7个字节    
                {   
                     *pt= ReadByte();   
                      crc=Data_Crc(*pt,crc);       	 //进行校验    
                }   
                *pt= ReadByte();                      //读出Ibutton中的CRC值    
                if (crc==*pt)                         //比较    
                        return 1;                   	//成功返回1    
            }   
      }   
      return 0;                                       //失败返回0    
}  

//*************************启动I2C总线 *****************************
void I2CStart(void)   
{   
	scl=0;   
	sda=1;					//发送起始条件的数据信号    
	T6us;   
	scl=1;   
	T6us;					//起始条件建立时间大于4.7μs    
	sda=0;					//发送起始信号    
	T6us;					//起始条件锁定时间大于4μs    
	scl=0;					//钳住I2C总线准备发送或接收数据    
	sda=1;   
}   
//*************************停止I2C总线 ***************************** 
void I2CStop(void)   
{   
sda=0;				//发送结束条件的数据信号    
sda=0;   
T6us;   
scl=1;   
T6us;				//STOP时SCL至少领先SDA 4μs    
sda=1;				//发送I2C总线结束信号    
T6us;				//STOP后必须至少维持4.7us方可START    
}   
 //**********************发送应答位或非应答位 **************************
void SendAck(bit ack)   
{   
sda=ack;				//发出应答或非应答信号    
T6us;   
scl=1;   
T6us;   
scl=0;				//清时钟线钳住I2C总线以便继续接收    
T6us;   
}

//*************************I2C总线读字节函数*************************
uchar I2CReadByte(void)   
{   
uchar i=8;   
uchar temp;   
scl=0;   
while(i--)   
{   
scl=1;					//置时钟线为高使数据线上数据有效    
T6us;   
temp=(temp<<1)|sda;   
scl=0;   
T6us;   
}   
return temp;   
}  
//************************* I2C总线写字节函数***************************** 
bit I2CWriteByte(uchar byte)   
{   
    bit ack;
	uchar i=8;   
    sda=1;   
    T6us;   
	for(;i>0;i--)				//要传送的数据长度为8bit
	{   
		if((byte&0x80)>0)
		{   
			sda =1;   
			scl=1;   
			T6us;   
			scl=0;   
			sda =0;   
		}   
		else
		{   
			sda=0;   
			scl=1;   
			T6us;   
			scl=0;   
		}   
		byte<<=1; 
	}   
	sda=1;						//发送完后释放数据线    
	T6us;   
	scl=1;   
	T6us;   
	do{}while(1==sda);			//准备接收应答位    
	ack=1;   
	scl=0;   
	return ack;   
} 

//************************* AT24C32读数据函数**********************
uchar AT24C32ReadByte(uint addr)   
{   
	uchar temp;   
	uchar HighAddr;   
	uchar LowAddr;   
	I2CStart();   
	HighAddr=addr>>8;   
	LowAddr=addr&0xFF;   
	I2CWriteByte(0xA0);			//实现写操作    
	I2CWriteByte(HighAddr);		//发送高地址    
	I2CWriteByte(LowAddr);		//发送低地址    
	I2CStart();   
	I2CWriteByte(0xA1);			//实现读操作    
	temp=I2CReadByte();   
	SendAck(1);   
	I2CStop();   
	return temp;   
}   
//************************* AT24C32写数据函数*********************** 
void AT24C32WriteByte(uint addr,uchar value)   
{   
	uchar HighAddr;   
	uchar LowAddr;   
	I2CStart();   
	HighAddr=addr>>8;   
	LowAddr=addr&0xff;   
	I2CWriteByte(0xA0);				//实现写操作    
	I2CWriteByte(HighAddr);			//发送高地址    
	I2CWriteByte(LowAddr);			//发送低地址    
	I2CWriteByte(value);   
	I2CStop();   
	T6us;   
}

//功能演示,在实际用的时候把这段注释掉    
//*****************************    
void main(void)   
   
{   
        uchar data a[8];    //定义存放SN的数组    
        bit cc;   
        uchar idata *pt;   
        pt=&a[0];   
        cc=Read1990A(pt);   //读Ibutton        
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -