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) {
// unsigned char i;
// P2 = 0xfe; //P2口初始化
while(1) {
P2=0xef; //P2.0端口设置为低电平
delay();
P2=0x7f; //P2.0端口设置为低电平
delayms(1);
// delay();
led();
// for(i = 0; i < 7; i++)
// {
// P2 = _crol_(P2,1); //P2端口向左循环移动1位
// delay();
// }
// for(i = 0; i < 7; i++)
// {
// P2 = _cror_(P2,1); //P2端口向右循环移动1位
// delay();
// }
}
}
void led() {
// P2 =0x00;
// delayms(1000);
// P2 =~P2;
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1); //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) {
// unsigned char i;
// P2 = 0xfe; //P2口初始化
while(1) {
P2=0xef; //P2.0端口设置为低电平
delay();
P2=0x7f; //P2.0端口设置为低电平
delayms(1);
// delay();
// led();
// for(i = 0; i < 7; i++)
// {
// P2 = _crol_(P2,1); //P2端口向左循环移动1位
// delay();
// }
// for(i = 0; i < 7; i++)
// {
// P2 = _cror_(P2,1); //P2端口向右循环移动1位
// delay();
// }
}
}
void led() {
// P2 =0x00;
// delayms(1000);
// P2 =~P2;
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1); //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) {
// unsigned char i;
P2 = 0xfe; //P2口初始化
while(1) {
P2=0xef; //P2.0端口设置为低电平
delay();
P2=0x7f; //P2.0端口设置为低电平
delayms(1);
delay();
// led();
// for(i = 0; i < 7; i++)
// {
// P2 = _crol_(P2,1); //P2端口向左循环移动1位
// delay();
// }
// for(i = 0; i < 7; i++)
// {
// P2 = _cror_(P2,1); //P2端口向右循环移动1位
// delay();
// }
}
}
void led() {
// P2 =0x00;
// delayms(1000);
// P2 =~P2;
uint8 i;
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1); //P2端口向右循环移动1位
delay();
}
}
最开始我还以为,延时函数的问题,尝试了好久才发现这个bug谜一般的存在。这种低级的bug只能在程序代码量很少,执行量不多的情况下出现。如果在主循环函数里面放了很多执行函数内容,又不会出现这个bug问题。