資源簡介
proteus_24C08—有注釋(proteus里面使用的是24c02)(注釋比較全面,適合初學者)
代碼片段和文件信息
/**************************************************************************************
*使用24C08的時候,只要使用下面這兩個函數即可
*uchar?read_e2p(uint?address):在24c02中的某地址讀取一個字節
*void?write_e2p(uchar?chuint?address):在24c02的某地址寫入一字節ch
******************************************************************************************/
#include?
#include?
/***定義數據類型*****/
#define?uchar?unsigned?char?
#define?uint??unsigned?int
#define?ulong?unsigned?long
#define?delay5NOP()?{_nop_();_nop_();_nop_();_nop_();_nop_();}
/*********由于使用的是24C08,所以有四個地址****/
#define WriteDeviceAddress?0xa0 //定義器件在IIC總線中的地址
#define WriteDeviceAddress1?0xa2
#define ReadDviceAddress?0xa1
#define ReadDviceAddress1?0xa3
/*******定義管腳******/
sbit?SCL=P2^0;//24C08的管腳6連接的連線
sbit?SDA=P2^1;//24C08的管腳5連接的連線
sbit?BUTTON=P1^0;
/***定時函數***/
void?DelayMs(uint?number)?
{
uchar?temp;
for(;number!=0;number--)?
{
for(temp=112;temp!=0;temp--);
}
}
/**************
*IIC總線的開始位
*****************/
void?Start()?
{
SDA=1;
delay5NOP();
SCL=1;
delay5NOP();
SDA=0;//在SCL高電位的時候,數據線由高變低
delay5NOP();
SCL=0;
}
/*****************
*IIC總線的結束位
****************/
void?Stop()?
{
SCL=0;
delay5NOP();
SDA=0;
delay5NOP();
SCL=1;//在SCL高電位的時候,數據線由低變高
delay5NOP();
SDA=1;
}
/**************
*測試位:用于檢查24C08這個器件有沒有收到數據
**************/
bit?TestAck()?
{
bit?ErrorBit;
SDA=1;
delay5NOP();
SCL=1;//SDA和SCL同時拉高,看看SDA會不會被24C08給拉低了
delay5NOP();
ErrorBit=SDA;
SCL=0;
return(ErrorBit);//如果這時的ErrorBit是低電位的時候,說明是正確的
}
/********************
*這個函數和TestAck()?是一樣的,只是TestAck()?有錯誤返回
*********************/
void?NoAck()?
{
SDA=1;
delay5NOP();
SCL=1;
delay5NOP();
SCL=0;
}
/********************
*傳輸8個數據到24C08上面去
******************/
Write8Bit(uchar?input)?
{
uchar?temp;
for(temp=8;temp!=0;temp--)?
{
SDA=(?bit?)(?input&0x80?);//這里采用強制轉換的方式,數據被強制轉換成bit的形式
//8位數據被強制轉化成bit后,只保留最高位
SCL=1;
delay5NOP();
SCL=0;//數據準備好后,在SCL的下降沿讀入數據
input=input<<1;//繼續分解這個8位數
}
}
/*********************
*指定一個地址,對這個地址寫入一個數
**********************/
void?write_e2p(uchar?chuint?address)?
{
Start();
if(address<256)
{
Write8Bit(WriteDeviceAddress);//24C08器件的地址,可以理解為24C08的一個block
TestAck();
Write8Bit(address);//寫入這個block具體的地址
TestAck();
}
else
{
Write8Bit(WriteDeviceAddress1);
TestAck();
Write8Bit(address-256);
TestAck();
}
Write8Bit(ch);//對這個地址寫入一個數據
TestAck();
Stop();
DelayMs(10);//這個延時是為了防止兩次調用write_e2p的間隔太短,而導致數據重疊
}
/******************************
*從24C08讀出8個bit的數據
***************************/
uchar?Read8Bit()?
{
uchar?tempread_byte=0;
for(temp=8;temp!=0;temp--)?
{
SCL=1;
read_byte?<<=?1;
read_byte?|=?SDA;//對位進行強制轉換成uchar后,高位全為零,只有最低位才是“這個bit”
SCL=0;
}
return(?read_byte?);
}
/**************************
*指定一個地址,并從這個地址里面讀出一個數,返回這個數
************************/
uchar?read_e2p(uint?address)?
{
uchar?ch;
Start();
if(address<256)
{
Write8Bit(Write
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????517??2010-04-11?11:44??24C08\24c08.plg
?????文件???????4088??2010-04-11?11:43??24C08\main.c
?????文件?????????26??2010-04-11?11:43??24C08\24c08.lnp
?????文件??????10377??2010-04-11?11:43??24C08\24c08.M51
?????文件???????1035??2010-04-11?11:43??24C08\24c08.hex
????.......?????????0??2010-04-11?10:11??24C08\24c08_Uv2.Bak
?????文件???????2158??2010-04-11?11:43??24C08\24c08.Uv2
?????文件???????1261??2010-04-11?11:43??24C08\24c08.Opt
?????文件?????110390??2010-04-11?10:45??24C08\Last?Loaded?24C08.DBK
?????文件?????114420??2010-04-11?11:43??24C08\24C08.DSN
?????文件???????1507??2010-04-11?11:44??24C08\24C08.PWI
?????文件???????8823??2010-04-11?11:43??24C08\main.LST
?????文件???????9237??2010-04-11?11:43??24C08\main.OBJ
?????文件???????8413??2010-04-11?11:43??24C08\24c08
?????目錄??????????0??2010-04-10?21:31??24C08
-----------?---------??----------?-----??----
???????????????272252????????????????????15
評論
共有 條評論