为什么我用两个定时中断会出现合并后就编译出现乱码??分开的编译却是正常的。求救!

2019-03-24 18:55发布

#include<reg52.h>
#include <intrins.h>

sbit p10=P1^0;   //数码管控制端
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p20=P2^0;   //按键控制端
sbit p21=P2^1;
sbit p22=P2^2;
sbit p27=P2^7;
bit GoFlag;
#define uchar unsigned char
uchar a=2,b=2,c=2,d=2,num,e,f,g,h;
int n;

uchar shu[10][7]={ {0xfb,0x7b,0x3b,0x1b,0x0b,0x0b,0x03},
                   {0xbf,0xbf,0x9f,0x9f,0x9f,0x9f,0x9f},
                   {0x7f,0x3f,0x3d,0x35,0x25,0x25,0x25},
                   {0x7f,0x3f,0x3d,0x1d,0x0d,0x0d,0x0d},
                   {0xfb,0xfb,0xf9,0xf9,0xb9,0xb9,0x99},
                   {0xfb,0xf9,0xd9,0xc9,0x49,0x49,0x49},
                   {0x7f,0x7b,0x73,0x63,0x43,0x41,0x41},
                   {0x7f,0x3f,0x1f,0x1f,0x1f,0x1f,0x1f},
                   {0xfb,0x7b,0x3b,0x39,0x31,0x21,0x01},
                   {0xfd,0xf9,0x79,0x39,0x19,0x09,0x09}  };//数码管显示
uchar shu_[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//0到9
uchar ge_[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//个位显示

//////////////////////////////////////////////////
/*延时程序*/
void delay(uchar i)        //i*1ms的时间
{
  uchar b;
   while(i--)
   {
        for(b=124;b>0;b--) ;   //1ms延时
      // for(a=4;a>0;a--);
                }
}

////////////////////////////////////////////////
void LED ()
{
p27=0;
delay(125);
p27=1;
}

//////////////////////////////////////////////////
/*一笔一划写出4个数字*/
void bihuaxianshi()
{  
    uchar j,i;
    while(1)
         {  
                  for(j=0;j<7;j++)
             for(i=0;i<50;i++)
            {
               P1=0x08;   //第一位
               P3=shu[a][j];
               delay(5);
            }

          for(j=0;j<7;j++)
             for(i=0;i<50;i++)
            {
               P1=0x04;   //第二位
               P3=shu[j];
               delay(5);
               P1=0x08;   //第一位
               P3=shu[a][6];
               delay(5);
            }

          for(j=0;j<7;j++)
             for(i=0;i<35;i++)
            {
               P1=0x02;   //第三位
               P3=shu[c][j];
               delay(5);
               P1=0x04;   //第二位
               P3=shu[6];
               delay(5);
               P1=0x08;   //第一位
               P3=shu[a][6];
               delay(5);
            }

          for(j=0;j<7;j++)
             for(i=0;i<25;i++)
            {
               P1=0x01;    //第四位
               P3=shu[d][j];         
               delay(5);  
               P1=0x02;   //第三位
               P3=shu[c][6];
               delay(5);
               P1=0x04;   //第二位
               P3=shu[6];
               delay(5);
               P1=0x08;   //第一位
               P3=shu[a][6];
               delay(5);
            }
        while(1)   //稳定显示
        {
          P1=0x01;    //第四位
          P3=shu[d][6];         
          delay(5);  
          P1=0x02;   //第三位
          P3=shu[c][6];
          delay(5);
          P1=0x04;   //第二位
          P3=shu[6];
          delay(5);
          P1=0x08;   //第一位
          P3=shu[a][6];
          delay(5);
        }         
      }
}

/////////////////////////////////////////////
void Init_Timer1(void)      
{
     TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
     TH1=0xee;                  //重新赋值 5ms
     TL1=0x79;       
     EA=1;            //总中断打开
     ET1=1;           //定时器中断打开
     TR1=1;           //定时器开关打开
}
//////////////////////////////////////////
void Init_Timer0(void)      
{
     TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
     TH0 = 0xec;         //给定初值,赋值 5ms
     TL0 = 0x78;
     EA=1;            //总中断打开
     ET0=1;           //定时器中断打开
     TR0=1;           //定时器开关打开
}

/////////////////////////////////////////////////
void Timer1_isr(void) interrupt 3  //   定时器中断子程序
{
     num++;
     TH1=0xee;                  //重新赋值 5ms
     TL1=0x79;         
}

/////////////////////////////////////////////////
void daojishu()     //数字以一秒为间隔计数
{   
    uchar w=n;
    while(w)         
        {          
                P1=0x00;
            p10=1;
            P3=shu_[w%10];
                delay(5);
                P1=0x00;
                p11=1;
                P3=shu_[w/10];       
            delay(5);
                   if(num>=200)     //200*5ms=1s
                {
                     num=0;
            w--;       
            LED();
                }
        }
    do         
        {
                P1=0x00;          
            p10=1;       
            P3=shu_[w%10];
                delay(5);
                P1=0x00;
                p11=1;
                P3=shu_[w/10];
                delay(5);
            if(num>=200)     //200*5ms=1s
                {
                     num=0;
                     w++;
             LED();
                }
               
        }while(n>=w);  
}

////////////////////////////////////////////////
void jiajian()   //按键控制单个数码管的加减
{
     int i=c;
         uchar j;
         uchar num=0;
     p11=1;
         P3=shu_;
         while(1)        
     {                                                      
          if(p20==0)    //切换键 ,如果检测到低电平,说明按键按下
          {
                  delay(10);   //延时去抖
                  if(p20==0)         //再次确认按键是否按下,没有按下则退出          
                  {
                 while(p20==0)
                 {
                                      delay(10);
                                       if(++num>200)   num=201;                                         
                                 }
                 if(num<200&&num>0)
                     {
                     if(j%2==0)
                                     {    c=i;  i=d; p11=0; p10=1;P3=shu_;}    //先保存后赋值
                                     if(j%2==1)
                                     {    d=i;  i=c; p10=0; p11=1;P3=shu_;}                      
                     j++;
                         LED();
                 }
                  }
                  
            }
            if(num==201)                               //跳出加减控制状态
                        {                            
                                 if(j%2==0)
                                 {    c=i;   }    //先保存i的值
                                 if(j%2==1)
                         {    d=i;   }
                 while(num--)
                 {  
                    P1=0x01;    //第四位
                    P3=shu_[d];         
                    delay(5);  
                    P1=0x02;   //第三位
                    P3=shu_[c];
                    delay(5);
                  }
                 n=c*10+d;
                             break;
                        }
            if(p21==0)         //判断加程序
            {
                     delay(10);
                     if(p21==0)
                     {
                      while(p21==0)
                      {
                                            num++;
                            delay(10);
                            if(num ==200)
                                                    {      
                                            
                                     while(p21==0)                   
                                     {   
                                     i++;                                          
                                         if(i>9)  
                                                                         i=0;                         
                                                         P3=shu_;
                                                     delay(50);
                                                LED();
                                 }
                                                                 num=0;
                                 }                      
                           }                                                        
                       if(num<200&&num>0)
                           {
                            i++;
                                       if(i>9)  i=0;                     
                                            P3=shu_;
                                LED();
                           }                 
                       num=0;
                                }
             }

                        if(p22==0)         //判断减程序
            {
                     delay(10);
                     if(p22==0)
                     {
                      while(p22==0)
                      {
                                            delay(10);
                            num++;
                            if(num==200)                        
                            {
                                   num=0;
                                   while(p22==0)                   
                                   {   
                                    i--;                                          
                                        if(i<0)  
                                                                        i=9;                         
                                                        P3=shu_;
                                                    delay(50);
                                               LED();
                                }
                                num=0;                              
                                }               
                                            }
                       if(num<200&&num>0)
                           {
                            i--;
                                       if(i<0)  i=9;                     
                                            P3=shu_;
                                LED();
                            num=0;
                           }                 
                  }       
             }
      }
}


/////////////////////////////////////////////////
//   定时器中断子程序
void Timer0_isr(void) interrupt  1  
{
   unsigned char num;
    TH0 = 0x0Ec;         //重新赋值 5ms
    TL0 = 0x78;
     if(GoFlag)
     {
         num++;
        if(num==2)
        {
            num=0;
            d++;
           if (d==10)//10毫秒进1
           {
               d=0;
               c++;//分秒加1
                  if(c==10)//10分秒进1
                  {  
                               c=0;                       
                             b++;//秒加1
                                   if(b==10)//10秒进1
                                   {
                                       b=0;
                                           a++;
                                           if(a>9)  {a=0,b=0,c=0,d=0;}
                                   }                                  
                           }
            }
        }
     }
}

////////////////////////////////////
//             按键执行相应操作
void dakaiguanbi()
{   
     GoFlag=!GoFlag;  //利用外部中断打开和关闭定时标志 用于开始和停止计时
                
         return;
}
/////////////////////////////////////////////////
void main()              //主函数
{
     EA=1;
     EX0=1;
     while(1)
{         Init_Timer1();    //定时器初始化
     P2=0xff;
     P1=0x00;
     jiajian();      //按键控制单个数码管的加减
     daojishu();     //数字以一秒为间隔计数
     bihuaxianshi();    //一笔一划显示出当前数值
     num=0,e=0,f=0,g=0,h=0;      
     Init_Timer0();
      while(1)
      {
          P1=0x01;    //第四位
          P3=shu_[h];         
          delay(15);  
          P1=0x02;   //第三位
          P3=shu_[g];
          delay(15);
          P1=0x04;   //第二位
          P3=ge_[f];
          delay(15);
          P1=0x08;   //第一位
          P3=shu_[e];
          delay(15);
                  if(p22==0)
                  {
                      delay(10);
                      dakaiguanbi();
              }
          if(p20==0&&GoFlag==0)   {e=0;f=0;g=0;h=0;} //利用按键控制清零,停止时才可以清零  

      }   
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。