2017-04-21 195 views
0

我有2个问题。MPLAB无限循环

第一:我在这个代码的行为的问题;当我在Proteus中运行它时,程序会使闪烁器“重复主函数中的代码” 我该怎么办?

这是代码:

#include <p18f452.h> 
#include <delays.h> 
#include <io.h> 

void main() 
{ 
    TRISC=0x00; 
    PORTC=0xff; 
    Delay1KTCYx(900); 
    PORTC=0x00; 
    Delay1KTCYx(900); 
    while(1) 
    { 

    } 
} 

第二个问题:什么是我可以用适当的延迟功能?以及如何测量延迟时间?

+0

您的代码将只有一次闪光,以修复移动'PORTC'和延迟线进入循环 –

回答

1

您只有代码才能生成一个闪存。将闪光灯和延迟移动到回路中:

for(;;) 
{ 
    PORTC = 0xff; 
    Delay1KTCYx(900); 
    PORTC = 0x00; 
    Delay1KTCYx(900); 
} 

通过计时大致可以通过计时手动进行测量N使用秒表闪烁。如果有的话,使用测量仪器(示波器对此很好)当然更容易。

此外,由于你的占空比为50%,则可以简化代码:

PORTC = 0; 
for (;;) 
{ 
    PORTC = ~PORTC; 
    Delay1KTCYx(900); 
} 

这使用按位取反(〜)反转的PORTC位,这将使他们切换从一到零反之亦然。在循环之前将整个端口设置为0,确保所有引脚处于已知状态。

+0

的身体我知道这个代码生成一个闪光灯,但在模拟的代码生成Flash –

+0

无限次@GehadMohamed好的,这听起来很奇怪。当模拟器检测到无限循环时,可能会重置模拟机器,导致程序重新启动并生成另一个闪存,等等。当然,我现在只是在猜测。 – unwind

+0

任何使用'PORTC^= 0xFF'的原因,而不是'PORTC =〜PORTC',它对我来说似乎不那么直观。写入'LATx'寄存器而不是'PORTx'寄存器是个好主意。 –

2

是在模拟禁用看门狗?如果启用它会导致程序的重复。

尝试加入这一行包括之后。

#pragma config WDT = OFF 
+0

我做到了,但问题仍然存在 –