51单片机红外遥控控制数码管显键值没效果

2019-07-15 22:53发布

//大家帮我看看问题出在哪里,红外遥控发射的值要用怎么测
#include<reg51.h>

sbit IRIN=P3^2;
sbit led1 = P2^0;
sbit led2 = P2^1;

unsigned char IrValue[6];
unsigned char time;
void IrInit();
void DelayMs(unsigned int );
code unsigned char Tab[17] =
        {//定义数码管字型数据
                0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,        //0123456789
                0x77,0x7C,0x39,0x5E,0x79,0x71,        //AbCdEF
                0x40        //-
        };
/*******************************************************************************
* 函数名         : main
* 函数功能                   : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void main()
{
        IrInit();
        while(1)
        {
        switch(IrValue[2])
        {
                case 0: P0 = Tab[0];break;
                case 1: P0 = Tab[1];break;
                case 2: P0 = Tab[2];break;
                case 3: P0 = Tab[3];break;
                case 4: P0 = Tab[4];break;
                case 5: P0 = Tab[5];break;
                case 6: P0 = Tab[6];break;
                case 7: P0 = Tab[7];break;
                case 8: P0 = Tab[8];break;
                case 9: P0 = Tab[9];break;
        }
    }

}                                                                         
/*******************************************************************************
* 函数名         : DelayMs()
* 函数功能                   : 延时
* 输入           : x
* 输出                  : 无
*******************************************************************************/

void DelayMs(unsigned int x)   //0.14ms误差 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}
/*******************************************************************************
* 函数名         : IrInit()
* 函数功能                   : 初始化红外线接收
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}
/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void ReadIr() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        DelayMs(70);

        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        DelayMs(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                DelayMs(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
//                                        while (!IRIN)
                                        {
                                                DelayMs(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                DelayMs(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。