小明同学0706 发表于 2025-7-24 11:26:01

关于EEPROM

#include "all.h"
uint haomiao_flga=0;
bit jdq_flga=0;
uint TADA=0;
uchar xdata gaowei=0;
uchar xdata diwei=0;
#define LVDF    0x20                //PCON.5,低压检测中断标志位
bit IAP_flga=0;
static uchar dingshiqikaiqibiao=0;
uint t_data=0;//秒钟数据
//volatile uchar anjiangzhuantai_flag=0;//按键状态标志
void Timer1_Isr(void) interrupt 3//定时器1灯闪烁运行程序
{
                t_data++;//秒钟数据++
        if(t_data>500)
        {
                P02=~P02;
                t_data=0;
                haomiao_flga++;
                if(haomiao_flga>59)
                {
                        haomiao_flga=0;
                        aa++;
                        TADA++;
                }
        }
}
void Timer1_Init(void)                //1毫秒@11.0592MHz//定时器1中断函数初始化函数
{
        AUXR |= 0x40;                        //定时器时钟1T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0xCD;                                //设置定时初始值
        TH1 = 0xD4;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
}
void LVD_ISR() interrupt 6//单片机低压中断函数
{
PCON &= ~LVDF;
//        TADA=4567;
        IAP_flga=1;
       
}
//当按键时间按下时间大于2000ms时则当前时间则清零,否则视为无效信号
void qinglingdangqianshijian()//控制当前当前显示时间清零
{
        static uint dangqianyanshi=0;
        if(P20==0)
        {
                                dangqianyanshi++;
                if(dangqianyanshi>2000)//
                {
                                dangqianyanshi=0;
                                aa=0;
                                time=0;
                                P03=0;
                                P04=0;
                                t_data=0;
                                jdq_flga=0;
                }       
        }
        else
        {
                        dangqianyanshi=0;
        }
}
void panduanshezhiyudangqianshuju()//判断两者的数值是否相等, 若相等则停止定时器, 继电器吸合
{
        if(((time*100)+aa)==TADA)
{
        P02=1;
        if(jdq_flga==0)
        {
                P03=1;
                P04=1;
        }
                ET1 = 0;                                //使能定时器0中断
        jdq_flga=1;
}
        else
        {
                ET1 = 1;                                //使能定时器0中断
        }
}
void TADA_fenpeihanshu()//将DATA分别赋值
{
        static xdata gaowei=0;
        static xdata diwei=0;
                gaowei=TADA/100;
                diwei=TADA%100;
}




void main()
{
    P0M0 = 0x0C; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
                P02=0;
                Timer1_Init();
                EA=1;
                P04=0;
          PCON &= ~LVDF;                  //??????LVD?????
    ELVD = 1;
                P03=0;
    IapErase(0x0400);
                IapProgram(0x0400, TADA);
          TADA=IapRead(0x0400);       
       
//                time=IapReadByte(0x2000); //读取EEPROM2000地址数据   
//                aa=IapReadByte(0x2001); //读取EEPROM2001地址数据   
//                gaowei=IapReadByte(0x2002); //读取EEPROM2002地址数据   
//                diwei=IapReadByte(0x2003); //EEPROM2003地址数据   
                while (1)
                {
                       
               
                TADA_fenpeihanshu();
               
        if(P23==0)//开启定时器       
        {
                                dingshiqikaiqibiao++;//定时器开启静态变量
                if(dingshiqikaiqibiao>100)
                {
                dingshiqikaiqibiao=0;
                        TR1 = 1;                                //定时器1开始计时
          ET1 = 1;                                //使能定时器1中断
               }
        }
        display4();
                       
    if(P23==1)//关闭定时器
        {
                dingshiqikaiqibiao++;
                if(dingshiqikaiqibiao>100)
                {
                        dingshiqikaiqibiao=0;
                                        TR1 = 0;                                //定时器1t计时
              ET1 = 0;                                //使能定时器1中断
                                P02=1;
                }       
        }
       
                        if(aa>59)
                        {
                                        aa=0;
                                        time++;
                                if(time>99)
                                {
                                time=0;
                                }
                        }
                                display();
                                qinglingdangqianshijian();
                       panduanshezhiyudangqianshuju();
                }

}
               IapErase(0x0400);操作都是官方的案例 , 我把IapProgram(0x0400, TADA);这个放到低压中断函数中去,上电就显示65536, 感觉是没写进去, 但单片机工作电源部分已经加了一个3000uf大电容,且输入电源与单片机工作电源接入了5819二极管,但放到主函数里面去就是正常的

DebugLab 发表于 2025-7-24 12:04:42

用比较器判断二极管之前的电压
低压中断时电压已经下降了
不建议在低电压下操作EEPROM
页: [1]
查看完整版本: 关于EEPROM