微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机红外遥控控制数码管显键值没效果

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

时间:10-02 整理:3721RD 点击:
//大家帮我看看问题出在哪里,红外遥控发射的值要用怎么测
#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;
                }
        }                       
}

实物还是仿真,实物需要红外接收芯片,你板子上有没有

有的,程序下载进去开始时显示“0”,后面按遥控只显示8或者9

解决了,把switch里面换成
                case 0X0C: P0 = Tab[1];break;
                case 0X18: P0 = Tab[2];break;
                case 0X5E: P0 = Tab[3];break;
                case 0X08: P0 = Tab[4];break;
                case 0X1C: P0 = Tab[5]; break;
                case 0X5A: P0 = Tab[6];break;
                case 0X42: P0 = Tab[7];break;
                case 0X52: P0 = Tab[8];break;
                case 0X4A: P0 = Tab[9];break;
就可以了,但是为什么是这些值呢?

因为每个按键的值都是固定好的,你可以通过串口检测程序来检测你的遥控器上每个按键对应的键码值

请问0 的代码是什么

按键的键值和你的硬件接线有关系,0号按键的键值不是等于0的

那些值是遥控器上每个键解码后的值,每个码都对应遥控器上的一个键

初学单片机,问一下这里为什么延迟10ms

可能是前面的引导码的时间

遥控按键出来接吗,就是ASCII码

正需要此资料,感谢小编无私分享,先学习,后评论

正需要此资料,感谢小编无私分享

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

网站地图

Top