找回密码
 立即注册
查看: 236|回复: 5

AI8051U主时钟停振低功耗模式-外部中断INT0唤醒咨询

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-3 17:14:10 | 显示全部楼层 |阅读模式
小白请教,AI8051U试验箱例程里边:07-主时钟停振低功耗模式-外部中断INT0-INT4唤醒这个,使用  PD = 1;    进入低功耗模式后,可以用外部中断INT0唤醒

  1. /********************* INT0中断函数 *************************/
  2. void INT0_int (void) interrupt 0      //进中断时已经清除标志
  3. {
  4.     EX0 = 0;    //INT0 Disable
  5. }
复制代码


有两个疑问想请教一下大神,
1.具体如何唤醒的,是不是只要前边EX0 = 1了,即使掉电,只要 有外部中断就能唤醒?
2.INT0中断函数中,  EX0 = 0;    //INT0 Disable这一段,为啥要给置零了,我测试把  EX0 = 0;    //INT0 Disable这段屏蔽了编译依然能正常外部唤醒?
  1. /*---------------------------------------------------------------------*/
  2. /* --- Web: www.STCAI.com ---------------------------------------------*/
  3. /*---------------------------------------------------------------------*/
  4. /*************  功能说明    **************
  5. 本例程基于AI8051U为主控芯片的实验箱进行编写测试。
  6. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
  7. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
  8. 显示效果为: 上电后跑马灯显示2秒, 然后进入睡眠模式.
  9. 按板上的INT0、INT1按键唤醒, 继续显示2秒后再进入睡眠模式.
  10. 如果按键一直按着(INT0/INT1为低电平), 则MCU不睡眠, 直到INT0/INT1为高电平为止.
  11. INT2, INT3, INT4 实验板上没有引出测试按键,供需要时参考使用.
  12. 下载时, 选择时钟 24MHZ (用户可自行修改频率).
  13. ******************************************/
  14. #include "..\..\comm\AI8051U.h"
  15. #include "stdio.h"
  16. #include "intrins.h"
  17. typedef         unsigned char        u8;
  18. typedef         unsigned int        u16;
  19. typedef         unsigned long        u32;
  20. //==========================================================================
  21.   sbit INT1     = P3^3;
  22.   sbit INT0     = P3^2;
  23. //==========================================================================
  24. #define MAIN_Fosc       24000000UL
  25. /*************  本地常量声明    **************/
  26. u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  27. /*************  本地变量声明    **************/
  28. u8 ledIndex;
  29. u16 msecond;        //1000ms计数
  30. /*************  本地函数声明    **************/
  31. void delay_ms(u8 ms);
  32. /****************  外部函数声明和外部变量声明 *****************/
  33. /******************** 主函数 **************************/
  34. void main(void)
  35. {
  36.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  37.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  38.     CKCON = 0; //提高访问XRAM速度
  39.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  40.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  41.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  42.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  43.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  44.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  45.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  46.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  47.     P40 = 0;    //LED Power On
  48.     EA = 1;     //允许总中断
  49.     while(1)
  50.     {
  51.         delay_ms(100);      //延时100ms
  52.         //跑马灯指示工作状态
  53.         P2 = ~ledNum[ledIndex];    //输出低驱动
  54.         ledIndex++;
  55.         if(ledIndex > 7)
  56.         {
  57.             ledIndex = 0;
  58.         }
  59.         //2秒后MCU进入休眠状态
  60.         if(++msecond >= 20)
  61.         {
  62.             msecond = 0;        //清计数
  63.             if(INT0 && INT1)    //两个中断都是高电平时才进入睡眠,下降沿唤醒。
  64.             {
  65.                 P2 = 0xff;      //先关闭显示,省电
  66.                 IE0  = 0;       //外中断0标志位
  67.                 IE1  = 0;       //外中断1标志位
  68.                 EX0 = 1;        //INT0 Enable
  69.                 EX1 = 1;        //INT1 Enable
  70.                 IT0 = 1;        //INT0 下降沿中断      
  71.             //  IT0 = 0;        //INT0 上升,下降沿中断  
  72.                 IT1 = 1;        //INT1 下降沿中断      
  73.             //  IT1 = 0;        //INT1 上升,下降沿中断  
  74.             //  EX2 = 1;        //使能 INT2 下降沿中断
  75.             //  EX3 = 1;        //使能 INT3 下降沿中断
  76.             //  EX4 = 1;        //使能 INT4 下降沿中断
  77.                                 
  78.                 PD = 1;         //Sleep
  79.                 _nop_();
  80.                 _nop_();
  81.                 _nop_();
  82.                 _nop_();
  83.                 _nop_();
  84.                 _nop_();
  85.                 _nop_();
  86.             }
  87.         }
  88.     }
  89. }
  90. //========================================================================
  91. // 函数: void delay_ms(unsigned char ms)
  92. // 描述: 延时函数。
  93. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  94. // 返回: none.
  95. // 版本: VER1.0
  96. // 日期: 2013-4-1
  97. // 备注:
  98. //========================================================================
  99. void delay_ms(u8 ms)
  100. {
  101.     u16 i;
  102.     do{
  103.         i = MAIN_Fosc / 6000;
  104.         while(--i);
  105.     }while(--ms);
  106. }
  107. /********************* INT0中断函数 *************************/
  108. void INT0_int (void) interrupt 0      //进中断时已经清除标志
  109. {
  110.     EX0 = 0;    //INT0 Disable
  111. }
  112. /********************* INT1中断函数 *************************/
  113. void INT1_int (void) interrupt 2      //进中断时已经清除标志
  114. {
  115.     EX1 = 0;    //INT1 Disable
  116. }
  117. /********************* INT2中断函数 *************************/
  118. void INT2_int (void) interrupt 10     //进中断时已经清除标志
  119. {
  120.     EX2 = 0;    //INT2 Disable
  121. }
  122. /********************* INT3中断函数 *************************/
  123. void INT3_int (void) interrupt 11     //进中断时已经清除标志
  124. {
  125.     EX3 = 0;    //INT3 Disable
  126. }
  127. /********************* INT4中断函数 *************************/
  128. void INT4_int (void) interrupt 16     //进中断时已经清除标志
  129. {
  130.     EX4 = 0;    //INT4 Disable
  131. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-4 22:28:58 | 显示全部楼层
为啥我这个帖子在最近发表里边没有出现呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2025-1-4 23:56:47 来自手机 | 显示全部楼层
我是it0=1 ex0=1就能换醒了
唤醒了想干嘛就过中断那里
或者唤醒了跟着nop后面执行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-1-5 10:44:12 | 显示全部楼层
唤醒是依靠中断唤醒的,只要能进入中断就可以唤醒。
至于你说的不影响问题,是因为你每次进入省电的时候都重新打开了中断。
中断里面这一句只是为了防止重复唤醒造成问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-5 21:18:50 | 显示全部楼层
王*** 发表于 2025-1-5 10:44
唤醒是依靠中断唤醒的,只要能进入中断就可以唤醒。
至于你说的不影响问题,是因为你每次进入省电的时候都 ...

感谢解答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-5 21:19:35 | 显示全部楼层
vb2*** 发表于 2025-1-4 23:56
我是it0=1 ex0=1就能换醒了
唤醒了想干嘛就过中断那里
或者唤醒了跟着nop后面执行 ...

好的,谢谢啦
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:24 , Processed in 0.134925 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表