找回密码
 立即注册
查看: 285|回复: 6

请问:AI8051U在主循环中执行掉电指令,唤醒后执行程序怎样才能不跳出主循环

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-1-26 12:13:49 | 显示全部楼层 |阅读模式
根据官网例程改编的部分相关实验代码如下:
  1. /******************** 主函数 **************************/
  2. void main(void)
  3. {
  4.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  5.     P_SW2 |= EAXFR; //扩展寄存器(XFR)访问使能
  6.     CKCON = 0; //提高访问XRAM速度
  7.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  8.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  9.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  10.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  11.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  12.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  13.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  14.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  15.     P40 = 0;    //LED Power On
  16. INT0=1;
  17. INT1=1;
  18. IT0 = 1;
  19. IT1 = 1;
  20. EX0 = 1;
  21. EX1 = 1;
  22. EA = 1;     //允许总中断
  23. t=1;//bit标志
  24. P2 =0x00;//全部电亮
  25. delay_ms(500);
  26.     while(1)
  27.     {
  28. P2=0x55;//间隔点亮
  29. delay_ms(500);
  30. if(t)
  31. {
  32. t=0;
  33. for(ledIndex=0;ledIndex<8;ledIndex++)
  34. {
  35. delay_ms(100);      //延时100ms
  36. //跑马灯指示工作状态
  37. P2 = ~ledNum[ledIndex];    //输出低驱动
  38. }
  39. }
  40. PCON =0x02;//在此休眠,按键触发P3.2或P3.3中断唤醒休眠
  41. NOP10();
复制代码
一、上述代码为8bit编译模式,上电后执行如下顺序:
       1.P2口LED全部点亮0.5秒。
       2.进入主循环后LED间隔点亮0.5S。
       3.跑马灯式逐个点亮LED一个循环后停止值P2.7口点亮状态。
二、按一次P3.2或P3.3口的按键:程序运行顺序如上述一样,
       1-3执行一遍的模式。而不是2-3的主循环内执行的模式。
三、实验板是本站的“擎天柱-AI8051U转89C52-DIP40核心功能板”



此前使用STC8H8K64U单片机时没有出现过这个问题,
如果每次掉电唤醒都回到主函数继续执行的话,
很多用户变量重新初始化就不能正常工作了,
怎样才能让单片机在中断唤醒后保留在主循环中运行,
不知道是我的实验哪里有问题,请各位指点。



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2025-1-26 15:39:28 | 显示全部楼层
代码不全,请贴出完整代码
盲猜没有中断函数,唤醒后跑飞重启了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-1-26 18:34:26 | 显示全部楼层
IRCDB = 0x10;

截图202501261834219242.jpg

截图202501261833118524.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-1-26 20:59:47 | 显示全部楼层

非常感谢,根据你的指点加入IRCDB寄存器配置后立竿见影的解决了问题,
另外,权衡利弊后我将我的系统时钟由40MHz降到24MHz正在观察中,再谢!

点评

可以 33MHz 以上  详情 回复 发表于 2025-1-26 21:44
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-1-26 21:44:23 | 显示全部楼层
乐此*** 发表于 2025-1-26 20:59
非常感谢,根据你的指点加入IRCDB寄存器配置后立竿见影的解决了问题,
另外,权衡利弊后我将我的系统时钟 ...

可以 33MHz 以上
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-1-27 10:12:17 | 显示全部楼层

好的,另外我还想请教你一个问题:
配置掉电后的省电模式时在掉电指令PCON = 0x02;
之前我做了关断各个I/O口的数字通道的配置,比如:P3IE = 0x00;
而后在掉电唤醒指令的后面在重新配置成P3IE = 0xff;的模式,
这时在STC8H8K64U中通过P3.7的I/O口中断是可以唤醒MCU的,
但在AI8051U中却不能、而且即使P3.2的INT0也无法响应中断的,
只能配置成P3IE = 0x84,10000100B;
保留P3.2、P3.7数字通道这样才能响应中断,不知道是否是正常的?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-1-27 11:55:41 | 显示全部楼层

截图202501271154532459.jpg

截图202501271155377661.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:32 , Processed in 0.180105 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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