#include<reg52.h>
#include <intrins.h>
#define ucr8 unsigned char
#define AT24c16 0xa0
sbit SDA = P2^0;
sbit SCL = P2^1;
/***************************************************************
函数名称:delay5us1;
函数类型:无;
函数参数:无;
子函数顺序:1;
函数功能:产生大约5US的延迟;
****************************************************************/
void delay5us1(void) //误差 -0.659722222222us
{
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
/*_____________________________________________________子函数结束*/
/*______________________________________________________________*/
/***************************************************************
函数名称:IICStart2;
函数类型:无;
函数参数:无;
子函数顺序:2;
函数功能:启动IIC总线;
****************************************************************/
void IICStart2(void)
{
SDA = 1;
SCL = 1;
delay5us1();
SDA = 0;
delay5us1();
}
/*_____________________________________________________子函数结束*/
/*______________________________________________________________*/
/***************************************************************
函数名称:IICStop3;
函数类型:无;
函数参数:无;
子函数顺序:3;
函数功能:结束IIC总线;
****************************************************************/
void IICStop3(void)
{
SDA = 0;
SCL = 0;
delay5us1();
SCL = 1;
SDA = 1;
}
/*_____________________________________________________子函数结束*/
/*______________________________________________________________*/
/***************************************************************
函数名称:IICSend4;
函数类型:无;
函数参数:unsigned char型;
子函数顺序:4;
函数功能:向IIC发送数据传输信号,并传输数据或者地址;
子函数内变量:i、dat、Judge;
****************************************************************/
void IICSend4(ucr8 dat)
{
ucr8 i,Judge;
Judge = 0x80;
for(i=0;i<8;i++)
{
SCL = 0;
delay5us1();
if( dat & Judge == 0) {SDA = 0;}
else {SDA = 1;}
Judge >>= 1;
delay5us1();
SCL = 1;
}
}
/*_____________________________________________________子函数结束*/
/*______________________________________________________________*/
/***************************************************************
函数名称:IICReceive5;
函数类型:unsigned char型;
函数参数:无;
子函数顺序:5;
函数功能:向IIC接收数据,并返回应答信号;
子函数内变量:i、dat、Judge;
****************************************************************/
ucr8 IICReceive5()
{
ucr8 i,dat;
dat = 0;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1;
delay5us1();
SCL = 1;
delay5us1();
dat <<= 1;
if(SDA == 1) {dat|= 0x01;}
delay5us1();
}
SCL = 0;
SDA = 1;
delay5us1();
SCL = 1;
return dat;
}
/*_____________________________________________________子函数结束*/
/*______________________________________________________________*/
void main(void)
{
IICStart2();
IICSend4(AT24c16);
IICSend4(0);
IICSend4();
IICStop3();
IICStart2();
IICSend4(AT24c16);
IICSend4(0);
IICStart2();
IICSend4(AT24c16+1);
P0 = IICReceive5();
IICStop3();
while(1);
}
帮忙看下程序 EEPROM数值总是读不出来
|