51单片机~EETROM ( I IC协议总线),AT24CXX存储器工作原理

发布者:chang_ri最新更新时间:2022-09-26 来源: csdn关键字:51单片机  I  AT24CXX  存储器 手机看文章 扫描二维码
随时随地手机看文章

(一)I^2 C总线控制原理:


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.数据有效性规定:

所以如图,当SCL为高电平的时候,SDA数据稳定不改变,当SCL为低电平的时候,看时序图SDA才允许改变。


2. 这是启示和终止,和上面没有太大关系。(上面只说有效信号)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据传输可能产生的三种状况:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 主机在传送数据时的几种方式:

(S表示其实信号,P表示终止信号),白A表示从机的应答,阴影A表示主机的应答,—A表示非应答(代表即将结束接受),应答之后主(从)机再发送下一段数据*


方式一:

在这里插入图片描述

方式二:

在这里插入图片描述

方式三:非应答之后再次进行S初始信号发送,改变数据传输方向

在这里插入图片描述

从机地址==固定部分+可编程部分(决定可以访问的从机数目)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于延时的解释:从SCL和SDA变成1或者变零所需要持续的时间。

在这里插入图片描述
在这里插入图片描述

应答可根据上述情况写出:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

每个字节==八位二进制数,传输都是一个字节一个字节传输的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)AT24CXX存储器戏芯片工作原理:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(四)编写代码使四个按键

k1(按下时读取数据),

k2(保存k1读取的的数据),

k3(数据递增1),

k4(数据清零)

并用数码管后四位显示这个过程:


main.c文件


#include "reg52.h"

#include "I^2C.h"


typedef signed char int8;

typedef signed int  int16;

typedef signed long  int32;

typedef unsigned char uint8;   //字符型

typedef unsigned int uint16;

typedef unsigned long uint32;


sbit k1=P3^1;

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

  

char num=0;  

uint8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uint16 disp[4];

void delay(uint16 x_ms)    //延时毫秒

{

uint16 i, j;

for (i = x_ms; i > 0; i--)

for (j = 114; j > 0; j--);

}

void keybord()    //独立按键

{

if(k1==0)   //写

{

delay(4);

if(k1==0)

{

AT24C02Write(1,num);

}

while(!k1);

}

if(k2==0)  //读取存储位

{

delay(4);

if(k2==0)

{

num=AT24C02Read(1);

}

while(!k2);

}

if(k3==0)     //加一

{

delay(4);

if(k3==0)

{

num++;

if(num>255)

{

num=0;

}

}

while(!k3);

}

if(k4==0)    //清零

{

delay(4);

if(k4==0)

{

num=0;

}

while(!k4);

}

}


void datapros()

{

disp[0]=smgduan[num/1000];//千位

disp[1]=smgduan[num%1000/100];//百位

disp[2]=smgduan[num%1000%100/10];//个位

disp[3]=smgduan[num%1000%100%10];

}


void DigDisplay()

{

uint16 i;

for(i=0;i<4;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=1;LSB=1;LSC=0; break;//显示第0位

case(1):

LSA=0;LSB=1;LSC=0; break;//显示第1位

case(2):

LSA=1;LSB=0;LSC=0; break;//显示第2位

case(3):

LSA=0;LSB=0;LSC=0; break;//显示第3位

}

P0=disp[i];//发送数据

delay(5); //间隔一段时间扫描

P0=0x00;//消隐

}

}


void main(void)

{  

while(1)

{

keybord();

datapros();   //数据处理函数

DigDisplay();//数码管显示函数

}

}


I2C.c文件


#include"I^2C.h"


void delay10us()   //延迟十毫秒,误差 0us

{

    unsigned char a,b;

    for(b=1;b>0;b--)

        for(a=2;a>0;a--);

}


void  I2C_Start()   //起始信号

{

SDA=1;

delay10us();

SCL=1;

delay10us();

SDA=0;

delay10us();

SCL=0;

delay10us();

}


void I2C_Stop()  //终止信号

{

SDA=0;

delay10us();

SCL=1;

delay10us();

SDA=1;

delay10us();

//接下来变为0不需要管,因为得到终止信号程序截至

// SDA=0;

// delay10us();

}


        //********《发送字节的函数》********//

unsigned char I2C_SendBye(unsigned char dat)

{

unsigned int i,m;

for(i=0;i<8;i++)  //通过循环即可将八位字节数据输入

{

SDA=dat>>7;  //输入最高一位

dat=dat<<1;  //依次将最高位数左移到第一位

delay10us();

SCL=1;

delay10us();

SCL=0;       //只有在SCL为0时数据可进行有效变动

delay10us();

}

SDA=1;           //将SDA和SCL释放出来,都都置为1

delay10us();

SCL=1;

while(SDA) //(1).应答时SDA是0,是0时退出循环,return 1;

{

m++;

if(m>200)

{

SCL=0;    //拉低时终止条件,无论应答或者非应答

delay10us();

return 0;//(2).SDA不为0,证明产生非应答,返回1

}

}

SCL=0;          

delay10us();

return 1;

}


            //**********《接受字节函数》**********//

unsigned char I2C_ReadBye()

{

unsigned char i=0,dat=0;

SDA=1;  //初始时先置1,看接受过程中是否有会变0

delay10us();

for(i=0;i<8;i++)

{

SCL=1;  //保持SCL=1时数据稳定不能改变,保证读取

delay10us();

dat=dat<<1;    //【dat=0, 移位后为00】【01移位后10】......

dat=dat|SDA;   //【00或运算后01】 【10或运算后11】......

delay10us();

SCL=0;     //算完后置为0

delay10us();

}

return dat;

}


    //*****《对AT24C02写入数据》*****//                 // 在那个地址  ,写入什么数据//

void AT24C02Write(unsigned char addr,unsigned char dat)

{

//起始信号

I2C_Start();

//器件地址(函数内部包含应答无需再写)

I2C_SendBye(0XA0);

//首地址(函数内部包含应答无需再写)

I2C_SendBye(addr);

//发送数据

I2C_SendBye(dat);

//停止信号

I2C_Stop(); 

}


   //*****《对AT24C02数据进行读取,(先写后读)》******//

unsigned char AT24C02Read(unsigned char addr)

{

unsigned char num;

//(写)起始信号

I2C_Start();

//器件地址(函数内部包含应答无需再写)

I2C_SendBye(0XA0);  //0是写

//首地址

I2C_SendBye(addr);

//(读)转向要重新写起始信号

I2C_Start();

//读取器件地址(函数内部包含应答无需再写)

I2C_SendBye(0XA1);  //1是读

num=I2C_ReadBye();  //读取一位字节

//停止信号

I2C_Stop(); 

return num;

}


I2C.h文件


#ifndef _I2C_H

#define _I2C_H


#include


sbit SCL=P2^1;

sbit SDA=P2^0;


void  I2C_Start(); 

void I2C_Stop();

unsigned char I2C_SendBye(unsigned char dat);

unsigned char I2C_ReadBye();

void AT24C02Write(unsigned char addr,unsigned char dat);  //写

unsigned char AT24C02Read(unsigned char addr);   //读


#endif

关键字:51单片机  I  AT24CXX  存储器 引用地址:51单片机~EETROM ( I IC协议总线),AT24CXX存储器工作原理

上一篇:51单片机~DS18B20温度传感器
下一篇:51单片机~串口通信

推荐阅读最新更新时间:2024-11-04 23:45

51单片机超声波水位控制器设计
说明: 本设计中液晶显示有4个字母,分别为 H------容器的最高水位设定值(不能高于实际高度) L------容器的最低水位设定值 D-----容器实际高度(可以设置) C-----容器内液体的高度(在实际演示中,障碍物离探头越近,液晶C显示越大,因为障碍物好比液面,离探头近了说明水位高了) 特别提醒:如果容器实际高度D你设置为1米,那么C液体的高度最高能测到98cm,因为探头的盲区在2cm左右。如果D设为2米,那么最高能测到1.98m. 按键功能分别为:设置键 增加键 减小键 复位键 三个指示灯的分别功能为:红色----超过设定的最高水位H 黄色-----低于设定的最低水位L 绿色----最高H和最低L中间
[单片机]
<font color='red'>51单片机</font>超声波水位控制器设计
51单片机控制两个步进电机
/*----------------------------------------------- 步进电机控制 ------------------------------------------------*/ #include reg52.h #define KeyPort P3 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa ={0x3f,0x06,0x5b,0x4f,0x66,
[单片机]
JEDEC开始着手“无线存储器”标准化工作
    半导体存储器 标准化机构JEDEC宣布将着手推进“WirelessMemory(无线存储器)”的标准化工作。无线存储器是新一代数据传输技术,可通过无线方式在移动产品与没有电池的存储器标签之间实现高速读写。     致力于无线存储器标准化的,是JEDEC的“JC-64”委员会新设的“JC-64。9”分委会。JC-64是负责嵌入式存储装置与可移动存储卡标准化的委员会。负责无线存储器标准化的JC-64。9分委会主席由芬兰诺基亚的职员担任,副主席(vice-chair)由美国美光科技及三星半导体美国公司的职员担任。目前,JEDEC正在招募人员加入该分委会。     JEDEC的发布资料显示,担任JC-64。9分委会主席的诺
[工业控制]
AT89C51单片机应用于数控车床切削力测量
 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。   本文就介绍了应用AT89C51单片机测量数控车床切削力的新方法,重点阐述了单片机实现连续自动采样、A/D转换、标度变换及数据处理的方法。   1 问题的提出   在数控车床的加工中,切削力的测量甚为重要。通过对切削力的测量可以分析与研究数控车床各零部件、机构或结构的受力情况和工作状态,验证设计和计算结果
[单片机]
AT89C<font color='red'>51单片机</font>应用于数控车床切削力测量
51单片机之C语言-4.5基本语句之循环语句
1.循环语句 while 循环结构是程序中一种很重要的结构。 while语句的一般形式为: while(表达式)语句 其中表达式是循环条件,语句为循环体。 while语句的语义是:计算表达式的值,当值为真(非零)时,执行循环体语句。其执行过程可用下图表示。 图4-5-1 while循环执行过程 while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环。 2.循环语句 do-while do-while语句的一般形式为: do 语句 while(表达式) 其执行过程可用如下流程图表示, 这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为
[单片机]
<font color='red'>51单片机</font>之C语言-4.5基本语句之循环语句
实验五 定时器(80C51单片机汇编语言编程)
P1.0、P1.1接两个发光管,INT0接一启动按键,启动后两个发光管一亮一灭,亮灭时间为1s,再按按键停止发光管。 实验箱晶振:6M ORG 0000H AJMP MAIN ORG 0003H AJMP INT0 ORG 000BH AJMP T0 ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB EX0 SETB ET0 SETB IT0 CLR TR0 CLR P1.0 CLR P1.1 MOV R7,#0AH SJM
[单片机]
在同一条I2C总线上挂接多个DS1859器件
引言 DS1859双路、温控电阻不允许用户通过外部引脚改变其I2C从地址。相反,器件为主存储器提供可编程I2C从地址。在具体应用中,一条I2C总线可能需要接多个DS1859器件。由于所有DS1859出厂时的缺省I2C从地址都相同,因此,这些器件与I2C总线连接时,必须改变其中一个或多个器件的从地址。 本应用笔记阐述了同一条I2C总线上接两个DS1859时,如何改变其中一个器件的I2C从地址。这一方法可推广应用于挂接多个器件的情况。本文假定用户可根据需要将DS1859的WPEN引脚转换为逻辑高电平或逻辑低电平。 DS1859的独特之处还在于每个器件有两个从地址,其中一个可编程地址用来访问主存储器,另一个固定地址(A0h)用来
[嵌入式]
基于51单片机设计控制的荧光舞
0 引言 传统的路边装饰和节日彩灯等是利用电路的串并联来完成的,缺少更加生动的图形和效果。本设计是由单片机STC89C52控制,通过C语言编程完成动作编排和LED光带的显示,结合演员的舞蹈表演,在和谐或动感的音乐背景下展现跨越时空的神奇表演。 2 系统的总体设计 本次设计是由两种思维出发完成舞蹈与程序控制LED光带显示,一种是设定模式,一种是即兴模式。其中设定模式的程序编写是由整个舞蹈的编排和音乐的选取决定,本次设计编排有10个舞蹈程序供选取。本次设计主要即兴模式的选择完全有4×4按键完成。这样不仅有利于系统本身功能的扩展,而且方便使用在更多的载体上。系统设计框图如图1所示。 2 系统的主要硬件设计 2.1 数据处理
[单片机]
基于<font color='red'>51单片机</font>设计控制的荧光舞
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved