打印

请教51单片机内部EEPROM的应用。

[复制链接]
8275|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Super_|  楼主 | 2012-11-16 12:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
把数据存储于内部EEPROM中,数码管动态显示。

问题是每当数据写入内部EEPROM中时,数码管就闪烁一下!

请问大家有遇到过同样的问题吗!?大家是如何解决的呢!?

以上,谢谢。

贴上部分代码:
//---------------------------------------------------------------------------------
#include <stc89c5x.H>
#include <Intrins.H>
//---------------------------------------------------------------------------------

#define  ENABLE_IAP     0x83          //<12MHz        
uchar Byte_Read(uchar,uchar);
void Byte_Program(uchar,uchar,uchar);
void Sector_Erase(uchar,uchar);
void IAP_Disable();
void  Trigger_IAP();

//-----------Byte_Read----------------------------
uchar Byte_Read(uchar addr1_h,uchar addr1_l)
{
        uchar date;
        IAP_CONTR = ENABLE_IAP ;               //open IAP   set Flash operation time
        IAP_CMD   = 0x01;                                          //Select Read AP Mode
        IAP_ADDRH = addr1_h;
        IAP_ADDRL = addr1_l;
        Trigger_IAP();
        date      =IAP_DATA;
        IAP_Disable();                        //关闭IAP功能,清与IAP有关的SFR
        return   date;

}

//------Byte_Program-------------
void Byte_Program(uchar addr2_h,uchar addr2_l,uchar date1)
{
        IAP_CONTR = ENABLE_IAP ;               //open IAP   set Flash operation time
        IAP_CMD   = 0x02;                                                   //        Select Read AP Mode
        IAP_ADDRH = addr2_h;
        IAP_ADDRL = addr2_l;
        IAP_DATA  = date1;
        Trigger_IAP();
        IAP_Disable();                        //关闭IAP功能,清与IAP有关的SFR
}

//--------------Sector_Erase--------------
void Sector_Erase(uchar addr3_h,uchar addr3_l)
{
        IAP_CONTR = ENABLE_IAP ;               //open IAP   set Flash operation time
        IAP_CMD   = 0x03;                                                   //        Select Read AP Mode
        IAP_ADDRH = addr3_h;
        IAP_ADDRL = addr3_l;
        Trigger_IAP();
        IAP_Disable();                        //关闭IAP功能,清与IAP有关的SFR
}

//--------IAP_Disable-----------
void IAP_Disable()
{
        IAP_CONTR = 0;
        IAP_CMD   = 0;
        IAP_TRIG  = 0;

}
//--------Trigger IAP processing------
void  Trigger_IAP()
{
        uchar    i;
        IAP_TRIG  = 0x5A;
        IAP_TRIG  = 0xA5;
        for(i=0;i<10;i++);
}





//---------------------------------------------------------------------------------
//Name:Delay();
//Function:Software delay function
//Input:
//Output:
//---------------------------------------------------------------------------------
void Delay(uchar t) //延時程序,延時時間2ms*t
{
        t_2ms=0;
        while(t_2ms<t);
}

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

//Name:Main
//Function:
//Input:
//Output:
//---------------------------------------------------------------------------------
void Main(void)
{
        //-------------------------------------------
        TMOD        = 0x11;                        //T1 setting
        TL0                = INTERVAL_T0_L        ;        //10ms//加載定時計數值
        TH0                = INTERVAL_T0_H        ;
        TL1                = INTERVAL_T1_L        ;        //2ms//加載定時計數值
        TH1                = INTERVAL_T1_H        ;
        TR0                = ON;
        TR1                = ON;                        
        ET0                = ENABLE;
        ET1                = ENABLE;
        EA                = ENABLE;
        set_minute=Byte_Read(0x00,0x00);//讀EEPROM
        set_second=Byte_Read(0x00,0x01);//讀EEPROM
        second=set_second;minute=set_minute;
        start_flag=0;


        //=====================================================
        while(1)
        {
                Key_scan();
                Output_ctl();
        }
}

//---------------------------------------------------------------------------------
//Name:Timer1
//Function:
//Input:
//Output:
//---------------------------------------------------------------------------------
void Timer1(void) interrupt 3 using 1        //2ms
{
        TL1                = INTERVAL_T1_L        ;        //2ms
        TH1                = INTERVAL_T1_H        ;
        t_2ms++;dis_ms++;
        display();
}

//-----------------------------------------------------------------------------------------------------------
//end
评论
山东电子小菜鸟 2018-1-26 10:24 回复TA
学习下 

相关帖子

沙发
lovezjf234| | 2012-11-16 13:00 | 只看该作者
写入的速度很快的,如果不明显的话,可以忽略

使用特权

评论回复
板凳
zf_015820| | 2012-11-16 13:28 | 只看该作者
应该是写入时,给数码管的控制信号被干扰了

使用特权

评论回复
地板
followme001| | 2012-11-16 16:38 | 只看该作者
这个好像无法解决,闪烁是正常的,如果你不想闪,用24C02之类。

使用特权

评论回复
5
zhhbncwu| | 2012-11-16 23:03 | 只看该作者
是不是写入时间过长导致数码管没有及时刷新?

使用特权

评论回复
6
Super_|  楼主 | 2012-11-17 08:51 | 只看该作者
3# zf_015820
是阿 写入的时候需要关中断。

使用特权

评论回复
7
Super_|  楼主 | 2012-11-17 08:52 | 只看该作者
5# zhhbncwu

现在的问题变为 写入时间与数码管显示时间怎么调整。是按键按下去的时候就写入还是松开后写入。

使用特权

评论回复
8
gx_huang| | 2012-11-17 11:21 | 只看该作者
有些芯片内部的所谓EEPROM,其实就是FLASH,擦除和写入时,必须关闭中断,如果时间长,导致显示闪烁。建议分批操作,不要连续写入太多单元。或者挑选一个合适的时间写入。

使用特权

评论回复
9
NE5532| | 2012-11-17 12:34 | 只看该作者
这个很明显是利用IAP接口把Flash当E2在用,写入数据较多的时候,顾不上刷屏,当然闪咯。如果IAP接口支持单字节写,就打散了做,不然就索性黑屏,写完了在显示。

使用特权

评论回复
10
chengyy| | 2012-11-19 11:19 | 只看该作者
不管是at24c02还是自带的EEPROM,在读参数或写参数的时候都会对数码管有闪烁影响,因为读写这个过程毕竟也需要时间,只有在主函数里进行读写都这样,可以解决的办法是:用中断函数去调用读写操作,编译可以通过,但keil会有警告。

使用特权

评论回复
11
anazel| | 2012-11-19 11:33 | 只看该作者
读数据很快,写会需要些时间,可以先黑屏处理,写完了再显示

使用特权

评论回复
12
mohanwei| | 2012-11-19 11:40 | 只看该作者
定时中断里刷新显示;主循环处理其他

使用特权

评论回复
13
autopccopy| | 2012-11-19 13:27 | 只看该作者
写入占用了刷新的时间,可分批写入试试。

使用特权

评论回复
14
gx_huang| | 2012-11-19 18:29 | 只看该作者
LS几位不了解某些MCU的写入流程,写入时,必须关闭中断,只要写入时间大于刷新时间,闪烁就难免了,所以减少写入时间才是关键。

使用特权

评论回复
15
Super_|  楼主 | 2012-11-19 19:21 | 只看该作者
本帖最后由 Super_ 于 2012-11-19 19:26 编辑

谢谢LS各位的回复和解答。
我用的是STC的单片机,他的DATASHEET说明写入数据首先要擦除整个扇区才可。而擦除整个扇区的时间大概为20ms,和扫描时间冲突了。有想过在写入的时候暗下数码管,但是要求是不能有闪烁出现的。呵呵。
所以目前先用外部ROM来用。

使用特权

评论回复
16
Super_|  楼主 | 2012-11-19 19:34 | 只看该作者
我总结下了大家的解决方案:
1、直接使用外部ROM来替代内部ROM。(这个可行的,但是要求是使用内部EEPROM来用)
2、先黑屏处理,写完了再显示。(这个也是可行,但要求是不能闪烁出现,如果人为的黑屏或许能通过)
3、写入放在中断里。中断里面调用读写函数。(时序是大问题吧,如何调整中断是先显示,还是先读写,毕竟读写的时间较长)
4、分批次写入,写入的时候也是需要擦除的说。
以上总结,若有错误之处希望大家指正哈。

使用特权

评论回复
17
Super_|  楼主 | 2012-11-19 19:35 | 只看该作者
14# gx_huang :handshake

使用特权

评论回复
18
Super_|  楼主 | 2012-11-19 20:42 | 只看该作者

使用特权

评论回复
19
lgplgplgp| | 2012-11-20 14:33 | 只看该作者
。。。顶

使用特权

评论回复
20
阿毅1977| | 2012-11-21 10:46 | 只看该作者
如果成本可以接受的话,加个数码缓冲吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

129

帖子

1

粉丝