标签: 无标签 i2c 程序(调试通过) 本程序是在周立功网上的程序的基础上修改的,原例里的ACK 时序有点问题 /*************************************************************************** 此程序是I2C 操作平台(主方式的软件平台)的底层的C 子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用 户程序连接并扩展。 注意:函数是采用软件延时的方法产生 SCL 脉冲,对高晶振频率要作一定的修改 (本例是3us 机器周期,如果系统对时间要求不是很重要的话,最好在每个单元读写结束时加个延时, 测试有子地址器件函数,未测试无地址的器件,适合器件地址和子地址小于256 的器件, 大于 256 的单元的器件可以自己改写)。 **************************************************************************/ #include /*头文件的包含*/ #include #define uchar unsigned char /*宏定义*/ #define uint unsigned int /*端口位定义*/ sbit BELL_OUT=P3^5; sbit SCL="P1"^3;/*模拟 I2C 数据传送位*/ sbit SDA="P1"^4;/*模拟 I2C 时钟控制位*/ bit ack; /*应答标志位*/ /********************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能:启动 I2C 总线,即发送I2C 起始条件 ********************************************************************/ void Start_I2c() { SDA="1"; /*发送起始条件的数据信号*/ _nop_(); SCL="1"; /*起始条件建立时间大于 4.7us,延时*/ _nop_(); SDA="0"; /*发送起始信号*/ _nop_(); /* 起始条件锁定时间大于 4μs*/ SCL="0"; /*钳住 I2C 总线,准备发送或接收数据 */ _nop_(); } /*********************************************** 结束总线函数 函数原型: void Stop_I2c(); 功能:结束I2C 总线,即发送I2C 结束条件 ***********************************************/ void Stop_I2c() { SDA="0"; /*发送结束条件的数据信号*/ _nop_(); /*发送结束条件的时钟信号*/ SCL="1"; /*结束条件建立时间大于4μs*/ _nop_(); SDA="1"; /*发送I2C 总线结束信号*/ _nop_(); } /******************************************************************* 字节数据传送函数 函数原型: void SendByte(uchar c); 功能:将数据c 发送...