|
最近有空剛學習掉電喚醒這一塊,用遙控器能讓單片機進入掉電模式,此時能控制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重裝值
}
}
}
|
|