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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值