单片机模拟I2C总线通信的几个关键程序

2019-04-15 12:10发布

I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序:
1、总线初始化 void main() { SCl=1; delay(); SDA=1; delay(); } //将总线都拉高以释放总线 2、启动信号 void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } //SCL在高电平期间,SDA一个下降沿启动信号 3、应答信号 void respons() { uchar i=0; SCL=1; delay(); while(SDA==1)&&(i<255))//若在一段时间内没有收到从器件的应答则 i++; //主器件默认从器件已经收到数据而不在等待应答信号 SCL=0; delay(); } //SCL在高电平期间,SDA被从设备拉为低电平表示应答 4、停止信号 void stop() { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } //SCL在高电平期间,SDA一个上升沿停止信号 5、写一个字节 void writebyte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1;//temp左移一位,最高位将移入PSW寄存器的CY位中 SCL=0; //然后将CY赋给SDA进而在SCL的控制下发送出去 delay(); SDA=CY; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay(); } //串行发送一个字节时,需要把这个字节中的8位一位一位地发出去 6、读一个字节 uchar readbyte() { uchar i,k; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA;//将k左移一位与SDA进行“或”运算, SCL=0; //依次把8个独立的位放入一个字节中来完成接收 delay(); } delay(); return k; } 同样的,接收一个字节时需将8位一位一位地接收