搜索引擎营销案例有哪些,优化师培训机构,网站后台编辑框变灰了,自己也可以免费轻松创建一个网站EEPROM
IIC串行总线的组成及工作原理
I2C总线的数据传送
数据位的有效性规定
I2C总线进行数据传送时#xff0c;时钟信号为高电平期间#xff0c;数据线上的数据必须保持稳定#xff0c;只有在时钟线上的信号为低电平期间#xff0c;数据线上的高电平或低电平状态才允许…EEPROM
IIC串行总线的组成及工作原理
I2C总线的数据传送
数据位的有效性规定
I2C总线进行数据传送时时钟信号为高电平期间数据线上的数据必须保持稳定只有在时钟线上的信号为低电平期间数据线上的高电平或低电平状态才允许变化。
起始和终止信号
SCL线为高电平期间SDA线由高电平向低电平的变化表示起始信号SCL线为高电平期间SDA线由低电平向高电平的变化表示终止信号。 数据传送格式 字节传送与应答 每一个字节必须保证是8位长度。数据传送时先传送最高位MSB每一个被传送的字节后面都必须跟随一位应答位即一帧共有9位。 数据帧格式 在总线的一次数据传送过程中可以有以下几种组合方式 主机向从机发送数据数据传送方向在整个传送过程中不变 主机在第一个字节后立即从从机读数据 在传送过程中当需要改变传送方向时起始信号和从机地址都被重复产生一次但两次读/写方向位正好反相。 总线的寻址 I2C总线协议有明确的规定采用7位的寻址字节寻址字节是起始信号后的第一个字节。 寻址字节的位定义 主机发送地址时总线上的每个从机都将这7位地址码与自己的地址进行比较如果相同则认为自己正被主机寻址根据R/T位将自己确定为发送器或接收器。 从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位3位是可编程位这时仅能寻址8个同样的器件即可以有8个同样的器件接入到该I2C总线系统中。
典型信号模拟
串行E2PROM的扩展
写入过程
单片机进行写操作时首先发送该器件的7位地址码和写方向位“0”共8位即一个字节发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后在SDA线上产生一个应答信号作为相应单片机收到应答后就可以传送数据了。传送数据时单片机首先发送一个字节的被写入器件的存储区的首地址收到存储器器件的应答后单片机就逐个发送各数据字节但每发送一个字节后都要等待应答。当要写入的数据传送完后单片机应发出终止信号以结束写入操作。写入n个字节的数据格式
读出过程
单片机先发送该器件的7位地址码和写方向位“0”“伪写”发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后在SDA线上产生一个应答信号作为回应。然后再发一个字节的要读出器件的存储区的首地址收到应答后单片机要重复一次起始信号并发出器件地址和读方向位“1”收到器件应答后就可以读出数据字节每读出一个字节单片机都要回复应答信号。当最后一个字节数据读完后单片机应返回以“非应答”高电平并发出终止信号以结束读出操作。
AT24CXX存储器工作原理 实验代码
i2c.h
#ifndef _I2C_H
#define _I2C_H#include reg52.h
sbit SCLP2^1;
sbit SDAP2^0;
void At24c02Write(unsigned char addr, unsigned char dat);
unsigned char At24c02Read(unsigned char addr);#endifi2c.c
#include i2c.hvoid Delay10us(void)
{unsigned char a,b;for(b1;b0;b--)for(a2;a0;a--);
}void I2cStart()
{SDA1;Delay10us();SCL1;Delay10us();SDA0;Delay10us();SCL0;Delay10us();
}void I2cStop()
{SDA0;Delay10us();SCL1;Delay10us();SDA1;Delay10us();
}unsigned char I2cSendByte(unsigned char dat)
{unsigned char a;unsigned char t1;unsigned char b1;for(a0;a8;a){SDAdat7;dat1;Delay10us();SCL1;Delay10us();SCL0;Delay10us();}SDA1;Delay10us();SCL1;Delay10us();while(SDA){b;if(b200){SCL0; Delay10us();t0;return b;}}SCL0;Delay10us();return t;
}unsigned char I2cReadByte()
{unsigned char a0,dat0;SDA1;Delay10us();for(a0;a8;a){SCL1;Delay10us();dat1;dat|SDA;Delay10us();SCL0;Delay10us();}return dat;
}void At24c02Write(unsigned char addr, unsigned char dat)
{I2cStart();I2cSendByte(0xA0);I2cSendByte(addr);I2cSendByte(dat);I2cStop();
}unsigned char At24c02Read(unsigned char addr)
{unsigned char num;I2cStart();I2cSendByte(0xA0);I2cSendByte(addr);I2cStart();I2cSendByte(0xA1);numI2cReadByte();I2cStop();return num;
}main.c
#include reg52.h
#include i2c.h
typedef unsigned char u8;
typedef unsigned int u16;sbit k1P3^1;
sbit k2P3^0;
sbit k3P3^2;
sbit k4P3^3;sbit LSAP2^2;
sbit LSBP2^3;
sbit LSCP2^4;u8 code smgduan[16]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 num0;
u8 disp[4];
void delay(u16 i)
{while(i--);
}void datapros()
{disp[0]smgduan[num/1000];disp[1]smgduan[num/100%10];disp[2]smgduan[num/10%100%10];disp[3]smgduan[num%1000%100%10];
}void Keypros()
{if(k10){delay(1000);if(k10){At24c02Write(1,num);}while(!k1);}if(k20){delay(1000);if(k20){numAt24c02Read(1);}while(!k2);}if(k30){delay(1000);if(k30){num;if(num255){num0;}}while(!k3);}if(k40){delay(1000);if(k40){num0;}while(!k4);}
}void DigDisplay()
{u8 i;for(i0;i4;i){switch(i){case(0):LSA0;LSB0;LSC0;break;case(1):LSA1;LSB0;LSC0;break;case(2):LSA0;LSB1;LSC0;break;case(3):LSA1;LSB1;LSC0;break;}P0disp[3-i];delay(100);P00x00;}
}void main(){while(1){Keypros();datapros();DigDisplay();}
}