为学习单片机掉电模式以及唤醒,编写了一个小程序,开关直接接在P3.3外中断1引脚,在开关断开时可以进入掉电模式并且唤醒,但是开关一直关闭情况下,缺怎么也进入不了,隔一段时间两个灯红-绿-红闪烁。麻烦各位大神看下到底怎么回事,谢谢!
#include "STC89C52.H"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
sbit R=P1^0; //红灯
sbit K=P3^3; //开关
sbit G=P0^3; //绿灯
u16 dscs;
void HX() interrupt 2 //外中断1唤醒单片机
{
PCON=0x00;
G=0; //进入中断后绿灯亮一下
ys1ms(200);
G=1;
}
void main() //主函数
{
dscs=0; //定时次数清零
IT1=1; //IT1下降沿触发
EX1=0; //INT1中断关闭
EA=1;
while(1)
{
dscs++;
if(K==0) //开关闭合
{
ys1ms(20);
if (K==0)
{
if (K==1) //开关断开,进入掉电状态
{
ys1ms(20);
if(K==1)
{
EX1=1; //开启INT1中断
EA=1;
_nop_();
_nop_();
PCON=0x02;
_nop_();
_nop_();
_nop_();
_nop_();
dscs=0;
EX1=0;
}
}
if (K==0 && dscs>=300 ) //开关闭合,一段时间后进入掉电状态
{
EX1 = 1; //开启INT1中断
R=0;
ys1ms(200);
R=1; //红灯亮一下
_nop_();
_nop_();
_nop_();
_nop_();
PCON=0x02; //进入掉电状态
_nop_();
_nop_();
_nop_();
_nop_();
dscs=0;
EX1=0;
R=0; //红灯亮一下
ys1ms(200);
R=1;
}
}
}
if (K==1 || dscs>=600 ) //开关闭合或者等待一段时间后进入掉电状态
{
EX1 = 1; //开启INT1中断
R=0; //红灯亮一下
ys1ms(200);
R=1;
_nop_();
_nop_();
_nop_();
_nop_();
PCON=0x02; //进入掉电状态
_nop_();
_nop_();
_nop_();
_nop_();
dscs=0; //dscs清零
EX1=0;
R=0; //红灯亮一下
ys1ms(200);
R=1;
}
}
} |