微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么我用两个定时中断会出现合并后就编译出现乱码?

为什么我用两个定时中断会出现合并后就编译出现乱码?

时间:10-02 整理:3721RD 点击:
为什么这段程序分开编译是好的,我和一起后却是乱码的?求救·····谢谢···
#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;} //利用按键控制清零,停止时才可以清零  
       }   
}

程序怎么可以乱合并呢,

因为我们分了两部分,但我们的程序合一起时纠错除了,我想知道为什么?能帮帮忙吗?谢谢·

我们是有这两部分和一起的······

#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;
#define uchar unsigned char
uchar a=2,b=2,c=2,d=2,num;
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
//////////////////////////////////////////////////
/*延时程序*/
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=0xec;    //重新赋值 5ms
     TL1=0x78;
     EA=1;            //总中断打开
     ET1=1;           //定时器中断打开
     TR1=1;           //定时器开关打开
}
/////////////////////////////////////////////////
void Timer1_isr(void) interrupt 3 using 1  //   定时器中断子程序
{
     num++;
     TH1=0xec;    //重新赋值 5ms
     TL1=0x78;  
}
/////////////////////////////////////////////////
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 main()              //主函数
{
     
     Init_Timer1();    //定时器初始化
     P2=0xff;
     P1=0x00;
     jiajian();      //按键控制单个数码管的加减
     daojishu();     //数字以一秒为间隔计数
     bihuaxianshi();    //一笔一划显示出当前数值
}

以下是另一部分一个秒表
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
unsigned int a=0,b=0,c=0,d=0;//四位显示         
bit GoFlag;
sbit p20=P2^0;
sbit p22=P2^2;//定义开始和停止,计时标志
uchar shu_[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//一到十
uchar ge_[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//个位显示
//////////////////////////////////////////
//     延时程序
void delay(uchar i)
{
   while(i--);
}
//////////////////////////////////////////
void Init_Timer0(void)      
{
     TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
     TH0 = 0x0Ec;         //给定初值,赋值 5ms
     TL0 = 0x78;
     EA=1;            //总中断打开
     ET0=1;           //定时器中断打开
     TR0=1;           //定时器开关打开
}
/////////////////////////////////////////////////
//   定时器中断子程序
void Timer0_isr(void) interrupt  1
{
     static 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 (void)
{
    unsigned char num=0;         
    Init_Timer0();  
    while(1)
        {
          P1=0x01;    //第四位
          P3=shu_[d];         
          delay(15);  
          P1=0x02;   //第三位
          P3=shu_[c];
          delay(15);
          P1=0x04;   //第二位
   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top