此处仅以51单片机为编程对象做代码示例(部分单片机可直接拷贝使用,例如STC89C52RC),其他单片机可能需要在代码中插入延时函数以保证通信稳定。
发送和接收数据的代码及其实际使用时对应的应答代码我整合到一起了,可通过赋值设置应答,或通过函数返回值读取应答状态。
IIC代码(.c):
/**
*@brief IIC起始
*@param 无
*@retval 无
*/
void IIC_Start( void )
{
SCL = 1;
SDA = 1;
SDA = 0;
SCL = 0;
}
/**
*@brief IIC结束
*@param 无
*@retval 无
*/
void IIC_Stop( void )
{
SCL = 0;
SDA = 0;
SCL = 1;
SDA = 1;
}
/**
*@brief IIC发送 1 字节
*@param 赋值发送的字节(Byte)
*@retval 返回接收端应答(AckBit),“0” 为应答,“1” 为非应答
*/
char IIC_SendByte( unsigned char Byte )
{
unsigned char i , AckBit;
for( i = 0 ; i < 8 ; i++ )
{
SDA = Byte & ( 0x80 >> i );
SCL=1;
SCL=0;
}
//发送 1 字节数据 Byte
SDA = 1;
SCL = 1;
//释放总线
AckBit = SDA;
SCL = 0;
//将接收到的应答位读取