51单片机+Proteus仿真运行不循环执行的bug

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机+Proteus仿真运行不循环执行的bug相关的知识,希望对你有一定的参考价值。

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问题。

以上是关于51单片机+Proteus仿真运行不循环执行的bug的主要内容,如果未能解决你的问题,请参考以下文章

51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真

51单片机定时器累加计数(0000-9999)+4位数码管(循环显示)+Proteus仿真

51单片机定时器累加计数+2位数码管(循环显示00-99)+Proteus仿真

51单片机定时器计时1秒数码管静态循环显示0到F+Proteus仿真

蓝桥杯51单片机定时器计时1秒数码管静态循环显示0到F+Proteus仿真

51单片机驱动TM1638芯片+Proteus仿真