資源簡介
此程序?yàn)镃51編寫的24C01-24C16讀寫驅(qū)動(dòng)程序,晶振22.1148,如果是其他的晶振,需要更改其中的兩個(gè)延時(shí)函數(shù),要保證1MS和5US的延時(shí),在調(diào)用其中的write函數(shù)后,最好是延時(shí)10MS以上,否則容易失敗,我最初就是這個(gè)地方延時(shí)時(shí)是5MS始終失敗,搞了很久,后來把這個(gè)地方更改以后就成功了.在其中包括了一個(gè)PROTEUS仿真電路,運(yùn)行時(shí)首先會(huì)寫入一個(gè)字節(jié)到24C02中,然后讀出取反給P1顯示,顯示結(jié)果是01100110B,中間間隔2個(gè)LED亮,2個(gè)不亮.

代碼片段和文件信息
??#include?“reg52.h“
#include?“intrins.h“
#define?uchar?unsigned?char
#define?uint?unsigned?int
sbit?sda=P0^1;//;模擬I2C?數(shù)據(jù)傳送位
sbit?scl=P0^0;//;模擬I2C?時(shí)鐘控制狀態(tài)標(biāo)志
void?delay1(uint?z)//延時(shí)為?1ms
{?
unsigned?char?abc;
for(c=0;c ????for(b=80;b>0;b--)
????????for(a=10;a>0;a--);
}?
void?delay()//5us延時(shí)
{
????unsigned?char?a;
????for(a=3;a>0;a--);
}
void?star()//開始
{
sda=1;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
sda=0;
delay();//5us延時(shí)
}
void?stop()//停止
{
sda=0;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
sda=1;
delay();//5us延時(shí)
}
void?ack()//應(yīng)答
{?uchar?z=0;
while((sda==1)&&(z<50))z++;//條件判斷,?sda=1,則沒有應(yīng)答。如果沒有應(yīng)答則延時(shí):z<50,z++;后返回
scl=0;
delay();//5us延時(shí)
}
///寫一個(gè)數(shù)據(jù)函數(shù)
//器件寫地址?slave_write_address
//字節(jié)地址?byte_address
//待寫入數(shù)據(jù)?data_data
void?write(uchar?slave_write_addressuchar?byte_addressuchar?data_data)//寫一個(gè)數(shù)據(jù)
{
uchar?temptemp1iii;
star();//開始
for(ii=0;ii<3;ii++)//根據(jù)?24CXX文檔資料,和時(shí)序圖,按順序送:器件寫地址,字節(jié)地址,數(shù)據(jù)
{?
if(ii==0)
{
temp=slave_write_address;//送?器件寫地址
temp1=slave_write_address;
}
else?if(ii==1)
{
temp=byte_address;//送?字節(jié)地址
temp1=byte_address;
}
else?if(ii==2)
{
temp=data_data;//送?數(shù)據(jù)
temp1=data_data;
}
for(i=0;i<8;i++)
{
scl=0;
delay();//5us延時(shí)
temp=temp1;
temp=temp&0x80;//?相?與?后,把不相關(guān)的位清零
if(temp==0x80)//根據(jù)前面?相?與?后,判斷?temp是否等于0x80,是則該位為?1
sda=1;?
else
sda=0;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
scl=0;
delay();//5us延時(shí)
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
ack();
}
stop();//停止
}
///讀一個(gè)數(shù)據(jù)函數(shù)
//器件寫地址?slave_write_address
//器件讀地址?slave_read_address
//字節(jié)地址?byte_address
//讀出的數(shù)據(jù)?data_data
uchar?read(uchar?slave_write_addressuchar?byte_addressuchar?slave_read_address)//讀一個(gè)數(shù)據(jù)
{
uchar?temptemp1iiixdata_data;
star();//開始
for(ii=0;ii<3;ii++)//根據(jù)?24CXX文檔資料,和時(shí)序圖,按順序送:器件寫地址,字節(jié)地址,器件讀地址
{?
if(ii==0)
{
temp=slave_write_address;//送?器件寫地址
temp1=slave_write_address;
}
else?if(ii==1)
{
temp=byte_address;//送?字節(jié)地址
temp1=byte_address;
}
else?if(ii==2)
{?
star();//開始
temp=slave_read_address;//送?器件讀地址
temp1=slave_read_address;
}
?
for(i=0;i<8;i++)//開始讀數(shù)據(jù)
{
scl=0;
delay();//5us延時(shí)
temp=temp1;
temp=temp&0x80;//?相?與?后,把不相關(guān)的位清零
if(temp==0x80)//根據(jù)前面?相?與?后,判斷?temp是否等于0x80,是則該位為?1
sda=1;?
else
sda=0;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
scl=0;
delay();//5us延時(shí)
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
ack();//應(yīng)答
}
for(x=0;x<8;x++)
{
data_data=data_data<<1;//向左移入1位
sda=1;
delay();//5us延時(shí)
scl=0;
delay();//5us延時(shí)
scl=1;
delay();//5us延時(shí)
if(sda==1)//判斷?數(shù)據(jù)線是否是高電平
data_data|=0x01;//把讀到的數(shù)據(jù)?或?0X01?
//else?
//data_data|=0x00;
}
ack();//應(yīng)答
stop();//停止
return?data_data;//返回讀到的數(shù)據(jù)
}
void?main()
{?
write(0xa00xff0x66);//向器件寫一個(gè)數(shù)據(jù):(0xa0?是器件寫地址;0xff?是字節(jié)地址;0x66?是待寫入的數(shù)據(jù))
delay1(30);//寫與讀的時(shí)間間隔應(yīng)大于10ms取決于器件?24C02的響應(yīng)速度
//向器件讀一個(gè)數(shù)據(jù)
//把讀出的數(shù)據(jù)送?P1口顯示
P1=~read(0xa00xff0xa1);//向器件讀一個(gè)數(shù)據(jù):(0xa0?是器件寫地址;0xff?是字節(jié)地址;0xa1?是器件讀
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????7905??2010-08-13?16:04??24c02-16
?????文件???????3521??2010-08-13?16:04??24c02-16.c
?????文件???????8224??2010-08-13?16:04??24c02-16.OBJ
????.......?????13421??2010-08-13?16:04??24c02-16.uvproj
?????文件???????1041??2010-08-13?16:04??24c02-16.hex
?????文件?????????64??2010-08-13?16:04??24c02-16.lnp
?????文件???????7538??2010-08-13?16:04??24c02-16.LST
?????文件??????12704??2010-08-13?16:04??24c02-16.M51
????.......?????56644??2010-08-13?16:04??24c02-16.uvopt
????.......?????57622??2010-08-11?08:40??24c02-16_uvopt.bak
????.......?????13421??2010-08-10?23:19??24c02-16_uvproj.bak
?????文件??????99723??2010-08-13?16:04??24c64.DSN
?????文件????????885??2010-08-13?16:04??24c64.PWI
?????文件?????????19??2010-08-11?08:40??ExtDll.iex
?????文件??????99700??2010-08-11?08:40??Last?Loaded?24c64.DBK
?????文件????????749??2010-08-13?16:04??STARTUP.OBJ
?????文件???????6376??2009-05-07?14:37??STARTUP.A51
?????文件??????14048??2010-08-13?16:04??STARTUP.LST
?????文件???????1002??2010-08-13?16:04??24c02-16.plg
-----------?---------??----------?-----??----
???????????????404607????????????????????19
評(píng)論
共有 條評(píng)論