怎样上网站dns解析不了,大学生学风建设专题网站,一家公司多个网站备案,失信被执行人名单查询官网51单片机快速入门之 IIC 总线通信
协议:
空闲时 SCL/SDA 为高电平SCL高时 SDA下降沿 为开始信号开始信号之后: SCL高电平时 SDA不能变化 , SCL低电平时 SDA才可变 SDA 传数据时 从高到低按位传输 SCL一个脉冲高电平对应一位数据 4.SCL高电平时 SDA上升沿 为停止信号
数…51单片机快速入门之 IIC 总线通信
协议:
空闲时 SCL/SDA 为高电平SCL高时 SDA下降沿 为开始信号开始信号之后: SCL高电平时 SDA不能变化 , SCL低电平时 SDA才可变 SDA 传数据时 从高到低按位传输 SCL一个脉冲高电平对应一位数据 4.SCL高电平时 SDA上升沿 为停止信号
数据格式:
1.单字节格式: 开始信号数据(高到低)应答(ACK)信号接收方SDA低电平停止信号
2.多字节格式: 开始信号发送设备地址和读写方向应答ACK信号数据传输应答ACK信号接收方SDA低电平停止信号
I2C 元器件 24c02(E^2PROM) 读/写操作:
1.单字节写流程:
开始信号7位地址(1010固 0A 0B 0C)读1/写024C02回复ACK信号发送一个字节ACK信号停止信号
2.页写流程(多字节):
开始信号7位地址(1010固 0A 0B 0C)读1/写024C02回复ACK信号发第一个字节数据地址ACK第一个字节数据ACK第二个字节数据...一直到停止信号 或者16字节
最多可一次写入2-16字节!
超出会自动从初始位置覆盖数据 17时覆盖第一个字节数据,之后还有数据往后递增覆盖 3.立即地址读操作:
N范围(0~255)00H~FFH
开始信号7位地址(1010固 0A 0B 0C)读1/写0ack回复读取一个字节数据(上次操作地址N1的数据)停止信号
N255时 下一个跳转读取 0
4.选择读操作:
任选地址读
开始信号7位地址(1010固 0A 0B 0C)读1/写0低0伪写操作ackN字节地址从ack开始信号7位地址(1010固 0A 0B 0C)读1/写0读信号 1从ack获取N地址下的数据停止信号
5.连续读操作:
立即地址读操作 连续
开始信号7位地址读1读取FFH(255)为第一个数据,主ACK00H主ack...直到出现主ack不回复 停下来停止信号才结束本次读取
选择读操作 连续
开始信号7位地址(1010固 0A 0B 0C)读1/写0低0伪写操作ackN字节地址从ack开始信号7位地址(1010固 0A 0B 0C)读1/写0读信号 1从ack获取N地址下的数据ackN1数据ack .....直到停止信号 电路图: 捣鼓了好几天,终于调试通了原来这元器件和书上的不同 所以说还是要多看看元器件数据手册才好,不然出了问题都找不到在哪! 就是这里 地址位我弄错了,书上很模糊所以我理解为
A0 A1 A2 顺序错了 实际上是A2 A1 A0 代码(简单发送):
#include STC89C5xRC.H//加载头文件,晶振12MHzsbit SCLP2^0; //时钟线
sbit SDAP2^1; //数据线void delay(unsigned int t); // 延时函数声明
void startI2C();//开始信号
void stopI2C();//停止信号void SendByte(unsigned char dat);//发送字节数据void main()
{SendByte(0xA2);//发送从机地址SendByte(0x00);//发送需要存入那个字节的地址 00H~FFHSendByte(0x44); //发送需要存储的数据 P170;模拟环境提示操作成功用 ,实际使用可删除while(1); // 防止程序重复运行
}void startI2C() //开始信号
{SDA1; //首先拉高SDAdelay(10);//给他点时间SCL1; //拉高SCLdelay(10); //1usSDA0; //拉低SDA 触发开始信号delay(10); //1usSCL0; //手动拉低确保时序准确 初始化以接受数据delay(10); //1us
}void stopI2C() //停止信号
{if(SCL1SDA0) //只有当SCL1 而且SDA0时才触发 SDA0保证已经接受到ACK回复信号{delay(10); //等一会SDA1; //拉高SDA ,上升沿触发停止信号} else if(SCL0) //当SCL0时,这句没啥用其实 ,防止 SCL0 触发不了停止信号
{delay(10);SCL1; //把scl 拉高if(SDA0) //判断是否接收到ACK回复
{delay(10);SDA1;}}}void SendByte(unsigned char dat)//发送字节数据
{unsigned char bita;startI2C();//发送开始信号for(bita0; bita8; bita) {if((datbita)0x80) //每次根据bita 的值左移 bita位 再和 0x80(1000 0000) 与操作(只保最高位)
{SDA1; //如果是1,拉高sda传送一个1 过去} else {SDA0;// 反之给0}delay(10); //让它们稳定一下SCL1;//上升读取 因开始信号已经拉低SCLdelay(10); //稳定时间 SCL0; //下降写入数据 也可以说这是复位delay(10); //稳定时间} SDA1; //8位传完就拉高等待ACK触发SCL0; //下降写入数据 保证循环正确输出8位SCL1; //拉高以配合ACK delay(10);//等待if(SDA!1) //sda0 证明 ack已回复 触发停止信号
{stopI2C();P300; //模拟环境提示操作成功用 ,实际使用可删除} else {P100;//模拟环境提示操作成功用 ,实际使用可删除}}void delay(unsigned int t) // 简单延迟函数
{while(t--);
}
运行效果: 程序设置了一个监视,操作成功会拉低P30 代码(简单读取):
#include STC89C5xRC.Hsbit SCLP2^0; //时钟线
sbit SDAP2^1; //数据线
sbit DQP2^4;//读取按键
void delay(unsigned int t); // 延时函数声明
void startI2C();//开始信号
void stopI2C();//停止信号
bit x; //用于存储ACK信息
unsigned char u;void SendByte(unsigned char dat);//发送字节数据void main()
{SendByte(0xA2);//发送从机地址 最后一位置0 写入x0;SendByte(0x01);//发送字节地址x0;SendByte(0x66); //发送需要存储的数据if(x1) {stopI2C(); //停止信号}P10;x0;while(DQ1);//阻断程序运行,当按钮按下往下执行//按键判断读取并赋值给P1寄存器if(DQ0) {SendByte(0xA3);//发送从机地址 最后一位置1 实际读取if(x1) { //表示读取请求被响应unsigned char red,bint;P330;red0;// 在读取数据的循环之前添加SDA释放if(SDA!1SCL!1) {SDA 1; // 释放SDA线delay(0);}// 读取数据的循环for(bint0; bint8; bint) {delay(20);//延时等待SCL0;//读取数据delay(20);//延时等待SCL1;//delay(20);// 检查SDA状态并更新red的值if(SDA1) { //如果读取到高电平red |1(7 - bint); // 设置对应位为1} else {red |0(7-bint);}delay(10);//延时等待}SCL0;//读取数据delay(10);//延时等待SDA 1; // nackdelay(10);P1red;//把获取到的值直接用到P1中stopI2C(); //停止信号}}while(1); // 防止程序重复运行
}void startI2C()
{SDA1;delay(10);SCL1;delay(10); //1usSDA0;delay(10); //1usSCL0; //手动拉低确保时序准确delay(10); //1us
}void stopI2C()
{if(SCL1SDA0) {delay(10);SDA1;} else if(SCL0) {delay(10);SCL1;if(SDA0) {delay(10);SDA1;}}}void SendByte(unsigned char dat)//发送字节数据
{unsigned char bita;startI2C();//发送开始信号for(bita0; bita8; bita) {if((datbita)0x80) {SDA1;} else {SDA0;}delay(10);SCL1;//上升读取 因开始信号已经拉低SCLdelay(10);SCL0; //下降写入数据delay(10);}SDA1;SCL0; //下降写入数据 保证循环正确输出8位SCL1;delay(10);if(SDA0) {x1; //有回复为1P300;} else {x0; //无回复为0// P100;}}void delay(unsigned int t) // 简单延迟函数
{while(t--);
}
读取运行效果 : 由图可以看出,元器件根本没有回复数据(试过选择地址读取,也没效果) 所以就这样吧! 最后更新于2024/10/24 0:01