导航:首页 > 操作系统 > 51单片机外接eeprom

51单片机外接eeprom

发布时间:2022-12-27 21:30:58

1. 单片机的外接eeprom是不是靠E0 E1 和 E2 上所加的电压确定地址的

呵呵,EEPROM的选中确实是靠E2、E1、E0所加电压来确定其片选信号的。应该没有问题了吧。

2. 51单片接的外接存储器EEPROM的地址究竟怎么用

E0,E1,E2是EEPROM的片选地址(这个3个管脚都有效的话,非NC)。当E0接Vcc时,其他两个接地,那么发信号start+1010_001_0/1就可以访问该EEPROM(1010:为EEPROM的通用器件地址;001:为E2、E1、E0的状态;0:对应写命令,1:对应读命令);若都接Vcc,发start+1010_111_0/1;以此类推。
EEPROM的数据地址是接着写命令后发。
希望对你有所帮助!

3. 51单片机I2C总线的问题。为什么写不进到外部eeprom啊

ead_byte()中第一个SCL=0:表示让对方输入数据;( I2C总线是SCL=0时从设备输出数据,SCL=1时主设备接收数据。)
第一个SDA=1:表示释放数据线,这样对方发数据到总线上,因为在SDA=0时,会线与,所以对方发不了数据。

write_byte中的“SCL = 0; delay(1); SDA = 1; delay(1); ”和read_byte()中一个意思。只是这里write_byte之后要接收应答信号。

可参考下面的资料
I2C总线信号时序分析

铁电存储器 FM24C16G(I2C接口) 数据手册
时钟芯片 DS3231(I2C接口) 数据手册

4. 51单片机都有eeprom吗

51单片机内部程序存储器五花八门:
1、内部没有程序存储器如:8031
2、内部有EPROM(可擦除ROM)如:8751
3、内部有EEPROM(电可擦除ROM)如:AT89C51
4、内部有FLASHROM(可以在线编程ISP)如:STC、AT89S51等等。

5. 51单片机通过I2C总线操作EEPROM

把Display();用大括号括住试一试
另外要确定从EEPROM读取的数值dat是否在0-16范围内,因表格内只有17个代码,超过此范围是显示不出来的
还有LSD=LEDDATA[DisplayData[i]];//发送段码
你获得的数据只有DisplayData[0],那么DisplayData[i]其它数据从何而来,是0吗?也许只是想先试一试能否点亮一个数码管

6. 51单片机内部EEPROM使用求教

不知道你用的是哪款单片机,你可以看单片机的数据手册,应该会有详细到操作时序的介绍

针对STC15F4K系列单片机EEPROM使用实例如下:

单字节操作,串口发送

#include"reg51.h"
#include"intrins.h"

typedefunsignedcharBYTE;
typedefunsignedintWORD;

//-----------------------------------------------

sfrP1M1=0x91;//PxM1.n,PxM0.n=00--->Standard,01--->push-pull
sfrP1M0=0x92;//=10--->pureinput,11--->opendrain
sfrP0M1=0x93;
sfrP0M0=0x94;
sfrP2M1=0x95;
sfrP2M0=0x96;
sfrP3M1=0xB1;
sfrP3M0=0xB2;
sfrP4M1=0xB3;
sfrP4M0=0xB4;
sfrP5M1=0xC9;
sfrP5M0=0xCA;
sfrP6M1=0xCB;
sfrP6M0=0xCC;
sfrP7M1=0xE1;
sfrP7M0=0xE2;

sfrIAP_DATA=0xC2;//IAP数据寄存器
sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字节
sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字节
sfrIAP_CMD=0xC5;//IAP命令寄存器
sfrIAP_TRIG=0xC6;//IAP命令触发寄存器
sfrIAP_CONTR=0xC7;//IAP控制寄存器

#defineCMD_IDLE0//空闲模式
#defineCMD_READ1//IAP字节读命令
#defineCMD_PROGRAM2//IAP字节编程命令
#defineCMD_ERASE3//IAP扇区擦除命令

#defineURMD0//0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器

sfrT2H=0xd6;//定时器2高8位
sfrT2L=0xd7;//定时器2低8位

sfrAUXR=0x8e;//辅助寄存器

//#defineENABLE_IAP0x80//ifSYSCLK<30MHz
//#defineENABLE_IAP0x81//ifSYSCLK<24MHz
#defineENABLE_IAP0x82//ifSYSCLK<20MHz
//#defineENABLE_IAP0x83//ifSYSCLK<12MHz
//#defineENABLE_IAP0x84//ifSYSCLK<6MHz
//#defineENABLE_IAP0x85//ifSYSCLK<3MHz
//#defineENABLE_IAP0x86//ifSYSCLK<2MHz
//#defineENABLE_IAP0x87//ifSYSCLK<1MHz

//测试地址
#defineIAP_ADDRESS0x0400

voidDelay(BYTEn);
voidIapIdle();
BYTEIapReadByte(WORDaddr);
voidIapProgramByte(WORDaddr,BYTEdat);
voidIapEraseSector(WORDaddr);
voidInitUart();
BYTESendData(BYTEdat);

voidmain()
{
WORDi;

P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P4M0=0x00;
P4M1=0x00;
P5M0=0x00;
P5M1=0x00;
P6M0=0x00;
P6M1=0x00;
P7M0=0x00;
P7M1=0x00;

P1=0xfe;//1111,1110系统OK
InitUart();//初始化串口
Delay(10);//延时
IapEraseSector(IAP_ADDRESS);//扇区擦除
for(i=0;i<512;i++)//检测是否擦除成功(全FF检测)
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=0xff)
gotoError;//如果出错,则退出
}
P1=0xfc;//1111,1100擦除成功
Delay(10);//延时
for(i=0;i<512;i++)//编程512字节
{
IapProgramByte(IAP_ADDRESS+i,(BYTE)i);
}
P1=0xf8;//1111,1000编程完成
Delay(10);//延时
for(i=0;i<512;i++)//校验512字节
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=(BYTE)i)
gotoError;//如果校验错误,则退出
}
P1=0xf0;//1111,0000测试完成
while(1);
Error:
P1&=0x7f;//0xxx,xxxxIAP操作失败
while(1);
}

/*----------------------------
软件延时
----------------------------*/
voidDelay(BYTEn)
{
WORDx;

while(n--)
{
x=0;
while(++x);
}
}

/*----------------------------
关闭IAP
----------------------------*/
voidIapIdle()
{
IAP_CONTR=0;//关闭IAP功能
IAP_CMD=0;//清除命令寄存器
IAP_TRIG=0;//清除触发寄存器
IAP_ADDRH=0x80;//将地址设置到非IAP区域
IAP_ADDRL=0;
}

/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTEIapReadByte(WORDaddr)
{
BYTEdat;//数据缓冲区

IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_READ;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA;//读ISP/IAP/EEPROM数据
IapIdle();//关闭IAP功能

returndat;//返回
}

/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
voidIapProgramByte(WORDaddr,BYTEdat)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_PROGRAM;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_DATA=dat;//写ISP/IAP/EEPROM数据
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}

/*----------------------------
扇区擦除
----------------------------*/
voidIapEraseSector(WORDaddr)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_ERASE;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}

/*----------------------------
初始化串口
----------------------------*/
voidInitUart()
{
SCON=0x5a;//设置串口为8位可变波特率
#ifURMD==0
T2L=0xd8;//设置波特率重装值
T2H=0xff;//115200bps(65536-18432000/4/115200)
AUXR=0x14;//T2为1T模式,并启动定时器2
AUXR|=0x01;//选择定时器2为串口1的波特率发生器
#elifURMD==1
AUXR=0x40;//定时器1为1T模式
TMOD=0x00;//定时器1为模式0(16位自动重载)
TL1=0xd8;//设置波特率重装值
TH1=0xff;//115200bps(65536-18432000/4/115200)
TR1=1;//定时器1开始启动
#else
TMOD=0x20;//设置定时器1为8位自动重装载模式
AUXR=0x40;//定时器1为1T模式
TH1=TL1=0xfb;//115200bps(256-18432000/32/115200)
TR1=1;
#endif
}

/*----------------------------
发送串口数据
----------------------------*/
BYTESendData(BYTEdat)
{
while(!TI);//等待前一个数据发送完成
TI=0;//清除发送标志
SBUF=dat;//发送当前数据

returndat;
}

7. 关于单片机EEPROM存储器使用问题

端口 自己改一下
接法..随便找两个io口.
上拉5-10k电阻就好了.
24c01总共就只有128字节
而且写入的时候都知道忘那里写
你自己自然清楚什么时候..24c01满了.
这个东西都是固定地址.
又不是硬盘这种..还要什么时候满

SDA EQU P2.0
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H

ORG 0040H
LJMP START;转入主程序.
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#55H
MOV P0,I2CDATA
CALL DELAY
CALL I2C_WRITE ;写入数据.
MOV I2CDATA,#0AAH
MOV P0,I2CDATA
CALL DELAY
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;读出数据.
MOV P0,I2CDATA
CALL DELAY

NOP
NOP
LJMP START

//*******************************************
/*------------------------------------------------------

读一个字节 Address地址 Data读出的数据

------------------------------------------------------*/

I2C_READ:

I2C_READ_A:

LCALL I2C_START

MOV A,#10100000B //从器件地址位是000,并且对从器件进行写操作。
//不要有所疑问为什么这么操作。因为这是一个选择性读的操作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写操作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JC I2C_READ_A ;=1,表示无确认,再次发送 C为1转移。

MOV A,Address

LCALL I2C_SEND8BIT

LCALL I2C_ACK

I2C_READ_B:

LCALL I2C_START

MOV A,#10100001B //从器件地址位是000,并且对从器件进行读操作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JC I2C_READ_B //C=1转移,表示无确认,再次发送。

LCALL I2C_RECEIVE8BIT

MOV I2CData,A

LCALL I2C_ACK

LCALL I2C_STOP

RET
//*******************************************************

//*******************************************************
;接收八位数据
//主器件接收从器件指定地址的8位数据。
I2C_RECEIVE8BIT:

MOV B,#08H

CLR A

SETB SDA

I2C_RECEIVE8IT_A:

SETB SCL

NOP

NOP

MOV C,SDA

RLC A

CLR SCL

DJNZ B,I2C_RECEIVE8IT_A

RET
//*******************************************************

//*******************************************************
/*------------------------------------------------------

写一个字节 Address地址 I2CDatata写入的数据

------------------------------------------------------*/

I2C_WRITE:

I2C_WRITE_A:

LCALL I2C_START //调用I2C总线的起始信号的程序。

MOV A,#10100000B //从器件地址位是000,并且对从器件进行写操作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JC I2C_WRITE_A //=1,表示无确认,再次发送。 C为1转移。

MOV A,Address

LCALL I2C_SEND8BIT

LCALL I2C_ACK

MOV A,I2CData

LCALL I2C_SEND8BIT

LCALL I2C_ACK

LCALL I2C_STOP

RET
//***************************************

//**********************************
;发送开始信号
//I2C总线的起始信号的程序。

I2C_START:

SETB SCL

SETB SDA

NOP

NOP

CLR SDA

NOP

NOP

CLR SCL

RET
//***********************************

//***********************************
;送八位数据
//主器件送从器件8位数据。

I2C_SEND8BIT:

MOV B,#08H

I2C_SEND8BIT_A:

RLC A

MOV SDA,C

SETB SCL

NOP

NOP

CLR SCL

DJNZ B,I2C_SEND8BIT_A

RET
//************************************

//*************************************
;发送接收确认信号

I2C_ACk:

SETB SDA

SETB SCL

NOP

NOP

JB SDA,I2C_ACK0 //SDA为1跳转。

CLR C

SJMP I2C_ACK_END

I2C_ACK0:

SETB C

I2C_ACK_END:

CLR SCL

RET
//**************************************

//**************************************
;发送结束信号

I2C_STOP:

CLR SDA

NOP

NOP

SETB SCL

NOP

NOP

SETB SDA

RET
//***************************************

//***************************************
delay:
MOV R7,#0FFH
DEL1:
MOV R6,#0FFH
DEL2:
MOV R5,#10
DEL3:
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1

RET
//***************************************

8. 如何用51单片机来检测一个外接EEPROM的好坏

EEPROM存储器,有并行的,如28系列的,IIC的,如24系列的。
24系列的,比较好接电路,只需要2个脚与单片机相连,重点是写IIC通信程序。逐个单元写入一个特定的数,如AAH,55H等,然后再读出来,看是否相同,如有一个单元的数据读/写不同,就说明芯片有问题。
并行的,如28系列的,要与单片机连接,就有点麻烦,需要用到地址总线,数据总线,读/写控制线,扩展成外部数据存储器电路。检测好坏的方法与上面的相同。

9. 用51单片机和EEPROM如何写掉电存储c程序

直接存储是不行的,单片机本身的RAM是掉电就没有的。一般使用EEPROM,常用的有24c01等,采用I2C协议进行读写数据,怎么使用这类芯片的程序网上搜一下能搜出几吨来。可以自己搜索一下,由于你使用的51单片机,可以直接用IO口来模拟I2C协议,很简单的。
需要注意的一点就是,要注意E2P芯片的寿命(一般是读写100万次,足够了)。
存储数据的时候,可以对操作数和存储的数据进行比较,不相等则存储,比如:
if
(ReadI2c()!=data)
这样可以增加使用寿命,比有些每隔1秒钟进行存储的会好多了。
碰到要存储的是时间的时候,并且是每秒钟存的话,由于寿命的原因,则要另外想办法,常用的有:
1.在掉电瞬间的时候去存储数据,这种方法要硬件上给予检测电路来告知现在掉电了,然后程序就对时间进行存储,这种方法的弊端是“必须要有检测电路”。
2.考虑到上述的问题,可以开辟多块空间来存储“时间”,每次上电依次使用不同的空间,但是为了要有“使用哪一块的判断条件”,所以必须再多一个空间存储“判断”:每次程序开始,将“判断++”,然后根据其来决定使用哪一块的“时间空间”。
/*************************************************************/
希望能有帮助,上述是对掉电记忆来讲比较不错的的方法了。

10. 用51单片机和EEPROM如何写掉电存储汇编程序

(1)51单片机只能往外部的eeprom写,要用movc指令;
(2)51单片机访问外部存储器的地址线为16位,最多64kB的地址空间。假如你选了一个2kB的EEPROM,那么只需要11跟地址线,你把51的低11位地址与EEPROM相连,将第12位地址线连到EEPROM的选通线。在这个例子里,2048~4096的地址空间即对应你的EEPROM,随便你往哪里写。

阅读全文

与51单片机外接eeprom相关的资料

热点内容
苹果appstore怎么填 浏览:688
radiogroupandroid 浏览:152
微信加密手机店能破解吗 浏览:952
如何更换win7补丁服务器地址 浏览:702
如何举报dota2服务器 浏览:584
苹果怎么打链接微信文件夹 浏览:366
阿拉德之路怎么苹果跟安卓一起玩 浏览:241
主力排序选股源码 浏览:149
android无法生成apk文件 浏览:505
如何开一个挂网页的服务器 浏览:538
虞城车辆解压去哪里 浏览:759
如何发送战舰世界命令 浏览:609
二次解压软件是什么意思 浏览:208
公司内网DNS服务器如何输入 浏览:966
服务器f1如何改中文语言 浏览:323
编写文件夹程序 浏览:261
华为防火墙查看mtu的命令 浏览:928
ltepdf 浏览:110
怎么往app里面充值 浏览:865
在知到app上怎么进行课程确认 浏览:979