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

红外遥控器键值数码管显示

时间:10-02 整理:3721RD 点击:
#include <reg52.h>       //51芯片管脚定义头文件
#include <intrins.h>         //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint  unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
//#define        DELAYNUM        40        //该数值可以调节显示的速度
sbit  IRIN = P3^2;         //红外接收器数据线
sbit  BEEP = P2^3;         //蜂鸣器驱动线

//uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar  dis[8];
void delay(unsigned char x);
void  display();
void beep();
void dis8(uchar r,uchar c)
{
   dula=0;
   P0=table[r];               
   dula=1;
   dula=0;
   wela=0;
   P0=~(1<<c);
   wela=1;
   wela=0;
   delay(5);
}
/*******************************************************
*                                                      *
* 主函数                                               *
*                                                      *
*******************************************************/
main(void)
{
//        uchar k;
        EA=1;
        ET1=1;
        EX0=1;
        while(1)
        {
                dis8(IRCOM[4],5);
                dis8(IRCOM[5],4);
        }
} //end of main()

void IR_IN() interrupt 0 //using 0
{
        unsigned char j,k,N=0;
        EA = 0;   
        delay(10);
        
        if (IRIN==1)
        {
                EA =1;
                return;
        }
                        //确认IR信号出现
        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
        {
                delay(1);
        }
        while (IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
        {
                delay(1);
        }
        for (j=0;j<4;j++)         //收集四组数据
        {
                for (k=0;k<8;k++)        //每组数据有8位
                {
                        while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
                        {
                                delay(1);
                        }
                        while (!IRIN)          //等 IR 变为高电平
                        {
                                delay(1);
                        }
                        while (IRIN)           //计算IR高电平时长
                        {
                                delay(1);
                                N++;   
                        }                        //高电平计数完毕     
                           if (N>=30)
                        {
                                EA=1;
                                return;                  //0.14ms计数过长自动离开。
                        }
                        IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
                        if (N>7)
                        {
                                IRCOM[j] = IRCOM[j] | 0x80;
                        }                                                  //数据最高位补“
                        N=0;
                }//end for k
        }//end for j
        /*
        if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    {
      EA=1;
      return;
    }
        
        if(IRCOM[0]!=0x00)         //比较用户码
    {
      EA=1;
      return;
    }*/
        IRCOM[4]=IRCOM[2] & 0x0F;     //取键码的低四位
        IRCOM[5]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
        beep();
        EA = 1;
}
/**********************************************************/
void beep()
{
  unsigned char i;
  for (i=0;i<180;i++)
   {
     delay(6);
     BEEP=!BEEP;                 //BEEP取反
   }
  BEEP=1;                      //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}
/**********************************************************/

学校单片机软件程序!

学习 谢谢分享!

这个是用什么芯片实现啊!

搞不懂啊

搞不懂啊

感谢小编分享!

这个给力,先学习下先

看着好像很不错哦

谢谢小编分享好资料,先收藏了,方便学习交流。

谢谢小编分享了

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P3^2;
uchar irtime;
uchar irdata[33];
uchar bitnum;
uchar startflag;
uchar irok;
uchar ircode[4];
uchar irprosok;
uchar disnum[8];
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table_we[]={
0xfe,0xfd,0xff,0xff,0xef,0xdf};
void timer0init(void) //256*(1/12m)*12=0.256ms
{
        TMOD=0x02;
        TH0=0x00;
        TL0=0x00;
        ET0=1;
        EA=1;
        TR0=1;
}

void irpros(void) // 红外码值处理
{
        uchar mun,k,i,j;
        k=1;
        for(j=0;j<4;j++)
        {
                for(i=0;i<8;i++)
                {
                        mun=mun>>1;
                        if(irdata[k]>6)
                        {
                                mun=mun | 0x80;
                        }
                                k++;
                }
                ircode[j]=mun;
        }
        irprosok=1;
}
void irwork(void) // 红外码值转换
{
        disnum[0]=ircode[0]/16;
        disnum[1]=ircode[0]%16;
        disnum[2]=ircode[1]/16;
        disnum[3]=ircode[1]%16;
        disnum[4]=ircode[2]/16;
        disnum[5]=ircode[2]%16;
        disn um[6]=ircode[3]/16;
        disnum[7]=ircode[3]%16;
}
delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}
display()
{
        uchar i;
        for(i=0;i<6;i++)
        {
                P0=0xff;
                wela=1;
                wela=0;
                P0=table_du[disnum[i]];
                dula=1;
                dula=0;
                P0=table_we[i];
                wela=1;
                wela=0;
                delay(10);
        }
}
void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}

void main()
{
        timer0init();
        int0init();
        while(1)
        {
                if(irok==1)
                {
                        irpros();
                        irok=0;
                }
                if(irprosok==1)
                {
                        irwork();
                        irprosok=0;
                }
                 display();
        }
               
}
void int0 () interrupt 0 //中断服务
{
if(startflag)
{
  if(irtime>32&&irtime<63)  //8-16ms
        {
           bitnum=0;
        }
        irdata[bitnum]=irtime;
        irtime=0;
        bitnum++;
        if(bitnum==33)
          {
           bitnum=0;
           irok=1;
          }
}
else
{
irtime=0;
startflag=1;
}
}
void timer0 () interrupt 1
{
        irtime++;
}

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

网站地图

Top