本帖最后由 y18370990546 于 2019-3-2 18:38 编辑
最近,在做低功耗的项目,用到了单片机sleep休眠,唤醒方式采用按键,电平变化触发。晶振采用内部4M
采用3节7号南孚电池大概是4.8V供电
出现问题:长时间休眠之后,按键触发无法唤醒,需重新上电,休眠能被按键唤醒才可以。(目前猜测是用电过大,导致电池没电造成)
程序如下:
void init()
{
OSCCONbits.SCS = 0x2; //选择内部4M晶振
OSCCONbits.IRCF = 0xd;
OSCCON = 0b11101010;
TRISD = 0;
TRISC = 0;
TRISB = 0b00111011; //RB0,RB1,RB3,RB4,RB5输入
ANSELB = 0;
ANSELD = 0;
PORTB = 0;
LATB = 1;
LATD = 0;
LATC = 0;
}
void main()
{
init(); //相应I0口配置
OPTION_REG |= 0b0000000; //INT选择上升沿触发唤醒休眠
IOCBP = 0x1; //电平上升沿触发
IOCBN = 0x0;
INTCON |= 0b11000000; //全局中断GIE,外围PIE1使能
INTCONbits.IOCIE = 1; //电平变化中断使能
SLEEP(); //休眠
NOP(); //空
while(INT_value == 1) //中断唤醒
{........}
}
void interrupt ISR (void)
{
if(INTCONbits.IOCIF && PORTBbits.RB0 == 1) //开关机键外部中断唤醒单片机,
{
if(PORTBbits.RB0==1)//开机键按下
{
__delay_ms(50);
if(PORTBbits.RB0==1)//再次判断
{
INTCONbits.IOCIF=0;
INT_value++; //外部中断变量++
INT_value=(INT_value==1)? 1:0; //通过INT_value变量控制while()循环,开关机
}
}
}
求教各位!!!帮忙解惑答疑。 |