这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:14AI8051的比较器方式实现掉电保护

共2条 1/1 1 跳转至

学习AI8051开发板例程:14AI8051的比较器方式实现掉电保护

高工
2025-12-09 08:32:10     打赏

一:使用比较器器的方式检测掉电功能:

14-1.png

可以AI8051支持三种不同的引脚输入:P4.6 ,P5.0 ,P5.1。

二:寄存器1介绍:

比较器控制寄存器1(CMPCR1)

14-2.png

CMPEN:比较器模块使能位

0:关闭比较功能

1:使能比较功能

CMPIE:比较器中断标志位。当 P正 或NI 被使能后,若产生相应的中断信号,硬件自动将 CMPIE 置 1,并向 CPU 提出中断请求。此标志位必须用户软件清零。PIE:比较器上升沿中断使能位。

0:禁止比较器上升沿中断。

1:使能比较器上升沿中断。使能比较器的比较结果由0变成1时产生中断请求。

NIE:比较器下降沿中断使能位。

0:禁止比较器下降沿中断。

1:使能比较器下降沿中断。使能比较器的比较结果由1变成0时产生中断请求。CMPOE:比较器结果输出控制位

0:禁止比较器结果输出

1:使能比较器结果输出。比较器结果输出到P4.5或者P4.1(由P SW2中的 CMPO S进行设定)CMPRES:比较器的比较结果。此位为只读。

0:表示CMP+的电平低于 CMP-的电平

1:表示CMP+的电平高于CMP-的电平

CMPRES 是经过数字滤波后的输出信号,而不是比较器的直接输出结果。

三:比较器控制寄存器2(CMPCR2)

14-3.png

INVCMPO:比较器结果输出控制0:比较器结果正向输出。若 CMPRES 为0,则P3.5/P4.1输出低电平,反之输出高电平。1:比较器结果反向输出。若 CMPRES 为 0,则 P3.5/P4.1输出高电平,反之输出低电平。DISFLT:模拟滤波功能控制

0:使能 0.1us 模拟滤波功能

1:关闭 0.1us 模拟滤波功能,,可略微提高比较器的比较速度。LCDTY[5:0]:数字滤波功能控制

数字滤波功能即为数字信号去抖动功能。当比较结果发生上升沿或者下降沿变化时,比较器侦测变化后的信号必须维持 LCDTY 所设置的 CPU 时钟数不发生变化,才认为数据变化是有效的;否则将视同信号无变化。注意:当使能数字滤波功能后,芯片内部实际的等待时钟需额外增加两个状态机切换时间,即若LCDTY 设置为0时,为关闭数字滤波功能;若LCDTY 设置为非0值n(n=1~63)时,则实际的数字滤波时间为(n+2)个系统时钟

14-4.png

四:软件代码如下所示:

/******************* 比较器中断函数 ********************/
void CMP_Isr() interrupt 21
{
    u8  i;

    CMPIF = 0;          //清中断标志
    P42 = CMPRES;       //中断方式读取比较器比较结果
    
    if(CMPRES)
    {
        if(LowVolFlag)
        {
            LowVolFlag = 0;    //清除低电压标志
            if(Test_cnt != Temp_cnt)
            {
                EEPROM_read_n(EE_ADDRESS,tmp,2);        //读出2字节
                Test_cnt = ((u16)tmp[0] << 8) + tmp[1]; //秒计数
                if(Test_cnt > 10000)    Test_cnt = 0;   //秒计数范围为0~10000
                Temp_cnt = Test_cnt;
            }
        }
    }
    else
    {
        P_HC595_SER = 0;
        for(i=0; i<16; i++)     //先关闭显示,省电
        {
            P_HC595_SRCLK = 1;
            P_HC595_SRCLK = 0;
        }
        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;       //锁存输出数据

        if(!LowVolFlag)
        {
            LowVolFlag = 1;    //设置低电压标志
            if(Test_cnt != Temp_cnt)
            {
                Temp_cnt = Test_cnt;
                EEPROM_SectorErase(EE_ADDRESS); //擦除扇区
                tmp[0] = (u8)(Temp_cnt >> 8);
                tmp[1] = (u8)Temp_cnt;
                EEPROM_write_n(EE_ADDRESS,tmp,2);
            }
        }
    }
}





关键词: AI8051     比较器         

专家
2025-12-09 15:30:11     打赏
2楼

AI8051的功能挺全乎的。好用!


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]