51单片机+Proteus仿真运行不循环执行的bug
仿真没有bug的程序代码
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
void delay(void)
{
unsigned char i,j;
for(i = 0; i < 252; i++)
for(j = 0; j < 252; j++);
}
void delayms(unsigned char ms )
{
unsigned char i;
while(ms--)
for(i=0; i<110; i++);
}
void led();
void main(void) {
while(1) {
P2=0xef;
delay();
P2=0x7f;
delayms(1);
led();
}
}
void led() {
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1);
delay();
}
}
仿真有bug的程序代码
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
void delay(void)
{
unsigned char i,j;
for(i = 0; i < 252; i++)
for(j = 0; j < 252; j++);
}
void delayms(unsigned char ms )
{
unsigned char i;
while(ms--)
for(i=0; i<110; i++);
}
void led();
void main(void) {
while(1) {
P2=0xef;
delay();
P2=0x7f;
delayms(1);
}
}
void led() {
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1);
delay();
}
}
仅仅实在主函数里面,把led()函数注释掉了,程序就不循环执行了,如果把led函数前面的延时函数启用又恢复正常。
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
void delay(void)
{
unsigned char i,j;
for(i = 0; i < 252; i++)
for(j = 0; j < 252; j++);
}
void delayms(unsigned char ms )
{
unsigned char i;
while(ms--)
for(i=0; i<110; i++);
}
void led();
void main(void) {
P2 = 0xfe;
while(1) {
P2=0xef;
delay();
P2=0x7f;
delayms(1);
delay();
}
}
void led() {
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1);
delay();
}
}
最开始我还以为,延时函数的问题,尝试了好久才发现这个bug谜一般的存在。这种低级的bug只能在程序代码量很少,执行量不多的情况下出现。如果在主循环函数里面放了很多执行函数内容,又不会出现这个bug问题。
|