51代码求助,关于中断的。

2019-03-24 19:25发布

//=====================================================================////                      红外遥控器解码程序演示                         ////  本程序主要将现在比较常用PC9012遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当 ////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据.         ////  程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据.                                                              ////---------------------------------------------------------------------////  开发日期: 2009/01/27   编写红外遥控器解码程序演示的最初代码        ////  修改日期:                                                          ////  程序作者: guojun     邮箱:Guojun2008a@126.com                      ////  程序备注: 此程序仅为表现本机功能而演示用,当用作实际工程时请慎用.   ////=====================================================================//#include <AT89x51.h>                      //包含51单片机相关的头文件
unsigned char  code LedShowData[]=        //定义数码管显示数据         {0x9F,0x25,0x0D,0x99,0x49,       //1,2,3,4,5,         0x41,0x1F,0x01,0x19,0x03};       //6,7,8,9,0,static unsigned char RecvData;            //定义接收红外数据变量static unsigned char CountData;           //定义红外个数计数变量static unsigned int  AddData;             //定义自增变量static unsigned int LedFlash;             //定义闪动频率计数变量#define uint    unsigned int                          //重定义无符号整数类型#define uchar   unsigned char                         //重定义无符号字符类型
unsigned char LeadCode;                   //定义红外脉冲引导码标志unsigned char ReceiveBit;                 //定义接收位记数器unsigned char DataBuffer[4];              //定义接收数据缓存变量unsigned char RecvSuccess=0;              //定义接收数据成功标志位uchar temp;sbit M1A=P0^0;                                        //定义电机1正向端口sbit M1B=P0^1;                                        //定义电机1反向端口sbit M2A=P0^2;                                        //定义电机2正向端口sbit M2B=P0^3;  sbit led=P1^6;sbit LeftLed=P2^0;                                    //定义前方左侧指示灯端口sbit RightLed=P0^7;                                      //定义电机2反向端口sbit RunLed=P1^0;                         //定义运行指示灯变量位sbit RecvLed=P1^1;                        //定义接收指示灯变量位sbit InTimeLed=P1^2;                      //定义定时器开始指示灯变量位sbit ReadyLed=P1^3;                       //定义就绪指示灯变量sbit IR1=P3^3;                            //定义红外接收端口#define ShowPort P2                       //定义数码管显示端口void Delay()                                          //定义延时子程序{ uint DelayTime=30000;                               //定义延时时间变量  while(DelayTime--);                                 //开始进行延时循环                                             //子程序返回}void ControlCar(uchar CarType)                        //定义小车控制子程序{ M1A=0;                                               //将电机1正向电平置低 M1B=0;                                               //将电机1反向电平置低 M2A=0;                                               //将电机2正向电平置低 M2B=0;                                               //将电机2反向电平置低 LeftLed=1;                                           //关闭前方左侧指示灯 RightLed=1;                                          //关闭前方右侧指示灯                                          //将此状态延时一段时间 switch(CarType)                                      //判断小车控制指令类型 {  case 1: //前进                                    //判断是否是前进    { M1A=1;                                          //将电机1正向端口置高      M2A=1;                                          //将电机2正向端口置高            break;                                          //退出判断    }    case 2: //后退                                    //判断是否是后退    { M1B=1;                                          //将电机1反向端口置高      M2B=1;                                          //将电机2反向端口置高                                            break;                                          //退出判断    }    case 3: //左转                                    //判断是否是左转    { M1B=1;                                          //将电机1反向端口置高      M2A=1;                                          //将电机2正向端口置高           break;                                          //退出判断    }    case 4: //右转                                    //判断是否是右转    { M1A=1;                                          //将电机1正向端口置高      M2B=1;                                          //将电机2反向端口置高           break;                                          //退出判断    }    default:                                          //默认情况下的判断    {     break;                                           //直接退出判断    } } }
void Timer0_IR1() interrupt 1 using 3     //定义红外定时器子程序{  TH0=0xFF;                                //向定时器定时间寄存器填入高八位值 TL0=0x49;                                //向定时器定时间寄存器填入低八位值 InTimeLed=!InTimeLed;                    //将定时器指示灯进行取反 AddData++;                               //自增变量加1 if(AddData>400) {    ReceiveBit =0;                        //红外接收记数器清零    AddData =0;                           //计数器清零    LeadCode =0;                          //引导码记录器请零    TR0 =0;                               //关定时器0     ET0 =0;                               //关闭定时器0中断 }}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
rfw8797
2019-03-25 01:03
问题是:
在外部中断中,只要在这个地方
      
           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); 程序进一次中断就不会再进第二次,请问这是什么问题呢?

一周热门 更多>