📄 200622894827.c
字号:
#include <intrins.h>
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define NOP5 _nop_();_nop_();_nop_()
#define NOP2 _nop_()
sbit SDA=P1^0;//模拟口线
sbit SCL=P1^1;
////////////////////////////////////////////////////////
///
///24c01--24c1024模拟口线通讯程序
///2006.2 鲁志远
///lzylzy123@yahoo.com.cn
////////////////////////////////////////////////////////
//源程序由函数组成,程序清单如下:
void Init(void)
{
SCL=1;
NOP5;
SDA=1;
NOP5;
}
void start(void)//启动I2C总线,退出时SCL为低
{
SDA=1;
NOP5;
SCL=1;
NOP5;
SDA=0;
NOP5;
SCL=0;
NOP5;
}
//---------------------------------------------------------
void stop(void )//*停止I2C总线
{
SCL=0;
SDA=0;
NOP5;
SCL=1;
SDA=1;
NOP5;
}
//---------------------------------------------------------
void ack(void )/*发送应答位*/
{
SDA=0;
NOP5;
SCL=1;
NOP5;
SCL=0;
NOP2;
SDA=1;
}
//---------------------------------------------------------
void Nack(void )//发送非应答位
{
SDA=1;
NOP2;
SCL=1;
NOP2;
SCL=0;
}
//----------------------------------------------------------
bit cack(void )//应答位检查返回1表示应答正常
{
bit i=0;
SDA=1;
NOP2;
SCL=1;
NOP2;
if(SDA==1)
{i=0;}
else
i=1;
SCL=0;
SDA=1;
return(i);
}
//-------------------------------------------------------------
/*向虚拟I2C总线上发送1个数据字节*/
void wrbyt(uchar shu)//向虚拟I2C总线上发送1个数据字节退出时SCL为低
{
uchar data i;
for(i=0;i<8;i++)
{
if((shu&0x80)>0)
{
SDA=1;
}
else
SDA=0;
NOP2;
SCL=1;
NOP2;
SCL=0;
shu=shu<<1;
}
SCL=0;
SDA=0;
}
//--------------------------------------------------------------
/*从I2C总线上读取1个数据字节*/
uchar rdbyt(void )
{
uchar n=0x00;
uchar j;
for(j=0;j<8;j++)
{
SCL=1;
NOP2;
if(SDA==0)
n=n<<1;
else
{
n=n<<1;
n=n+1;
}
// NOP2;
SCL=0;
}
SDA=1;
SCL=1;
return(n);
}
//---------------------------------------------------------
//向24C04随机写一字节
//d数据 n数据地址 x芯片型号
//芯片型号AT24C01--24C16=0; AT24C0164--AT24C1024=1;
void wr_byta( uchar data d, ulong data n, bit x)
{
uchar data a=0;
uchar data j=0;
uchar data c=0;
//24c01--24c16操作
if(x==0)
{
j = n/255;//业面地址
a = n%255;//面内地址
j = j<<1;
j = j+0xa0;
start();//启动I2C总线,退出时SCL为低
wrbyt(j);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
if (cack()==1)
{
wrbyt(d);//发送1个字节,写数据
if (cack()==1)
{
stop( );//停止I2C总线
}
}
}
}
//24c164--24c1024操作
if(x==1)
{
if(n>65025)
{
c=0xa2;
n-=57039;
j=n/255;//业面地址
a=n%255;//面内地址
}
else
{
j=n/255;//业面地址
a=n%255;//面内地址
c=0xa0;
}
start();//启动I2C总线,退出时SCL为低
wrbyt(c);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(j);//发送1个字节,写片内地址1
if (cack()==1)
{
wrbyt(a);//发送1个字节,写片内地址2
if (cack()==1)
{
wrbyt(d);//发送1个字节,写数据
if (cack()==1)
{
stop( );//停止I2C总线
}
}
}
}
}
}
//-----------------------------------------------------------------------
//向24C04随机读一字节
//n数据地址 x芯片类型
//芯片型号AT24C01--24C16=0; AT24C0164--AT24C1024=1;
uchar rd_byta(ulong data n, bit x)
{
uchar data c=0;
uchar data a=0;
uchar data j=0;
uchar data tt=0;
if(x==0)
{
j = n/255;//业面地址
a = n%255;//面内地址
j = j<<1;
j = j+0xa0;
start();//启动I2C总线
wrbyt(j);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
j=j>>1;
j=j<<1;
j=j+1; //设置读标志
start();//重新启动I2C总线
wrbyt(j);//发送1个字节写芯片地址和读信息
if (cack()==1)//应答位检查返回1表示应答正常
{
tt=rdbyt( );
// Nack( ); //*发送应答位*/
stop( );//*停止I2C总线
}
}
}
return(tt);
}
if(x==1)
{
if(n>65025)
{
c=0xa2;
n-=57039;
j=n/255;//业面地址
a=n%255;//面内地址
}
else
{
j = n/255;//业面地址
a = n%255;//面内地址
c=0xa0;
}
start();//启动I2C总线
wrbyt(c);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(j);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
c=c>>1;
c=c<<1;
c=c+1; //设置读标志
start();//重新启动I2C总线
wrbyt(c);//发送1个字节写芯片地址和读信息
if (cack()==1)//应答位检查返回1表示应答正常
{
tt=rdbyt( );
Nack( ); //*发送应答位*/
stop( );//*停止I2C总线
}
}
}
}
return(tt);
}
}
/*---------------------------------------------------------
向24C04随机写多字节,
每次一页面:
24c01,24c02:8字节,
24c04,24c08,24c16:16字节.
24c32,24c64:32字节.
24c128,24c256:64字节.
24c512:128字节.
24c1024:256字节.
d数据头 p数据个数, n数据起使地址 x芯片型号
芯片型号AT24C01--24C16=0; AT24C0164--AT24C1024=1; */
void wr_byta_8x( uchar data *d, uchar data p, ulong data n, bit x)
{
uchar data a=0;
uchar data j=0;
uchar data c=0;
uchar data i=0;
//24c01--24c16操作
if(x==0)
{
j = n/255;//业面地址
a = n%255;//面内地址
j = j<<1;
j = j+0xa0;
start();//启动I2C总线,退出时SCL为低
wrbyt(j);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
for(i=0; i<p; i++)
{
cack();
wrbyt(d[i]);//发送1个字节,写数据
}
if (cack()==1)
{
stop( );//停止I2C总线
}
}
}
//24c164--24c1024操作
if(x==1)
{
if(n>65025)
{
c=0xa2;
n-=57039;
j=n/255;//业面地址
a=n%255;//面内地址
}
else
{
j=n/255;//业面地址
a=n%255;//面内地址
c=0xa0;
}
start();//启动I2C总线,退出时SCL为低
wrbyt(c);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(j);//发送1个字节,写片内地址1
if (cack()==1)
{
wrbyt(a);//发送1个字节,写片内地址2
for(i=0; i<p; i++)
{
if (cack()==1)
{
wrbyt(d[i]);//发送1个字节,写数据
}
}
if (cack()==1)
{
stop( );//停止I2C总线
}
}
}
}
}
//-----------------------------------------------------------------------
//向24C04读多字节
//n数据地址 x芯片类型
//d数据头 X数据个数, n数据起使地址 x芯片型号
//芯片型号AT24C01--24C16=0; AT24C0164--AT24C1024=1;
void rd_byta_8x(uchar data *d, uchar data p, ulong data n, bit x)
{
uchar data c=0;
uchar data a=0;
uchar data j=0;
uchar data i=0;
if(x==0)
{
j = n/255;//业面地址
a = n%255;//面内地址
j = j<<1;
j = j+0xa0;
start();//启动I2C总线
wrbyt(j);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
j=j>>1;
j=j<<1;
j=j+1; //设置读标志
for(i=0; i<(p); i++)
{
start();//重新启动I2C总线
wrbyt(j);//发送1个字节写芯片地址和读信息
if (cack()==1)//应答位检查返回1表示应答正常
{
d[i]=rdbyt();
ack( ); //*发送应答位*/
}
}
stop( );//停止I2C总线
}
}
}
if(x==1)
{
if(n>65025)
{
c=0xa2;
n-=57039;
j=n/255;//业面地址
a=n%255;//面内地址
}
else
{
j = n/255;//业面地址
a = n%255;//面内地址
c=0xa0;
}
start();//启动I2C总线
wrbyt(c);//发送1个字节,写芯片地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(j);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
wrbyt(a);//发送1个字节,写片内地址
if (cack()==1)//应答位检查返回1表示应答正常
{
c=c>>1;
c=c<<1;
c=c+1; //设置读标志
for(i=0; i<(p); i++)
{
start();//重新启动I2C总线
wrbyt(c);//发送1个字节写芯片地址和读信息
if (cack()==1)//应答位检查返回1表示应答正常
{
d[i]=rdbyt();
ack( ); //*发送应答位*/
}
}
stop( );//停止I2C总线
}
}
}
}
}
//---------------------------------------
//延时10MS,延时时间为yan10ms*W
void yan10ms(uchar w)
{
uchar data k;
uint data i;
for(k=0;k<=w;k++)
{
for(i=0;i<=0x800;i++)
{
;
}
}
}
//--------------------------------------------------------------//
void main (void)
{
uchar data a1 = 0;
uchar data a2 = 0;
uchar data cc[24]={0};
while(1)
{
for(a1=0; a1<24; a1++)
{
cc[a1]=a1*10+1;
}
////24c256多字节读写
wr_byta_8x( &cc, 24, 0x10, 1);
rd_byta_8x( &cc, 24, 0x10, 1);
//单字节读写
for(a1=0; a1<20; a1++)
{
wr_byta(10+a1,0x10+a1,1);
yan10ms(10);
}
for(a1=0; a1<20; a1++)
{
a2=rd_byta(10+a1,1);
yan10ms(10);
}
////24c01多字节读写
wr_byta_8x( &cc, 8, 0x10, 0);
rd_byta_8x( &cc, 8, 0x10, 0);
//单字节读写
for(a1=0; a1<20; a1++)
{
wr_byta(10+a1,0x10+a1,0);
yan10ms(10);
}
for(a1=0; a1<20; a1++)
{
a2=rd_byta(10+a1,0);
yan10ms(10);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -