找回密码
 立即注册
查看: 52|回复: 1

关于EEPROM

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-24 11:26:01
已绑定手机

3

主题

1

回帖

33

积分

新手上路

积分
33
发表于 7 天前 | 显示全部楼层 |阅读模式
#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二极管,但放到主函数里面去就是正常的

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 7 天前 | 显示全部楼层
用比较器判断二极管之前的电压
低压中断时电压已经下降了
不建议在低电压下操作EEPROM
DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-31 23:02 , Processed in 0.107493 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表