微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教51单片机内部EEPROM的应用。

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

时间:10-02 整理:3721RD 点击:
把数据存储于内部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++);
}


//---------------------------------------------------------------------------------
//Nameelay();
//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

写入的速度很快的,如果不明显的话,可以忽略

这个好像无法解决,闪烁是正常的,如果你不想闪,用24C02之类。

是不是写入时间过长导致数码管没有及时刷新?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top