51单片机的I2C底层驱动程序(IO口模拟)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
Title:I2C for 80C51
Author:yuyouliang
51单片机(本人使用STC89C52单片机,12T模式)的I2C驱动程序,使用逻辑分析仪对该协议进行分析,发现波形比较美观,SCL的频率在70KHz左右(11.0592M晶振),低于标准的100K,可以适应大多数的I2C器件。如果感觉速度过快或过慢,可以自行修改延时。
希望可以给读者一个参考,给读者一些帮助!
*/
/*i2c.h文件 */
#ifndef __I2C_H_
#define __I2C_H_
sbit SCL = P2^1;
sbit SDA = P2^0;
void start_i2c(); //启动I2C总线:SCL高电平期间,SDA由高变低
void stop_i2c(); //停止I2C总线:SCL高电平期间,SDA由低变高
void send_i2c(unsigned char c); //主机发送一个字节,先发送最高位
unsigned char receive_i2c(); //主机接收一个字节,先接收最高位
void master_ack(bit ack); //主机非应答信号(填参数0)或应答信号(填参数1)
void slave_ack(); //等待从机应答信号
#endif
/* i2c.c文件 */
#include
#include
#include
#define nop() _nop_()
void start_i2c() //启动I2C总线:SCL高电平期间,SDA由高变低
{
SDA=1;
SCL=1;
nop();nop();nop();nop();
SDA=0;
SCL=0;
}
void stop_i2c() //停止I2C总线,SCL高电平期间,SDA由低变高
{
SDA=0;
SCL=1;
nop();nop();nop();nop();
SDA=1;
}
void slave_ack() //等待从机应答信号,如果从机迟迟没有应答,则结束总线。
{
unsigned char i;
SDA = 1;
SCL = 1;
i=200;
while(SDA&&(i--));
if(!SDA)
SCL = 0;
else
stop_i2c();
}
void send_i2c(unsigned char c) //主机发送一个字节,先发送最高位
{
unsigned char BitCnt;
for(BitCnt=8;BitCnt>0;BitCnt--)
{
c<<=1;
SDA=CY;
SCL=1;
nop();nop();nop();nop();
SCL=0;
}
}
unsigned char receive_i2c() //主机接收一个字节,先接收最高位
{
unsigned char retc=0,BitCnt;
SDA=1;
for(BitCnt=8;BitCnt>0;BitCnt--)
{
retc<<=1;
SCL=1;
nop();nop();nop();nop();
retc|=SDA;
SCL=0;
}
return retc;
}
void master_ack(bit ack) //主机非应答信号(填参数0)或应答信号(填参数1)
{
SDA=!ack;
SCL=1;
nop();nop();nop();nop();
SCL=0;
}