51单片机用C51语言实现I2C24C02存储器用法和实例
一、I2C24C02存储器用法步骤:
1.把24C02的SCK/SDA引脚跟单片机的管脚连接。
2.调用Bus_Initialize()进行初始化。
3.根据实际情况,调用Write_Data()/Read_Data()
二、电路图
电路
三、简单存储实例代码截图
代码
四、at24c02.h头文件代码
#include<intrins.h>
#include<AT89X51.H>//#include<REG52.H>
#define uchar unsigned char
sbit SCL=P1^6;
sbit SDA=P1^7;
/*************************************
//延时5us
*************************************/
void Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*************************************
//总线初始化
*************************************/
void Bus_Initialize(void)
{
SDA=1;
Delay();
SCL=1;
Delay();
}
/*************************************
//---启动信号,开始数据传输
*************************************/
void Start_Signal(void)
{
SDA=1;
Delay();
SCL=1;
Delay();
SDA=0;
Delay();
}
void Response_Signal(void)
{
uchar i;
SCL=1;
Delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
Delay();
}
/*************************************
//---停止信号,停止数据传输
*************************************/
void Stop_Signal(void)
{
SDA=0;
Delay();
SCL=1;
Delay();
SDA=1;
Delay();
}
void Write_One_Byte(uchar m)
{
uchar temp,i;
temp=m;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
Delay();
SDA=CY;
Delay();
SCL=1;
Delay();
}
SCL=0;
Delay();
SDA=1;
Delay();
}
uchar Read_One_Byte()
{
uchar k,i;
SCL=0;
Delay();
SDA=1;
Delay();
for(i=0;i<8;i++)
{
SCL=1;
Delay();
k=(k<<1)|SDA;
SCL=0;
Delay();
}
return k;
}
/*************************************
//写一个字节数据函数,开始写数据到存储器
*************************************/
void Write_Data(uchar address,uchar Data)
{
Start_Signal();//启动总线
Write_One_Byte(0XA0);//发送从机写地址
Response_Signal();//等待从机应答
Write_One_Byte(address); //发送从机字地址
Response_Signal();//等待从机应答
Write_One_Byte(Data);//发送字节数据
Response_Signal();//等待从机应答
Stop_Signal();//结束总线
}
/*************************************
//读一个字节数据函数,从存储器读取数据
*************************************/
uchar Read_Data(uchar address)
{
uchar Data;
Start_Signal(); //启动总线
Write_One_Byte(0XA0);//发送从机写地址
Response_Signal(); //等待从机应答
Write_One_Byte(address);//发送从机读地址
Response_Signal();//等待从机应答
Start_Signal(); //启动总线
Write_One_Byte(0XA1);//发送从机读地址
Response_Signal();//等待从机应答
Data=Read_One_Byte();//存储到DATA
Stop_Signal();//结束总线
return Data;//返回存储的数据DATA
}
51单片机i2c总线
51单片机i2c总线
一句话描述
i2c使用2根线传输数据,一根是时钟线,一根是数据线。
i2C总线介绍
1、12C总线 (Inter IC BUS) 是由Philips公司开发的一种通用数据总线。
两根通信线:SCL (Serial Clock) 、SDA (Serial Data)。同步、半双工,带数据应答通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用着来说,使用通用的通信协议可以避免学习各种各样的自定义协议降低了学习和应用的难度。i2c电路规范
1、所有12C设备的SCL连在一起,SDA连在一起
2、设备的SCL和SDA均要配置成开漏输出模式
3、SCL和SDA各添加一个上拉电阻,阻值一般为4.7KQ左右
4、开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题
热上拉模式是指引脚一端接高电平,一端接gnd,当开关闭合式为低电平,开关断开时被上拉成高电平。
开漏输出模式是指引脚直接接一个开关和gnd连接,开关闭合卫低电平,开关断开为悬空状态。cpu与设备1通信时,其他设备全部断开(理用开漏模式),互不影响。
i2c时序结构
开始条件
SCL高电平期间,SDA从高电平切换到低电平。
终止条件
SCL高电平期间,SDA从低电平切换到高电平。
发送或接收一位
SCL低电平时,发送端在SDA放入数据电平(0,1);SCL高电平时,接收端读取SDA线上的电平。SCL线随时间变化而变化,变化一个周期发送一位数据。
发送接收应答
在接收完一个字节之后,主机在下一个时钟发送一位数据,0表示应答,1表示非应答。
和发送数据一样,只是发送的这一位数据表示应答数据。
i2c数据帧
发送或接收数据
标识开始发送或接收数据 S标识数据发送或接收的地址 + 应答发送或接收数据1 + 应答发送或接收数据2 + 应答发送或接收数据N + 应答标识发送或接收数据完成 P相关问答
51单片机 有 I2C 口吗?像89C51这样的老型号的51单片机没有I2C接口,现在出产的扩展型51单片机都有一个I2c接口,例如STC8系列多种型号单片机。这种单片机的I2C引脚可以配置到不同的IO...
51单片机 与52单片机的区别?51单片机和52单片机都是常见的单片机系列,它们之间的区别主要体现在以下几方面:1、结构不同:51单片机是由英特尔公司设计的8位单片机,而52单片机是基于51单...
51单片机I2C 总线读一个字节if(SDA==1)retc=retc+1;是什么意思?上面2个函数看起来像是用IO模拟I2C接口的例子,如果有现成的I2C接口,那么这些事情都是由CPU的I2Ccore实现的,也就是硬件实现的。如果需要IO模拟,那么就需要...
单片机51 和k60有什么区别?51单片机和K60单片机都是微控制器,但它们来自不同的公司,具有不同的特性和应用场景。以下是它们的主要区别:1.公司:51单片机(8051)是由英特尔公司(I...
单片机 、光耦1系统总体结构原理粮食在储藏期间,由于受环境、气候和通风条件等因素的变化,粮仓内温度或湿度会发生异常,这极易造成粮食的霉烂、或发生虫害。那么...
目前常用的 单片机 型号有哪些?都有什么优缺点?现在市场上的单片机型号可以说是非常多的,其中有通用型的单片机,还有专用型的单片机。专用型单片机一般我们不常见到。今天我们结合这个问题来介绍一下目前常...
老表们,谁清楚,用 51单片机 做电子钟,自动校时方面最简单的...[回答]你的校时只的是调时间还是调时钟的准确度?如果是调时间用个2个按钮就好了。校时的话51就是走不准的一天有误差难免的。这个晶振有关系的,当然你觉...
单片机 ,什么是串行口,什么是并行口? - 小小一个小明 的回...有一根时钟线,一根数据线,一个时钟周期传送二进制1位,要传送一个字节至少需要8个时钟周期,串行线根数少,远程传输抗干扰能力强,成本低。...并行接...
用 51单片机 做电子钟,自动校时方面最简单的能用什么方法?[回答]电子钟表中AL是闹钟英文名称的缩写。电子钟表的时钟功能:具有可选的24h(小时)或12h(小时)的计时方式,显示时、分、秒;具有快速校准时、分、秒的功能...
单片机 ,什么是串行口,什么是并行口? - 珂珂珂的 的回答 - 懂得有一根时钟线,一根数据线,一个时钟周期传送二进制1位,要传送一个字节至少需要8个时钟周期,串行线根数少,远程传输抗干扰能力强,成本低。...并行接...