欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機與24CXX通信的C程序
[打印本頁]
作者:
daming
時間:
2014-12-30 00:47
標題:
51單片機與24CXX通信的C程序
/******************************************************************************************
端口定義
****************************************************************************************/
sbit SCL=P2^1; //將串行時鐘總線SCL位定義在為P3.4引腳
sbit SDA=P2^0; //將串行數據總線SDA位定義在為P3.5引腳
#define OP_READ 0xa1 // 器件地址以及讀取操作,0xa1即為1010 0001B
#define OP_WRITE 0xa0 // 器件地址以及寫入操作,0xa1即為1010 0000B
/******************************************************************************************
* 函數名稱 :Start
* 功能描述 : 啟動I2C總線
* 參數 : 無
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void Start()
{
SDA = 1; //SDA初始化為高電平“1”
SCL = 1; //開始數據傳送時,要求SCL為高電平“1”
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA = 0; //SDA的下降沿被認為是開始信號
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
}
/******************************************************************************************
* 函數名稱 :Stop
* 功能描述 : 結束I2C總線
* 參數 : 無
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void Stop()// 停止位
{
SDA = 0; //SDA初始化為低電平“0” _n
SCL = 1; //結束數據傳送時,要求SCL為高電平“1”
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA = 1; //SDA的上升沿被認為是結束信號
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SDA=0;
SCL=0;
}
/******************************************************************************************
* 函數名稱 :TeskAsk
* 功能描述 : 檢測應答位
* 參數 : 無
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void TestAsk()
{
bit ack_bit; //儲存應答位
SDA = 1; // 發送設備(主機)應在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,
//以讓SDA線轉由接收設備(AT24Cxx)控制
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SCL = 1; //根據上述規定,SCL應為高電平
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
ack_bit = SDA; //接受設備(AT24Cxx)向SDA送低電平,表示已經接收到一個字節
//若送高電平,表示沒有接收到,傳送異常 結束發送
SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
while(ack_bit!=0);
}
/******************************************************************************************
* 函數名稱 :SendAsk
* 功能描述 :發送應答位
* 參數 : 無
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void SendAsk()
{
SCL=0;
_nop_();
_nop_();
SDA=0; //將SDA拉低并持續4.5us以上
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1;
}
/******************************************************************************************
* 函數名稱 :ReadData
* 功能描述 :從24CXX里讀一個字節
* 參數 : 無
* 返回值 : x
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
unsigned char ReadData()
// 從AT24Cxx移入數據到MCU
{
unsigned char i;
unsigned char x; //儲存從AT24Cxx中讀出的數據
for(i = 0; i < 8; i++)
{
SCL = 1; //SCL置為高電平
x<<=1; //將x中的各二進位向左移一位
x|=(unsigned char)SDA; //將SDA上的數據通過按位“或“運算存入x中
SCL = 0; //在SCL的下降沿讀出數據
}
return(x); //將讀取的數據返回
}
/******************************************************************************************
* 函數名稱 :WriteCurrent
* 功能描述 :向AT24Cxx的當前地址寫入數據
* 參數 : y (儲存待寫入的數據)
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
//在調用此數據寫入函數前需首先調用開始函數start(),所以SCL=0
void WriteCurrent(unsigned char y)
{
unsigned char i;
for(i = 0; i < 8; i++) // 循環移入8個位
{
SDA = (bit)(y&0x80); //通過按位“與”運算將最高位數據送到S
//因為傳送時高位在前,低位在后
_nop_(); //等待一個機器周期
SCL = 1; //在SCL的上升沿將數據寫入AT24Cxx
_nop_(); //等待一個機器周期
_nop_(); //等待一個機器周期
SCL = 0; //將SCL重新置為低電平,以在SCL線形成傳送數據所需的8個脈沖
y <<= 1; //將y中的各二進位向左移一位
}
}
/******************************************************************************************
* 函數名稱 :WriteSet
* 功能描述 :向AT24Cxx中的指定地址寫入數據
* 參數 :add (儲存指定的地址);dat(儲存待寫入的數據)
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void WriteSet(unsigned char add, unsigned char dat)
// 在指定地址addr處寫入數據WriteCurrent
{
Start(); //開始數據傳遞
WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
TestAsk();
WriteCurrent(add); //寫入指定地址
TestAsk();
WriteCurrent(dat); //向當前地址(上面指定的地址)寫入數據
TestAsk();
Stop(); //停止數據傳遞
delay(4); //1個字節的寫入周期為1ms, 最好延時1ms以上
}
/******************************************************************************************
* 函數名稱 :ReadCurrent
* 功能描述 :從AT24Cxx中的當前地址讀取數據
* 參數 : 無
* 返回值 : x (儲存讀出的數據)
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
unsigned char ReadCurrent()
{
unsigned char x;
Start(); //開始數據傳遞
WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀其數據
TestAsk();
x=ReadData(); //將讀取的數據存入x
Stop(); //停止數據傳遞
return x; //返回讀取的數據
}
/******************************************************************************************
* 函數名稱 :ReadSet
* 功能描述 :從AT24Cxx中的指定地址讀取數據
* 參數 : set_addr
* 返回值 : x
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
unsigned char ReadSet(unsigned char set_addr)
// 在指定地址讀取
{
Start(); //開始數據傳遞
WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
TestAsk();
WriteCurrent(set_addr); //寫入指定地址
TestAsk();
return(ReadCurrent()); //從指定地址讀出數據并返回
}
/******************************************************************************************
* 函數名稱 :WritePage
* 功能描述 :從AT24Cxx中的指定頁地址寫8字節數據
* 參數 : address,*s(要寫進去的數組首地址)
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void WritePage(unsigned char address,unsigned char *s) //按頁寫
{
unsigned char i;
Start();
WriteCurrent(OP_WRITE); //發送控制寫字節
TestAsk();
WriteCurrent(address); //存儲器地址;每次讀完之后指針自動加1
TestAsk();
for(i=0;i<8;i++) //直接連續寫8次,每頁含有16個字節
{
WriteCurrent(*s);
TestAsk();
s++;
}
Stop();
delay(4); //1個字節的寫入周期為1ms, 最好延時1ms以上
}
/******************************************************************************************
* 函數名稱 :ReadPage
* 功能描述 :從AT24Cxx中的指定頁地址讀取8字節數據
* 參數 : address,tmp[](存放讀出來的數據)
* 返回值 : 無
* 創建日期 :2010-11-25
* 作者 :zzj
* 全局變量 :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本 : 修改人: 修改日期:
* 修改說明 :
******************************************************************************************/
void ReadPage(unsigned char address,unsigned char tmp[]) //按頁讀取、可以連續讀,不需要按頁讀
{
unsigned char i;
Start();
WriteCurrent(OP_WRITE); //發送控制寫字節
TestAsk();
WriteCurrent(address); //存儲器地址;每次讀完之后指針自動加1
TestAsk();
Start();
WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀其數據
TestAsk();
tmp[0]=ReadData();
for(i=1;i<8;i++)
{
SendAsk();
tmp[i]=ReadData();
} /**/
Stop();
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1