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

代碼片段和文件信息
??#include?“reg52.h“
#include?“intrins.h“
#define?uchar?unsigned?char
#define?uint?unsigned?int
sbit?sda=P0^1;//;模擬I2C?數據傳送位
sbit?scl=P0^0;//;模擬I2C?時鐘控制狀態標志
void?delay1(uint?z)//延時為?1ms
{?
unsigned?char?abc;
for(c=0;c ????for(b=80;b>0;b--)
????????for(a=10;a>0;a--);
}?
void?delay()//5us延時
{
????unsigned?char?a;
????for(a=3;a>0;a--);
}
void?star()//開始
{
sda=1;
delay();//5us延時
scl=1;
delay();//5us延時
sda=0;
delay();//5us延時
}
void?stop()//停止
{
sda=0;
delay();//5us延時
scl=1;
delay();//5us延時
sda=1;
delay();//5us延時
}
void?ack()//應答
{?uchar?z=0;
while((sda==1)&&(z<50))z++;//條件判斷,?sda=1,則沒有應答。如果沒有應答則延時:z<50,z++;后返回
scl=0;
delay();//5us延時
}
///寫一個數據函數
//器件寫地址?slave_write_address
//字節地址?byte_address
//待寫入數據?data_data
void?write(uchar?slave_write_addressuchar?byte_addressuchar?data_data)//寫一個數據
{
uchar?temptemp1iii;
star();//開始
for(ii=0;ii<3;ii++)//根據?24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節地址,數據
{?
if(ii==0)
{
temp=slave_write_address;//送?器件寫地址
temp1=slave_write_address;
}
else?if(ii==1)
{
temp=byte_address;//送?字節地址
temp1=byte_address;
}
else?if(ii==2)
{
temp=data_data;//送?數據
temp1=data_data;
}
for(i=0;i<8;i++)
{
scl=0;
delay();//5us延時
temp=temp1;
temp=temp&0x80;//?相?與?后,把不相關的位清零
if(temp==0x80)//根據前面?相?與?后,判斷?temp是否等于0x80,是則該位為?1
sda=1;?
else
sda=0;
delay();//5us延時
scl=1;
delay();//5us延時
scl=0;
delay();//5us延時
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延時
scl=1;
delay();//5us延時
ack();
}
stop();//停止
}
///讀一個數據函數
//器件寫地址?slave_write_address
//器件讀地址?slave_read_address
//字節地址?byte_address
//讀出的數據?data_data
uchar?read(uchar?slave_write_addressuchar?byte_addressuchar?slave_read_address)//讀一個數據
{
uchar?temptemp1iiixdata_data;
star();//開始
for(ii=0;ii<3;ii++)//根據?24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節地址,器件讀地址
{?
if(ii==0)
{
temp=slave_write_address;//送?器件寫地址
temp1=slave_write_address;
}
else?if(ii==1)
{
temp=byte_address;//送?字節地址
temp1=byte_address;
}
else?if(ii==2)
{?
star();//開始
temp=slave_read_address;//送?器件讀地址
temp1=slave_read_address;
}
?
for(i=0;i<8;i++)//開始讀數據
{
scl=0;
delay();//5us延時
temp=temp1;
temp=temp&0x80;//?相?與?后,把不相關的位清零
if(temp==0x80)//根據前面?相?與?后,判斷?temp是否等于0x80,是則該位為?1
sda=1;?
else
sda=0;
delay();//5us延時
scl=1;
delay();//5us延時
scl=0;
delay();//5us延時
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延時
scl=1;
delay();//5us延時
ack();//應答
}
for(x=0;x<8;x++)
{
data_data=data_data<<1;//向左移入1位
sda=1;
delay();//5us延時
scl=0;
delay();//5us延時
scl=1;
delay();//5us延時
if(sda==1)//判斷?數據線是否是高電平
data_data|=0x01;//把讀到的數據?或?0X01?
//else?
//data_data|=0x00;
}
ack();//應答
stop();//停止
return?data_data;//返回讀到的數據
}
void?main()
{?
write(0xa00xff0x66);//向器件寫一個數據:(0xa0?是器件寫地址;0xff?是字節地址;0x66?是待寫入的數據)
delay1(30);//寫與讀的時間間隔應大于10ms取決于器件?24C02的響應速度
//向器件讀一個數據
//把讀出的數據送?P1口顯示
P1=~read(0xa00xff0xa1);//向器件讀一個數據:(0xa0?是器件寫地址;0xff?是字節地址;0xa1?是器件讀
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????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
- 上一篇:DES加密解密算法C++程序設計
- 下一篇:MAX485兩個單片機半雙工通信
評論
共有 條評論