?? 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 + -