📄 ex10-3.c
字号:
#include "stc12c5a.h"
#include "intrins.h"
sbit Begin_Led = P1^2; //系统开始工作指示灯
unsigned char Is_Power_Down = 0; //判断是否进入掉电模式标志
sbit Is_Power_Down_Led_INT0 = P1^7; //掉电唤醒指示灯,在INT0中
sbit Not_Power_Down_Led_INT0 = P1^6; //不是掉电唤醒指示灯,在INT0中
sbit Is_Power_Down_Led_INT1 = P1^5; //掉电唤醒指示灯,在INT1中
sbit Not_Power_Down_Led_INT1 = P1^4; //不是掉电唤醒指示灯,在INT1中
sbit Power_Down_Wakeup_Pin_INT0 = P3^2; //掉电唤醒管脚,INT0
sbit Power_Down_Wakeup_Pin_INT1 = P3^3; //掉电唤醒管脚,INT1
sbit Normal_Work_Flashing_Led = P1^3; //系统处于正常工作状态指示灯
void Normal_Work_Flashing(void);
void INT_System_init(void);
void INT0_Routine(void);
void INT1_Routine(void);
void main(void)
{
unsigned char j=0;
unsigned char wakeup_counter = 0; //中断唤醒次数变量初始为0
Begin_Led = 0; //系统开始工作指示灯
INT_System_init(); //中断系统初始化
while(1)
{
P2 = ~wakeup_counter; //中断唤醒次数显示,先将wakeup_counter取反
wakeup_counter++; //中断唤醒次数显示
for(j=0;j<2;j++)
Normal_Work_Flashing(); //系统正常工作指示灯
Is_Power_Down = 1; //进入掉电模式之前,将其置为1,以供判断
PCON = 0x02; //执行完此句,单片机进入掉电模式,外部时钟停止振荡
_nop_();
//外部中断唤醒后,首先执行上句,然后才会进入中断服务程序
_nop_(); //建议多加几个空操作指令NOP,以便观察
_nop_(); //建议多加几个空操作指令NOP
}
}
void INT_System_init(void) //中断系统初始化
{
IT0 = 0; //外部中断0,低电平触发中断
EX0 = 1; //允许外部中断0 中断
IT1 = 1; //外部中断 1,下降沿触发中断
EX1 = 1; //允许外部中断1中断
EA = 1; //开总中断控制位
}
void INT0_Routine(void) interrupt 0 //外部中断0服务程序
{
if(Is_Power_Down) //判断掉电唤醒标志
{
Is_Power_Down = 0;
Is_Power_Down_Led_INT0 = 0; //点亮外部中断0掉电唤醒指示灯
while(Power_Down_Wakeup_Pin_INT0==0); //等待变高
Is_Power_Down_Led_INT0 = 1; //关闭外部中断0掉电唤醒指示灯
}
else
{
Not_Power_Down_Led_INT0 = 0; //点亮外部中断0正常工作中断指示灯
while(Power_Down_Wakeup_Pin_INT0==0); //等待变高
Not_Power_Down_Led_INT0 = 1; //关闭外部中断0正常工作中断指示灯
}
}
void INT1_Routine(void) interrupt 2 //外部中断1服务程序
{
if(Is_Power_Down) //判断掉电唤醒标志
{
Is_Power_Down = 0;
Is_Power_Down_Led_INT1 = 0; //点亮外部中断1掉电唤醒指示灯
while(Power_Down_Wakeup_Pin_INT1==0); //等待变高
Is_Power_Down_Led_INT1 = 1; //关闭外部中断1掉电唤醒指示灯
}
else
{
Not_Power_Down_Led_INT1 = 0; //点亮外部中断1正常工作中断指示灯
while(Power_Down_Wakeup_Pin_INT1==0); //等待变高
Not_Power_Down_Led_INT1 = 1; //关闭外部中断1正常工作中断指示灯
}
}
void delay(void)
{
unsigned int j,k;
for(k=0;k<2;++k)
{
for(j=0;j<=30000;++j)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void Normal_Work_Flashing(void)
{
Normal_Work_Flashing_Led = 0;
delay();
Normal_Work_Flashing_Led = 1;
delay();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -