小白请教,AI8051U试验箱例程里边:07-主时钟停振低功耗模式-外部中断INT0-INT4唤醒这个,使用 PD = 1; 进入低功耗模式后,可以用外部中断INT0唤醒
- /********************* INT0中断函数 *************************/
- void INT0_int (void) interrupt 0 //进中断时已经清除标志
- {
- EX0 = 0; //INT0 Disable
- }
复制代码
有两个疑问想请教一下大神,
1.具体如何唤醒的,是不是只要前边EX0 = 1了,即使掉电,只要 有外部中断就能唤醒?
2.INT0中断函数中, EX0 = 0; //INT0 Disable这一段,为啥要给置零了,我测试把 EX0 = 0; //INT0 Disable这段屏蔽了编译依然能正常外部唤醒?
- /*---------------------------------------------------------------------*/
- /* --- Web: www.STCAI.com ---------------------------------------------*/
- /*---------------------------------------------------------------------*/
-
- /************* 功能说明 **************
-
- 本例程基于AI8051U为主控芯片的实验箱进行编写测试。
-
- 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
-
- edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
-
- 显示效果为: 上电后跑马灯显示2秒, 然后进入睡眠模式.
-
- 按板上的INT0、INT1按键唤醒, 继续显示2秒后再进入睡眠模式.
-
- 如果按键一直按着(INT0/INT1为低电平), 则MCU不睡眠, 直到INT0/INT1为高电平为止.
-
- INT2, INT3, INT4 实验板上没有引出测试按键,供需要时参考使用.
-
- 下载时, 选择时钟 24MHZ (用户可自行修改频率).
-
- ******************************************/
-
- #include "..\..\comm\AI8051U.h"
- #include "stdio.h"
- #include "intrins.h"
-
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
-
- //==========================================================================
-
- sbit INT1 = P3^3;
- sbit INT0 = P3^2;
-
- //==========================================================================
-
- #define MAIN_Fosc 24000000UL
-
- /************* 本地常量声明 **************/
-
- u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
-
- /************* 本地变量声明 **************/
-
- u8 ledIndex;
- u16 msecond; //1000ms计数
-
- /************* 本地函数声明 **************/
-
- void delay_ms(u8 ms);
-
- /**************** 外部函数声明和外部变量声明 *****************/
-
-
- /******************** 主函数 **************************/
- void main(void)
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
- P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
- P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
- P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
- P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
- P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
- P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
- P40 = 0; //LED Power On
- EA = 1; //允许总中断
-
- while(1)
- {
- delay_ms(100); //延时100ms
- //跑马灯指示工作状态
- P2 = ~ledNum[ledIndex]; //输出低驱动
- ledIndex++;
- if(ledIndex > 7)
- {
- ledIndex = 0;
- }
-
- //2秒后MCU进入休眠状态
- if(++msecond >= 20)
- {
- msecond = 0; //清计数
-
- if(INT0 && INT1) //两个中断都是高电平时才进入睡眠,下降沿唤醒。
- {
- P2 = 0xff; //先关闭显示,省电
-
- IE0 = 0; //外中断0标志位
- IE1 = 0; //外中断1标志位
- EX0 = 1; //INT0 Enable
- EX1 = 1; //INT1 Enable
-
- IT0 = 1; //INT0 下降沿中断
- // IT0 = 0; //INT0 上升,下降沿中断
- IT1 = 1; //INT1 下降沿中断
- // IT1 = 0; //INT1 上升,下降沿中断
-
- // EX2 = 1; //使能 INT2 下降沿中断
- // EX3 = 1; //使能 INT3 下降沿中断
- // EX4 = 1; //使能 INT4 下降沿中断
-
- PD = 1; //Sleep
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- }
-
- //========================================================================
- // 函数: void delay_ms(unsigned char ms)
- // 描述: 延时函数。
- // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 备注:
- //========================================================================
- void delay_ms(u8 ms)
- {
- u16 i;
- do{
- i = MAIN_Fosc / 6000;
- while(--i);
- }while(--ms);
- }
-
- /********************* INT0中断函数 *************************/
- void INT0_int (void) interrupt 0 //进中断时已经清除标志
- {
- EX0 = 0; //INT0 Disable
- }
-
- /********************* INT1中断函数 *************************/
- void INT1_int (void) interrupt 2 //进中断时已经清除标志
- {
- EX1 = 0; //INT1 Disable
- }
-
- /********************* INT2中断函数 *************************/
- void INT2_int (void) interrupt 10 //进中断时已经清除标志
- {
- EX2 = 0; //INT2 Disable
- }
-
- /********************* INT3中断函数 *************************/
- void INT3_int (void) interrupt 11 //进中断时已经清除标志
- {
- EX3 = 0; //INT3 Disable
- }
-
- /********************* INT4中断函数 *************************/
- void INT4_int (void) interrupt 16 //进中断时已经清除标志
- {
- EX4 = 0; //INT4 Disable
- }
复制代码
|