尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【51单片机】1.5 IIC理论与实操

【51单片机】1.5 IIC理论与实操 线与概念寻址模式起始信号从机地址7位第八位读写当我们发送完了这7位地址和1位方向后如果发送的这个地址确实存在那么这个地址的器件应该回应一个ACK拉低SDA即输出“0”如果不存在就没“人”回应 ACKSDA将保持高电平即“1”写代码I2C_SCL I2C_SDA //定义引脚 SCL为高电平时读SDA的数据。SDL为低电平时SDA发生变化1.I2CDelay(); //延时函数2.void I2CStart()3.void I2CStop()4.bit I2CAddressing(unsigned char addr) //读取设备地址5.bit I2CWrite(unsigned char dat) //向其中写入/* 产生总线起始信号 */ 根据时序图来写的void I2CStart(){I2C_SDA 1; //首先确保SDA、SCL都是高电平I2C_SCL 1;I2CDelay();I2C_SDA 0; //先拉低SDAI2CDelay();I2C_SCL 0; //最后再拉低SCL}/* 产生总线停止信号 */void I2CStop(){I2C_SCL 0; //首先确保SDA、SCL都是低电平I2C_SDA 0;I2CDelay();I2C_SCL 1; //先拉高SCLI2CDelay();I2C_SDA 1; //再拉高SDAI2CDelay();}IIC寻址 先确定那个设备第一个字节发送方7位地址1位读写 7位 前4位选择设备 后3位接收方回应一个ACK/* I2C寻址函数即检查地址为addr的器件是否存在返回值-从器件应答值 */bit I2CAddressing(unsigned char addr){bit ack;I2CStart(); //产生起始位即启动一次总线操作ack I2CWrite(addr1); //器件地址需左移一位因寻址命令的最低位为读写位用于表示之后的操作是读或写写为0addr是7位最后一位读写位I2CStop(); //不需进行后续读写而直接停止本次总线操作return ack;}/* I2C总线写操作dat-待写入字节返回值-从机应答位的值 */bit I2CWrite(unsigned char dat){bit ack; //用于暂存应答位的值unsigned char mask; //用于探测字节内某一位值的掩码变量//f发送8位数据for (mask0x80; mask!0; mask1) //从高位到低位依次进行循环8次这里的mask即是循环的退出条件又在下面取出SDA的电平{if ((maskdat) 0) //判断dat最高位是否为0该位的值输出到SDA上I2C_SDA 0;elseI2C_SDA 1;I2CDelay();I2C_SCL 1; //拉高SCL读取SDAI2CDelay();I2C_SCL 0; //再拉低SCL完成一个位周期是一个位周期}I2C_SDA 1; //8位数据发送完后主机释放SDA以检测从机应答视频说不能拉低SDAI2CDelay();I2C_SCL 1; //拉高SCL读取ack I2C_SDA; //读取此时的SDA值即为从机的应答值I2CDelay();I2C_SCL 0; //再拉低SCL完成应答位并保持住总线 时序图的停止条件前SCL为低电平return ack; //返回从机应答值}//IIC总线读操作/* I2C总线读操作并发送应答信号返回值-读到的字节 */unsigned char I2CReadACK(){unsigned char mask;unsigned char dat;I2C_SDA 1; //首先确保主机释放SDAfor (mask0x80; mask!0; mask1) //从高位到低位依次进行{I2CDelay();I2C_SCL 1; //拉高SCLif(I2C_SDA 0) //读取SDA的值dat ~mask; //为0时dat中对应位清零elsedat | mask; //为1时dat中对应位置1I2CDelay();I2C_SCL 0; //再拉低SCL以使从机发送出下一位}I2C_SDA 0; //8位数据读完后拉低SDA发送应答信号非应答信号I2C_SDA 1I2CDelay();I2C_SCL 1; //拉高SCLI2CDelay();I2C_SCL 0; //再拉低SCL完成应答位并保持住总线return dat;}
返回列表