基于51单片机的EEPROM读写
本讲内容:
对存储器的基本知识进行介绍。介绍EEPROM芯片AT24C02;通过例程展示EEPROM的读写。
存储器是应用于各种嵌入式场合的存储部件,按功能可分为只读存储器(ROM)和随机存取存储器(RAM)两大类,分别用作固定数据存储和临时数据缓存。
RAM(Random Access Memory),随机存取存储器:
RAM的特点是:上电运行时,操作系统和应用程序的所有正在运行的数据和程序都会放置其中,并且随时可以对存放在里面的数据进行修改和存取。它的工作需要由持续的电力提供,一旦系统断电,存放在里面的所有数据和程序都会自动清空掉,并且再也无法恢复。
使用得比较多的RAM种类有:
DRAM(Dynamic RAM,动态随机存取存储器):
这是最普通的RAM,一个电子管与一个电容器组成一个位存储单元,DRAM将每个内存位作为一个电荷保存在位存储单元中,用电容的充放电来做储存动作,但因电容本身有漏电问题,因此必须每几微秒就要刷新一次,否则数据会丢失。存取时间和放电时间一致,约为2~4ms。因为成本比较便宜,通常都用作计算机内的主存储器。
SRAM(Static RAM,静态随机存取存储器):
静态,指的是内存里面的数据可以长驻其中而不需要随时进行存取。每6颗电子管组成一个位存储单元,因为没有电容器,因此无须不断充电即可正常运作,因此它可以比一般的动态随机处理内存处理速度更快更稳定,往往用来做高速缓存。
SDRAM(Synchronous DRAM,同步动态随机存取存储器):
这是一种与CPU实现外频Clock同步的内存模式,工作电压为3.3V。 所谓clock同步是指内存能够与CPU同步存取资料,这样可以取消等待周期,减少数据传输的延迟,因此可提升计算机的性能和效率。
DDR SDRAM(Double Data Rate二倍速率同步动态随机存取存储器):
作为SDRAM的换代产品,它具有两大特点:
其一,速度比SDRAM有一倍的提高;
其二,采用了DLL(Delay Locked Loop:延时锁定回路)提供一个数据滤波信号。这是目前内存市场上的主流模式。
只读存储器(read-only memory --- ROM)可以分为以下两大类:
(1)掩模编程ROM,它所存储的固定逻辑信息是由生产厂家通过光刻掩模版来决定的。
(2)现场可编程ROM(programmable read-only memory)。
a:PROM(可编程ROM)。此类ROM通常采用溶丝结构,用户可根据编程的需要,把无用的溶丝烧断来完成编程工作(即把信息写入到存储器中)。但一旦编程完毕,就无法再变更,故用户只可编程(写)一次。
b:EPROM(可擦除可编程ROM-erasable programmable read only memory)。
此类ROM存储单元中存贮信息的管子采用浮栅结构,可用紫外线或X-射线把原来存的信息一次全部擦除。
c:EEPROM(电可擦除可编程ROM,也叫E2PROM-electrically erasable programmable read only memory)。
d: Flash Memory(快闪存储器)
这是一种可以直接在主机板上修改内容而不 需要将IC拔下的内存,当电源关掉后储存在里面的资料并不会流失掉,在写入资料时必须先将原本的资料清除掉,然后才能再写入新的资料,缺点为写入资料的速度太慢。
EEPROM芯片AT24C02介绍:
例程:
/*****************EEPROM读写*******************
*单片机型号:STC89C52RC
*开发环境:KEIL
*功能:向IIC总线器件24c02EEPROM中地址为1的存储单元中写入数据50
并将其读出,显示于数码管上。
****************************************************/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;sbit scl=P2^1;sbit LE1=P2^6;sbit LE2=P2^7;sbit LED=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
0x5e,0x79,0x71};
void delay1(uint z)
{
uchar x,x1;
for(;z>0;z--)
{for(x=0;x<114;x++){for(x1=0;x1<1;x1++);}}
}
void delay_5us()
{
int i;
for(i=0;i<1;i++){;}
}
void delay(int In,int Out) //定义延时函数
{
int i,j;
for(i=0;i<In;i++)
{for(j=0;j<Out;j++){;}}
}
void star()
{
sda=1;delay_5us();
scl=1;delay_5us();
sda=0;delay_5us();
}
void stop()
{
sda=0;delay_5us();
scl=1;delay_5us();
sda=1;delay_5us();
}
void ack()
{
uchar z=0;
while((sda==1)&&(z<50))z++;
scl=0;
delay_5us();
}
void write(uchar slave_write_address,uchar byte_address,uchar data_data)
{
uchar temp,temp1,i,ii;
star();
for(ii=0;ii<3;ii++)
{
if(ii==0)
{temp=slave_write_address;temp1=slave_write_address;}
else if(ii==1)
{temp=byte_address;temp1=byte_address;}
else if(ii==2)
{temp=data_data;temp1=data_data;}
for(i=0;i<8;i++)
{
scl=0;
delay_5us();
temp=temp1;
temp=temp&0x80;
if(temp==0x80)sda=1;
else sda=0;
delay_5us();
scl=1;delay_5us();
scl=0;delay_5us();
temp1=temp1<<1;
}
sda=1;delay_5us();
scl=1;delay_5us();
ack();
}
stop();
}
uchar read(uchar slave_write_address,uchar byte_address,uchar slave_read_address)
{
uchar temp,temp1,i,ii,x,data_data;
star();
for(ii=0;ii<3;ii++)
{
if(ii==0)
{temp=slave_write_address;temp1=slave_write_address;}
else if(ii==1)
{temp=byte_address;temp1=byte_address;}
else if(ii==2)
{star();temp=slave_read_address;temp1=slave_read_address;}
for(i=0;i<8;i++)
{
scl=0;delay_5us();
temp=temp1;temp=temp&0x80;
if(temp==0x80)sda=1;
else sda=0;
delay_5us();
scl=1;delay_5us();
scl=0;delay_5us();
temp1=temp1<<1;
}
sda=1;delay_5us();
scl=1;delay_5us();
ack();
}
for(x=0;x<8;x++)
{
data_data=data_data<<1;
sda=1;delay_5us();
scl=0;delay_5us();
scl=1;delay_5us();
if(sda==1)data_data|=0x01;
}
ack();
stop();
return data_data;
}
void display(uchar a,uchar b)
{
LE1=0;
P0=table[a];LE1=1;LE1=0; //显示百位
LE2=0;
P0=0xfe;LE2=1;LE2=0;
delay(5,100);
LE1=0;
P0=table[b];LE1=1;LE1=0; //显示十位
LE2=0;
P0=0xfd;LE2=1;LE2=0;
delay(5,100);
}
void main()
{
unsigned char num;
unsigned char buffer;
unsigned char a,b;
num = 0x32;
loop1:write(0xa0,0x01,num);
delay1(20);
buffer=read(0xa0,0x01,0xa1);
delay1(20);
if(buffer!=num){goto loop1;}
a=buffer/10;
b=buffer%10;
LED=0;delay(5,1000);
LED=1;delay(5,1000);
LED=0;delay(5,1000);
LED=1;delay(5,1000);
while(1){display(a,b);}
}
最后,求求看到的此文的小伙伴点赞和关注支持一下下哦。毕竟,码字不容易哦,您的支持是我最大的动力呀!!!呜呜呜~~~
基于51单片机的EEPROM读写相关推荐
- NFC之基于51单片机rc522的读写
NFC之基于51单片机rc522的读写 改程序,端口定义 上位机修改com口
- SD卡SPI读写模式,基于51单片机的讲解
经过验证测试,sd卡使用的spi模式为模式3(mode3),即CPOL和CPHA均为1,时钟线高电平空闲,第二个边沿(上升沿)进行采样. 下面为51单片机软spi读写一个字节时序(模式3)的代码示例, ...
- 基于51单片机的电子万年历的设计-源代码
电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...
- 毕设--基于51单片机的温度报警器设计
目录 1.简介 2.设计要求与方案论证 2.1.设计要求 2.2.系统基本方案选择和论证 2.2.1.单片机芯片的选择方案和论证 2.2.2.温度传感器设计方案论证 2.3.电路设计最终方案决定 3. ...
- 基于51单片机的温度报警器设计
目 录 前言.............................................................................................. ...
- 基于51单片机的语音采集系统设计(录音笔选择方案)
功能: 基于51单片机的语音实时采集系统 系统由STC89C52单片机+ISD4004录音芯片+LM386功放模块+小喇叭+LCD1602+按键+指示灯+电源构成 具体实现功能: (1)可通过按键随时 ...
- 基于51单片机的密码锁
本次的项目是基于51单片机的密码锁,适合用来作为课程设计 主要实现了:密码锁功能,通过矩阵按键输入密码,输入范围为0-F,共有四位:同时,也可以使用更改按键更改密码,在更改时需要输入原密码来进入更改模 ...
- 基于51单片机的简易雷达定位装置
简易超声波雷达 任务: 一. 摘要: 超声波测距广泛运用于各类电子产品精确距离测量,如汽车尾部的倒车雷达对倒车时的障碍物进行精确判断,反馈到驾驶员,使驾驶员能做出准确的判断和操作:各类航模中当即将触地 ...
- 基于51单片机的酒精浓度检测仪设计
本设计仅供参考 基于51单片机的酒精浓度检测仪设计(proteus仿真+程序+原理图+报告) 原理图:Altium Designer 仿真:proteus 8.9 程序编译器:keil 4/keil ...
最新文章
- 朱峰谈概念设计(二):我们设计什么
- Androd安全——反编译技术完全解析
- 人工智能第六课:如何做研究
- calayer 与uiview
- WebService学习总结——调用第三方提供的webService服务
- 安装saltstack遇到的问题锦集
- 2.maven 安装配置
- pythoncv2模块详细介绍_【Opencv】【Python】Python中opencv模块cv2一些函数用法及简介...
- ibatis 直接升格为 apache 一级项目了
- STM32F103无源蜂鸣器驱动程序
- MFC:读取整个记事本文件
- 完美的Python代码制作“恐龙跳一跳“小游戏【附带源码 】
- 小白学习笔记之Python要点
- temp.....................
- Qt编写物联网管理平台22-报警联动
- prompt learning 提示学习初步心得及示例 代码
- 上海-亚马逊AWS联合创新中心正式启用
- 无法加载文件 C:\Users\Administrator\PycharmProjects\pythonProject\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。
- 组态王图素制作_组态王教程——很实用(杂项)
- 软件测试-bug详解
热门文章
- Mask R-CNN 原理解析
- Android如何打开未安装的apk,android获取未安装的APK文件的信息
- 快衰落、慢衰落,平坦衰落、频率选择性衰落
- kafka生产者的发送消息的流程以及代码案例
- 一串JS代码Hack简单考眼力小游戏
- 哈夫曼编码器和译码器(完整代码)
- 云破月来花弄影-SVG多种技术组合实现
- round在python是什么意思_python3.3.2我对函数“round”有正确的理解吗?
- python广州地图_手把手教你用Python+可视化工具制作漂亮地图
- CorelDRAW X3中文版服装创意设计视频教程