请教一个关于红外控制直流电机的程序

2019-07-16 00:26发布

以下是郭天祥开发板里的红外控制直流电机的程序,下载调试能成功,但是有许多地方不太明白:1为啥没有P3^3这个中断口,外部中断源是什么?也就是说什么导致发生外部中断,为啥解码时识别1和0的时间不是2.24ms和1.12ms。请大神们详细讲解下这个程序,谢谢了,留下qq号必有重谢!
#include <reg52.h>
/************************************宏定义************************************/
#define uchar unsigned char
#define Imax  14000               //此处为晶振为11.0592时的取值,     56ms
#define Imin  8000                //如用其它频率的晶振时,            62ms
#define Inum1 1450                //要改变相应的取值。               70ms
#define Inum2 700                                                    65ms
#define Inum3 3000                                                   68ms
/************************************位定义************************************/
sbit dula = P2^6;        
sbit wela = P2^7;
sbit pwm = P1^7 ;                 //PWM信号输出
/********************************定义变量和数组********************************/
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
uchar Im[4] = {0x00,0x00,0x00,0x00};
uchar f;
uchar IrOK;
uchar PulseWidth = 0;             //定义脉宽值
uchar StartFlag = 0;              //定义启动标志位 0为停止 1为启动
uchar count;                      //0.5ms次数标识
unsigned long m,Tc;
/******************************************************************************/
/* 函数名称  : delay                                                          */
/* 函数描述  : 延时函数                                                       */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void delay(uchar i)
{
    uchar j,k;
    for(j = i;j > 0;j--)
    {
        for(k = 125;k > 0;k--);
    }  
}
/******************************************************************************/
/* 函数名称  : display                                                        */
/* 函数描述  : 显示函数函数                                                   */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void display(void)
{
    dula = 0;
    P0 = table[PulseWidth/10];             //显示脉宽值高位
    dula = 1;
    dula = 0;
    wela = 0;
    P0 = 0xfe;
    wela = 1;
    wela = 0;
    delay(5);
}
/******************************************************************************/
/* 函数名称  : intersvr1                                                      */
/* 函数描述  : 外部中断解码程序                                               */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void intersvr1(void) interrupt 2 using 1
{
Tc = TH0 * 256 + TL0;                      //提取中断时间间隔时长
TH0 = 0;
    TL0 = 0;                                   //定时中断重新置零
if((Tc > Imin) && (Tc < Imax))
    {
  m = 0;
        f = 1;
  return;
    }                                          //找到启始码
    if(f == 1)
    {
        if(Tc > Inum1 && Tc < Inum3)
    {
   Im[m / 8] = Im[m / 8] >> 1 | 0x80;
            m++;
      }
     if(Tc > Inum2 && Tc < Inum1)
        {
         Im[m / 8] = Im[m / 8] >> 1;
            m++;                              //取码
  }
  if(m == 32)
   {
            m = 0;  
            f = 0;
            if(Im[2] ==~ Im[3])
         {
                IrOK =1 ;
      }
            else
            {
                IrOK = 0;   //取码完成后判断读码是否正确
            }
     }
}
}
/******************************************************************************/
/* 函数名称  : Inf_Dispose                                                    */
/* 函数描述  : 红外接收处理函数                                               */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Inf_Dispose(void)
{
    if(IrOK == 1)
    {
        switch(Im[2])   
        {
            case 0x44:                   //遥控器 开始/停止 键按下 启动停止控制
                StartFlag =~ StartFlag;
                if(StartFlag)            //启动 打开定时器中断
                {
                    if(PulseWidth)       //只有当脉宽值不为0时才可以启动
                    {
                        ET0 = 1;
                    }
                }
                else                     //停止 关闭定时器中断
                {
                    ET0 = 0;
                    pwm = 0;
                }
            break;
            case 0x09:                   //遥控器 - 键按下 脉宽值加10
                PulseWidth += 10;                  
                count=0;                 
                if(PulseWidth==60)              
                {
                    PulseWidth = 50;               
                }
            break;
            case 0x15:                   //遥控器 + 键按下 脉宽值减10
                PulseWidth -= 10;                  
                count=0;
                if(PulseWidth == 0)
                {
                    PulseWidth = 10;            
                }
                if(PulseWidth == 246)
                {
                    PulseWidth = 0;
                }               
            break;
            default:
            break;
        }
        IrOK = 0;   
}
}
/******************************************************************************/
/* 函数名称  : time0_Init                                                     */
/* 函数描述  : 定时器0初始化函数                                              */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Time0_Init()                    //定时器初始化
{
TMOD |= 0x01;                    //定时器0工作在方式1   
IE   |= 0x82;
TH0  = 0xfe;
TL0  = 0x33;               //11.0592MZ晶振,0.5ms
    TR0  = 1;                        //定时器开始
    ET0 = 0;
}
/******************************************************************************/
/* 函数名称  : Time0_Int                                                      */
/* 函数描述  : 定时器0中断函数                                                */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Time0_Int() interrupt 1        //中断程序
{
TH0  = 0xfe;                    //重新赋值
TL0  = 0x33;
   
    count++;
    if(count == PulseWidth)         //对应的脉宽值输出低电平               
    {
        pwm = 0;
    }
    if(count == 60)//30ms周期到达后
    {
        pwm = 1;                    //输出高电平
        count = 0;
    }   
}
/******************************************************************************/
/* 函数名称  : main                                                           */
/* 函数描述  : 主函数                                                         */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void main(void)
{
m = 0;
    f = 0;
EA = 1;

IT1 = 1;
    EX1 = 1;

TMOD = 0x11;  
   
    PulseWidth = 0;
    count = 0;
    pwm = 0;
    Time0_Init();
while(1)
{
     Inf_Dispose();            //红外接收处理
        display();                //数码管显示
    }
}
/******************************************************************************/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。