用51单片机先在EEPROM中写入数据,然后读取数据显示在数码管上

用PROTEUS仿真, 不知道怎么回事老是不对,求高手指导,如有需要我做的程序和仿真图可以另发,急用!!

第1个回答  2012-05-07
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
sbit duan=P2^6;
sbit wei=P2^7;

uchar smg_duan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}

void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}

void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

void ack()
{
uchar i=0;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}

void noack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}

void iicwr_byte(uchar dat)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}

uchar iicre_byte()
{
uchar i,dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
delay();
}
return dat;
}

void init()
{
sda=1;
scl=1;
}

void iicwrite_byte(uchar add,uchar dat)
{
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
iicwr_byte(dat);
ack();
stop();
}

uchar iicread_byte(uchar add)
{
uchar a;
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
start();
iicwr_byte(0xa1);
ack();
a=iicre_byte();
noack();
stop();
return a;
}

void main()
{
uchar k;
k=iicread_byte(1);
k=k%10;
duan=1;
wei=1;
P0=smg_duan[k];
k++;
iicwrite_byte(1,k);
while(1);
}追问

有具体用PROTEUS的仿真图片没,本人新手,对那个连图是第一次弄,刚试了下没做出来...
还有,你的这个写个数据进去再读出来就会出问题了
iicwrite_byte(1,0x44);
delay();
k=iicread_byte(2);
k=k%10;
duan=0;
wei=0;
P0=smg_duan[k];读出来显示FF,求解释,急用!!!!如果能解决给分绝不会吝啬

第2个回答  2012-05-07
PROTUES 库中,如果你没有添加特殊库,自带库的51是没有E2PROM的。。。。追问

AT24C02,有这个。但是仿真做不出来

求教51单片内部EEPROM数据读出来赋值给延时程序失败
该程序实现了对STC单片机的EEPROM的操作。每隔0.5秒钟,单片机对EEPROM进行一次 读、擦除和写操作,并把数值显示到数码管上。确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,数码管显示的值会从断电钱的那个值开始显示。

51单片机 用EEPROM掉电储存 两位数码管秒表 数码管无法正常显示
楼主可以试下在关闭中断的情况下,通过在主循环中通过延时函数,先写入,再读出,然后显示,让它循环显示看看是否有错,如果显示不正常,那就是存储的时序没弄好,比如在write_add()函数最后面加上1ms的延时,确保存储芯片保存数据,防止写完后接着读出错 楼主还可以换个别的存储地址试一下看看,确保接线...

单片机中的EEPROM中,为什么第一次往里面写数据,再去读却读不出来_百度...
b、数据读出程序不对。3、所以问题就出在读写程序上面,如果第二次以后都是可以读的,那就肯定是第一次写入没有成功。

单片机EEPROM使用时第一次运行程序时从EEPROM读出的数据怎么设置我想要...
就应该在写入数据的时候,加上校验码。比如:写四个字节的数据,那么,在这四个之后,再写入它们的反码。读出的时候,读出8个字节,前后四个字节,是反码的关系,就是正确的数据。下载程序后第一次从EEPROM的数据,应该不会是这样的,这就是无效的数据。

51单片机E2PROM数据读取问题
整体看没啥问题,建议楼主用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入 楼主要注意数据类型的使用,num1是(uint)而write_byte(uchar data)要做到数据类型的统一以免出现莫名奇妙的问题 uchar read_byte(uint byte_add){ ISP_TRIG=0XB9;return ...

用51单片机和EEPROM如何写掉电存储c程序
简单的方式:变化一次写一次,无论是否掉电,再次上电先读eeprom 复杂的方式 按照如图连接,要求是单片机必须有掉电检测功能

51单片机中不用锁存器怎么显示动态数码管
AT24C02是EEPROM芯片,与数码管毫无关系。要组成动态显示电路,可以不用锁存器,是数码管驱动电路是必须用的。如果,要是仿真,数码管的段控和位控是可以直接用单片机引脚的,不用锁存器,也不用驱动,真的可以做到不用74芯片,如下仿真图。但是,要是做实物,可以不用锁存器,但驱动必须用,不用74...

51单片机怎么使用内部EEPROM,上电次数、断电记忆,怎么实现计到最大...
STC 很多都有内部EEPROM,如11或12系列的STC单片机,读写内部EEPROM有一定限制,比如写,必须先擦除再写,而且一次必须擦除一个扇区,所以还是很麻烦的,只能覆盖。要实现你的功能,一点问题没有,上电后先读取上次的计数值,再加1重新写进去就可以了。以下是EEPROM读写子程序供参考:;--- ;读一字节...

51单片机如何用键盘储存重开机后不丢失的数据
如果是片内带有EEPROM的单片机会方便许多,也可以外挂存储器,输入数据后,通过一个确认键发指令,将数据存入EEPROM,开机后调出数据就可以吧。

51单片机怎么使用eeprom来时时存储数据,这个数据是电机的坐标值,时时...
用eeprom来时时存储数据,原则上可以做到,但是需要注意以下问题:某些器件的eeprom的寿命(以改写次数表示)有限。例如有的规定寿命为10万次。如此,你如果每秒钟改写一次,那么运行要不了一天多,寿命就到头了。所以,通常需要实时记录的数据,平时都是记录在RAM里的缓存中,只在关键时刻(例如掉电前)将...

相似回答