如何让Proteus 8 Professional中PIC16F877A程序停止自动循环?
问题描述
MCU设置

Proteus电路

我编写了一段代码,预期让LED仅闪烁一次,但实际却无限闪烁。请问如何在Proteus 8 Professional模拟器中让该程序停止自动循环?我已正确检查并将代码烧录至PIC16F877A MCU。
代码
#include<pic.h> #define _XTAL_FREQ 20000000 __CONFIG(0x3D72); void delay(); void main() { TRISD=0X00; PORTD=0X00; RD4=1; delay(); RD4=0; delay(); } void delay() { for(int i=0;i<50;i++) __delay_ms(10); }
问题原因
PIC16F877A这类8位PIC单片机,在执行完main()函数后会自动触发复位,程序会从头重新执行,这就是LED无限闪烁的核心原因。
解决方法
只需在main()函数末尾添加代码,让单片机停止执行或进入休眠,阻止程序复位重启:
方法1:进入休眠模式(更节省资源)
配置寄存器后调用休眠指令,修改后的main()函数如下:
void main() { TRISD=0X00; PORTD=0X00; RD4=1; delay(); RD4=0; delay(); INTCON = 0x00; // 关闭所有中断,避免休眠被意外唤醒 SLEEP(); // 进入休眠模式,程序停止执行 while(1); // 双重保险,防止唤醒后继续执行 }
方法2:添加无限循环
如果不需要休眠,直接在main()末尾加无限循环,让程序停在这里:
void main() { TRISD=0X00; PORTD=0X00; RD4=1; delay(); RD4=0; delay(); while(1); // 无限循环,程序不再重启 }
验证
修改代码后重新编译烧录到Proteus的MCU中,运行模拟器,LED只会闪烁一次后保持熄灭,程序不会再循环执行。
内容的提问来源于stack exchange,提问作者BaumaRanjith
相关产品推荐
相关产品推荐

