|
//=====================================================================================
// Module Name : I2C.c
// CreateDate : 2008-3-1
// ModifData : 2008-3-1
// Description : 软件模拟I2C驱动程序.参考了周立功模拟I2C(晶振频率要小于12MHZ)
// Author : LuoWei
// Version : V1.0
//=====================================================================================
#include "reg52.h"
sbit SDA="1"^7; //模拟I2C数据传送位
sbit SCL="1"^6; //模拟I2C时钟控制位
bit ack; //应答标志位
//--------------------------------------------------------------------------
//函数名称: I2C_Delay(uint us)
//函数功能: 用于I2C的us级延时
//其他说明: 无
//--------------------------------------------------------------------------
void I2C_Delay(uint us)
{
while(--us);
}
//--------------------------------------------------------------------------
//函数名称: void I2C_Start()
//函数功能: 起动总线函数
//其他说明: 启动I2C总线,即发送I2C起始条件.
//--------------------------------------------------------------------------
void I2C_Start(void)
{
SDA=1; //发送起始条件的数据信号
I2C_Delay(1);
SCL=1;
I2C_Delay(2); //起始条件建立时间大于4.7us延时
SDA=0; //发送起始信号
I2C_Delay(2);
SCL=0; //钳住I2C总线,准备发送或接收数据
I2C_Delay(2);
}
//--------------------------------------------------------------------------
//函数名称: void I2C_Stop()
//函数功能: 结束总线函数
//其他说明: 结束I2C总线,即发送I2C结束条件.
//--------------------------------------------------------------------------
void I2C_Stop(void)
{
SDA=0; //发送结束条件的数据信号
I2C_Delay(1); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
I2C_Delay(2);
SDA=1; //发送I2C总线结束信号
I2C_Delay(2);
}
//--------------------------------------------------------------------------
//函数名称: void SendByte(uchar c)
//函数功能: 字节数据传送函数
//其他说明: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
// 此状态位进行操作.(不应答或非应答都使ack=0 假)
// 发送数据正常,ack=1; ack="0表示被控器无应答或损坏"。
//--------------------------------------------------------------------------
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt |
|