这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STC51单片机实例之30红外解码数码管显示

共1条 1/1 1 跳转至

STC51单片机实例之30红外解码数码管显示

高工
2014-08-19 01:40:22     打赏
/********************************************************************
* 文件名  :  红外解码LCD.c
* 描述    :  实现了红外解码遥控器上的按键的值并在数码管上显示出来。
			 按遥控器的“0”会在数码管的最后一位显示0.	
			 按遥控器的“1”会在数码管的最后一位显示1.	
			 。
			 。
			 。
			 。
			 。
			 。
			 。
			 。
			 按遥控器的“8”会在数码管的最后一位显示8.	
			 按遥控器的“9”会在数码管的最后一位显示9.	

			 我们在代码中只解码了0--9进行处理,如果大家想解其他的按键,可以在前一个代码,
			 在1602中查看十六进制的值,在这个代码中对16进制值进行处理。		 

***********************************************************************/

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar distemp;
void delay(uchar x);  //x*0.14MS
void delay1(int ms);

sbit IRIN = P3^3;         //红外接收器数据线

uchar IRCOM[7];


//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************/
main()
{
 
    IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
    TCON = 0x10;               //触发方式为脉冲负边沿触发
    
    IRIN=1;                    //I/O口初始化
	
    delay1(10);                 //延时
   P2 = 7;
   while(1)	
   {
   		P0 = table[distemp];
		delay(20);	
   }
 } //end main
/**********************************************************/
void IR_IN() interrupt 2 using 0
{
  unsigned char j,k,N=0;
     EX1 = 0;   
	 delay(15);
	 if (IRIN==1) 
     { EX1 =1;
	   return;
	  } 
                           //确认IR信号出现
  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)
	 { EX1=1;
	 return;}                  //0.14ms计数过长自动离开。
      }                        //高电平计数完毕                
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }//end for k
 }//end for j
   
   if (IRCOM[2]!=~IRCOM[3])
   { EX1=1;
     return; }

	  switch(IRCOM[2])
   {
   		case 0x16:
			distemp = 0;
			break;
		case 0x0c:
			distemp = 1;
			break;
		case 0x18:
			distemp = 2;
			break;
		case 0x5e:
			distemp = 3;
			break;
		case 0x08:
			distemp = 4;
			break;
		case 0x1c:
			distemp = 5;
			break;
		case 0x5a:
			distemp = 6;
			break;
		case 0x42:
			distemp = 7;
			break;
		case 0x52:
			distemp = 8;
			break;
		case 0x4a:
			distemp = 9;
			break;
   }

     EX1 = 1; 
} 


/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}

/**********************************************************/
void delay1(int ms)
{
 unsigned char y;
  while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

 


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]