最近有空刚学习掉电唤醒这一块,用遥控器能让单片机进入掉电模式,此时能控制P54脚输出的PWM停止不输出,但P54脚有时为高电平,有时也为低电平。P32脚(P32脚接接收头IR)在进入掉电模式时,立马为低电平,此时P32脚用导线触碰一下高电平(3—5V),可以唤醒单片机,但是再按遥控器不能进入掉电模式,关掉电源再打开,才能用遥控器能让单片机进入掉电模式。代码中这种用遥控器控制掉电唤醒的方法是不是行不通,因为只要P32在进入掉电模式时,立马为低电平,这时按遥控器,用示波器测此脚波形,一点反应都没有。有什么其它的好办法能用遥控器控制掉电唤醒?代码如下:
单片机源程序如下:
#include "STC8xxxx.H"
#include "pwm.h"
#include "38KHZ.h"
#include "IR.h"
#define IDL 0x01 //PCON.0 IDLE(空闲)模式控制位
#define PD 0x02 //PCON.1 时钟停振模式/掉电模式/停电模式 控制位
//sfr INTCLKO = 0x8f;
//#define EX2 0x10
//#define EX3 0x20
//#define EX4 0x40
void IR_RX_NEC(void);
void INT1_Isr() interrupt 0
{
P32 = !P32; //测试端口
}
void main(void)
{
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
pwm_int() ;
hwKHZ_int();
//exint1Init();
AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
cnt_1ms = SysTick / 1000;
EA = 1; //打开总中断
while(1)
{
if(B_1ms) //1ms到
{
B_1ms = 0;
if(B_IR_Press) //有IR键按下
{
switch(IR_code)
{
case 0x45:
EX0 = 1; //使能INT0中断,用于唤醒MCU
EA = 1;
_nop_();
_nop_();
_nop_();
_nop_();
// PCON = IDL; //MCU进入IDLE模式
PCON = PD; //MCU进入掉电模式
_nop_();
_nop_();
_nop_();
_nop_();
break;
case 0x46:
IT0 = 1; //使能INT1上升沿和下降沿中断
// IT1 = 1; //使能INT1下降沿中断
EX0 = 1; //使能INT1中断
EA = 1;
PCON = 0x02; //MCU进入掉电模式
_nop_(); //掉电模式被唤醒后,MCU首先会执行此语句
//然后再进入中断服务程序
_nop_();
_nop_();
_nop_();
break;
}
B_IR_Press = 0; //清除IR键按下标志
}
}
if (P3^2==0)
{
pwm = PWM_DUTY *4.4/ 10; //给PWM一个初值,这里为44%占空比
LoadPWM(pwm);
}
else
{
pwm = PWM_DUTY *8.3/ 10; //给PWM一个初值,这里为83%占空比
LoadPWM(pwm); //计算PWM重装值
}
}
}
|