rfw8797

    1. 51代码求助,关于中断的。 2/2722 51单片机 2012-02-22
      问题是: 在外部中断中,只要在这个地方                   P2=LedShowData[DataBuffer[2]];     //P2端口开始显示数据                 //ControlCar(1);            led=!led;            DataBuffer[0]=0;                   //清零数据缓存0            DataBuffer[1]=0;                   //清零数据缓存0            DataBuffer[2]=0;                   //清零数据缓存0            DataBuffer[3]=0;                   //清零数据缓存0 不加ControlCar(1);程序就能正常运行,加了ControlCar(1); 程序进一次中断就不会再进第二次,请问这是什么问题呢?
    2. 51代码求助,关于中断的。 2/2722 51单片机 2012-02-22
      void Int1_IR1() interrupt 2               //定义红外接收中断子程序 {   if(LeadCode ==0)                        //第一次处理红外脉冲引导码    {                if( (AddData > 35) && (AddData < 50) )                {                                //判断红外计数器是否已到达最大值                LeadCode =0xff;                //引导码记录器标志位定义                AddData =0;                    //计数器清零                return;                        //接收引导码成功              }             else                              //正常接收情况下开启定时器开时计数                 {                TR0=1;                         //开启定时器0                ET0=1;                         //开定时器0                return;                        //接收引导码失败              }    }   else                                    //在正常接收情况    {             RecvData >>=1;                    //接收到的数据右移1位                          if((AddData > 3)&&(AddData < 7))  //判断计数时间             {               RecvData &= 0x7f;               //对数据0置数             }             else                              //判断数据计数时间             {                       if(AddData < 15)            //对数据1置数                       {                         RecvData |= 0x80;         //对数据1置数                       }             }                       ReceiveBit++;                    //数据位计数器加1              AddData =0;                      //时间计数清零    }             switch(ReceiveBit)                      //根据位计数器进行判断   {     case 8:                               //8位时用户编码                {                            DataBuffer[0] = RecvData;  //将用户编码放入数据缓存0                        break;            }     case 16:                              //16位时用户编码            {                    DataBuffer[1] = RecvData;  //将用户编码放入数据缓存1                    break;            }              case 24:                              //24位时按键编码                {                          DataBuffer[2] = RecvData;  //将按键编码放入数据缓存2                break;            }     case 32: {                            //32位时按键编码反码                DataBuffer[3] = RecvData;  //将按键编码放入数据缓存3                ReceiveBit =0;             //清零位标志计数器                AddData =0;                //时间记录器清零                LeadCode =0;               //引导标志位清零                            RecvSuccess=0xff;          //成功标志位置位                            TR0 =0;                    //关定时器0                ET0 =0;                    //关闭定时器0               break;                          }                                                                    default: break;   }      if(RecvSuccess==0xff)                   //判断接收数据成功标志位   {        RecvSuccess=0x00;                  //成功标志位清零        if(DataBuffer[0]!=DataBuffer[1])   //判断用户码是否相同              {return;}            if(DataBuffer[2]!=~DataBuffer[3])  //判断按键码是否正确            {return;}                   P2=LedShowData[DataBuffer[2]];     //P2端口开始显示数据                 //ControlCar(1);            led=!led;            DataBuffer[0]=0;                   //清零数据缓存0            DataBuffer[1]=0;                   //清零数据缓存0            DataBuffer[2]=0;                   //清零数据缓存0            DataBuffer[3]=0;                   //清零数据缓存0   } } void main()                       //主程序入口 { bit ExeFlag=0;                       //定义可执行位变量 RecvData=0;                          //将接收变量数值初始化 CountData=0;                         //将计数器变量数值初始化 AddData=0;                           //将定时器计数器初始化 LedFlash=3000;                       //对闪灯数据进行初始化 ReceiveBit =0;                       //红外接收记数器清零 AddData =0;                          //计数器清零 LeadCode =0;                         //引导码记录器请零 RecvSuccess=0x00; TMOD=0x01;                           //选择定时器0为两个16位定时器 TH0=0xFF;                            //对定时器进行计数值进行初始化 TL0=0x49;                            //同上,时间大约为25uS TR0=1;                               //同意开始定时器0 EX1=1;                               //同意开启外部中断1 IT1=1;                               //设定外部中断1为低边缘触发类型 EA=1;                                //总中断开启 while(1)                             //程序主循环 {    while(LedFlash--)                  //闪灯总延时     {      if(IR1==0)                       //判断延时期间是否有红外信号输入        {ExeFlag=1;                    //将可执行标志位置1        }     }   RunLed=!RunLed;                     //运行指示灯取反   LedFlash=3000;                      //运行闪动时间重设定   if(ExeFlag==0)                      //判断可执行标志位   {     EX1=1;                            //开启外部中断1   }   ExeFlag=0;                          //可执行标志位置0 } }

最近访客

< 1/1 >

统计信息

已有329人来访过

  • 芯积分:--
  • 好友:--
  • 主题:1
  • 回复:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言