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

可以AI8051支持三种不同的引脚输入:P4.6 ,P5.0 ,P5.1。
二:寄存器1介绍:
比较器控制寄存器1(CMPCR1)

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)

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)个系统时钟

四:软件代码如下所示:
/******************* 比较器中断函数 ********************/
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);
}
}
}
}
我要赚赏金
