51单片机中延时函数问题

51单片机中为什么下面第二个延时函数会出错,而第一个正常?


void Delay_Ms(INT16U ms)
{
     INT16U i;
     do{
          i = MAIN_Fosc / 96000; 
          while(--i);   //96T per loop
     }while(--ms);
}
void Delay_Ms(INT16U ms)
{
     INT16U i;
     do{
          i = MAIN_Fosc / 96000; 
          while(i--);   //96T per loop
     }while(--ms);
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/349012
  • 这篇博客你也可以参考下:51单片机编程入门用什么单片机比较好?
  • 除此之外, 这篇博客: 51单片机中断系统实验中的 51单片机中断系统实验 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 一、实验内容
    INT0端接单次脉冲发生器。按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转。
    根据实验内容编写一个程序,并在实验系统上调试和验证。

    二、仿真图
    在这里插入图片描述

    三、代码
    C语言实现:

    
    sbit LED=P1^0;
    
    void INT0_IN();
    
    
    void main()
    {
        LED=0;
    	INT0_IN();
    	while(1) ;
    
    }
    
     void INT0_IN()
    {
       EA=1;//总中断打开
       EX0=1;//外部中断0 打开
       IT0=0;//负边沿触发
    }
    
    void exter0() interrupt 0
    {
    	IE0=0;
    	LED=~LED;
    }
    

    汇编实现:

            LED     BIT   P1.0
            LEDBUF  BIT   20H
            ORG 0000H
            LJMP START
            ORG 0003H
            LJMP INT00
            ORG 0030H
    
    START:  MOV SP,#60H
            CLR LEDBUF  //清0
            CLR LED	  //清0	   
            MOV TCON, #01H   ; 外部中断0下降沿触发
            MOV IE,   #81H       ; 打开外部中断允许位(EX0)及总中断允许位(EA)
    OK:     LJMP OK
    
    INT00:  PUSH     PSW          ; 保护现场
            CPL     LEDBUF      ; 取反LED
            MOV     C, LEDBUF
            MOV     LED, C
            POP     PSW          ; 恢复现场
            RETI
            END
    
    
  • 您还可以看一下 吴刚老师的【吴刚大讲堂】视觉设计快速入门50讲课程中的 创意表现思维导图小节, 巩固相关知识点