-
大小: 2KB文件類型: .rar金幣: 2下載: 2 次發布日期: 2021-05-10
- 語言: 其他
- 標簽: STC15F2K60S2??
資源簡介
STC15F2K60S2 iic 驅動程序 它的驅動不同于51,略有變化,僅供參考

代碼片段和文件信息
#include?“reg52.h“
#include?“intrins.h“
#define?DELAY_TIME?5
/**?定義I2C總線時鐘線和數據線?*/
sbit?scl?=?P2^0;
sbit?sda?=?P2^1;
/**
*?@brief?I2C總線中一些必要的延時
*
*?@param[in]?i?-?延時時間調整.
*?@return?none
*/
void?i2c_delay(unsigned?char?i)
{
????do
????{
????????_nop_();
????}
????while(i--);????????
}
/**
*?@brief?產生I2C總線啟動條件.
*
*?@param[in]?none
*?@param[out]?none
*?@return?none
*/
void?i2c_start(void)
{
????sda?=?1;
????scl?=?1;
????i2c_delay(DELAY_TIME);
????sda?=?0;
????i2c_delay(DELAY_TIME);
????scl?=?0;????
}
/**
*?@brief?產生I2C總線停止條件
*
*?@param[in]?none
*?@param[out]?none.
*?@return?none
*/
void?i2c_stop(void)
{
????sda?=?0;
????scl?=?1;
????i2c_delay(DELAY_TIME);
????sda?=?1;
????i2c_delay(DELAY_TIME);???????
}
/**
*?@brief?I2C發送一個字節的數據
*
*?@param[in]?byt?-?待發送的字節
*?@return?none
*/
void?i2c_sendbyte(unsigned?char?byt)
{
????unsigned?char?i;
//
EA?=?0;
????for(i=0;?i<8;?i++){
????????scl?=?0;
????????i2c_delay(DELAY_TIME);
????????if(byt?&?0x80){
????????????sda?=?1;
????????}
????????else{
????????????sda?=?0;
????????}
????????i2c_delay(DELAY_TIME);
????????scl?=?1;
????????byt?<<=?1;
????????i2c_delay(DELAY_TIME);
????}
EA?=?1;
//
????scl?=?0;??
}
/**
*?@brief?等待應答
*
*?@param[in]?none
*?@param[out]?none
*?@return?none
*/
unsigned?char?i2c_waitack(void)
{
unsigned?char?ackbit;
????scl?=?1;
????i2c_delay(DELAY_TIME);
????ackbit?=?sda;?//while(sda);??//wait?ack
????scl?=?0;
????i2c_delay(DELAY_TIME);
return?ackbit;
}
/**
*?@brief?I2C接收一個字節數據
*
*?@param[in]?none
*?@param[out]?da
*?@return?da?-?從I2C總線上接收到得數據
*/
unsigned?char?i2c_receivebyte(void)
{
unsigned?char?da;
unsigned?char?i;
//
EA?=?0;
for(i=0;i<8;i++){???
scl?=?1;
i2c_delay(DELAY_TIME);
da?<<=?1;
if(sda)?
da?|=?0x01;
scl?=?0;
i2c_delay(DELAY_TIME);
}
EA?=?1;
//
return?da;????
}
/**
*?@brief?發送應答
*
*?@param[in]?ackbit?-?設定是否發送應答
*?@return?-?none
*/
void?i2c_sendack(unsigned?char?ackbit)
{
????scl?=?0;
????sda?=?ackbit;??//0:發送應答信號;1:發送非應答信號
????i2c_delay(DELAY_TIME);
????scl?=?1;
????i2c_delay(DELAY_TIME);
????scl?=?0;?
sda?=?1;
????i2c_delay(DELAY_TIME);
}
/**
*?@brief?讀寫操作過程中一些必要的延時
*
*?@param[in]?i?-?指定延時時間
*?@return?-?none
*/
void?operate_delay(unsigned?char?t)
{
unsigned?char?i;
while(t--){
for(i=0;?i<112;?i++);
}
}
#ifdef?EEPROM_AT24C02?/**?EEPROM?AT24C02操作函數?*/
/**
*?@brief?向AT24C02(add)中寫入數據val
*
*?@param[in]?add?-?AT24C02存儲地址
*?@param[in]?val?-?待寫入AT24C02相應地址的數據
*?@return?-?none
*/
void?write_eeprom(unsigned?char?addunsigned?char?val)
{
????i2c_start();
????i2c_sendbyte(0xa0);
????i2c_waitack();
????i2c_sendbyte(add);
????i2c_waitack();
????i2c_sendbyte(val);
????i2c_waitack();
????i2c_stop();
operate_delay(10);
}
/**
*?@brief?從AT24C02(add)中讀出數據da
*
*?@param[in]?add?-?AT24C02存儲地址
*?@param[out]?da?-?從AT24C02相應地址中讀取到的數據
*?@return?-?da
*/
unsigned?cha
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4108??2012-10-23?15:04??i2c.c
?????文件????????700??2012-08-21?14:00??i2c.h
-----------?---------??----------?-----??----
?????????????????4808????????????????????2
評論
共有 條評論