?? i2c.h
字號:
#include <reg51.h>
#include <intrins.h>
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define uchar unsigned char
sbit SCL = P0^4;
sbit SDA = P0^3;
//延時函數(shù)
void delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//提供I2C總線工作時序中的起始位
void I_start(void)
{
SDA = HIGH;
delay();
SCL = HIGH;
delay();
SDA = LOW;//當(dāng)SCL為高時,SDA的一個下降沿作為起始位
delay();
SCL = LOW;
delay();
}
//提供I2C總線工作時序中的停止位
void I_stop(void)
{
SDA = LOW;
delay();
SCL = HIGH;
delay();
SDA = HIGH;//當(dāng)SCL為高時,SDA的一個上升沿作為停止位
delay();
SCL = LOW;
delay();
}
//I2C總線初始化
void I_init(void)
{
SCL = LOW;
I_stop();
}
//提供I2C總線的時鐘信號,并返回時鐘電平為高期間SDA信號線上狀態(tài)
bit I_clock(void)
{
bit sample;
SCL = HIGH;
delay();
sample = SDA;
SCL = LOW;
delay();
return (sample);
}
//向I2C總線發(fā)送8位數(shù)據(jù),并請求一個應(yīng)答信號ACK。如果收到ACK應(yīng)答,則返回1,否則返回0。
bit I_send(uchar I_data)
{
register uchar i;
/*發(fā)送8位數(shù)據(jù)*/
for(i=0;i<8;i++)
{
SDA = (bit)(I_data & 0x80);
I_data <<= 1;
I_clock();
}
/*請求應(yīng)答信號ACK*/
SDA = HIGH;
delay();
return(~I_clock());
}
//從I2C總線上接收8位數(shù)據(jù)信號,并將接收到的8位數(shù)據(jù)作為一個字節(jié)返回,不回送應(yīng)答信號。
//主函數(shù)在調(diào)用本函數(shù)之前應(yīng)保證SDA信號線處于浮置狀態(tài),SDA=1.
uchar I_receive(void)
{
uchar I_data = 0;
register uchar i;
for(i=0;i<8;i++)
{
I_data*=2;
if(I_clock())I_data++;
}
return (I_data);
}
//向I2C總線發(fā)送一個應(yīng)答信號ACK,一般用于連續(xù)數(shù)據(jù)讀取時
void I_Ack(void)
{
SDA = LOW;
I_clock();
SDA = HIGH;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -