⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaokongcebianma.c

📁 测遥控器编码
💻 C
字号:
//本程序是用来识别 不同的遥控器的按键编码的,对于我们拿到的一块遥控器,
//想用它来做实验,但是又不知道对应按键的编码,那是一件很恼火的事情,
//作者就是为了解决这个问题而特意把一个遥控程序经过修攺而得此功能
//本程序已经在作者手里有的两个遥控器上做过实验,除个另别键不能读出外,基本上能够读出。
//注意:本程序并不适用于所有的遥控器。
//作者:无名沈
//修改日期:2007/9/29
#include <reg51.h>
#define N 3

sbit Led  = P1 ^ 7;
sbit P3_2 = P3 ^ 2;
sbit P1_0 = P1 ^ 0;
sbit P1_2 = P1 ^ 2;
sbit P1_1 = P1 ^ 1;
sbit P1_3 = P1 ^ 3;
sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;

static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT;
unsigned char i;
							
unsigned char SEG_TAB1[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
                            0xa0, 0x83, 0xc6, 0xa1,0x84, 0x8e };//0-f十六进制数数字
unsigned int code daima[] = {  0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F
/*定义一个数组0~255*/         ,0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X1E,0X1F
						      ,0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X29,0X2A,0X2B,0X2C,0X2D,0X2E,0X2F
						      ,0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39,0X3A,0X3B,0X3C,0X3D,0X3E,0X3F
						      ,0X40,0X41,0X42,0X43,0X44,0X45,0X46,0X47,0X48,0X49,0X4A,0X4B,0X4C,0X4D,0X4E,0X4F
						      ,0X50,0X51,0X52,0X53,0X54,0X55,0X56,0X57,0X58,0X59,0X5A,0X5B,0X5C,0X5D,0X5E,0X5F
						      ,0X60,0X61,0X62,0X63,0X64,0X65,0X66,0X67,0X68,0X69,0X6A,0X6B,0X6C,0X6D,0X6E,0X6F
						      ,0X70,0X71,0X72,0X73,0X74,0X75,0X76,0X77,0X78,0X79,0X8A,0X7B,0X7C,0X7D,0X7E,0X7F
						      ,0X80,0X81,0X82,0X83,0X84,0X85,0X86,0X87,0X88,0X89,0X8A,0X8B,0X8C,0X8D,0X8E,0X8F
						      ,0X90,0X91,0X92,0X93,0X94,0X95,0X96,0X97,0X98,0X99,0X9A,0X9B,0X9C,0X9D,0X9E,0X9F
						      ,0XA0,0XA1,0XA2,0XA3,0XA4,0XA5,0XA6,0XA7,0XA8,0XA9,0XAA,0XAB,0XAC,0XAD,0XAE,0XAF
						      ,0XB0,0XB1,0XB2,0XB3,0XB4,0XB5,0XB6,0XB7,0XB8,0XB9,0XBA,0XBB,0XBC,0XBD,0XBE,0XBF
						      ,0XC0,0XC1,0XC2,0XC3,0XC4,0XC5,0XC6,0XC7,0XC8,0XC9,0XCA,0XCB,0XCC,0XCD,0XCE,0XCF
						      ,0XD0,0XD1,0XD2,0XD3,0XD4,0XD5,0XD6,0XD7,0XD8,0XD9,0XDA,0XDB,0XDC,0XDD,0XDE,0XDF
						      ,0XE0,0XE1,0XE2,0XE3,0XE4,0XE5,0XE6,0XE7,0XE8,0XE9,0XEA,0XEB,0XEC,0XED,0XEE,0XEF
					   	      ,0XF0,0XF1,0XF2,0XF3,0XF4,0XF5,0XF6,0XF7,0XF8,0XF9,0XFA,0XFB,0XFC,0XFD,0XFE,0XFF};
/*******************************************************************************************/
void Delay(unsigned char a) //延时子程序     
{
    unsigned char j;                                                                                             
	while(a-- != 0)                                              
	{
	     for (j = 0; j < 100; j++);                                                             
	}                                                                                           
}
/*******************************************************************************************/ 
void Disp(void)
{   
		P2_0= 0;//第7个数码管显示十六进制的十位
		P0 = SEG_TAB1[ (i / 16 )];	
		Delay(N);	
		P2_0 = 1;		

		P2_1 = 0;//第8个数码管显示十六进制的个位
		P0 = SEG_TAB1[ i % 16 ];	
		Delay(N);	
		P2_1 = 1;
}
/*******************************************************************************************/
void timeint(void) interrupt 1 using 2//定时器0中断处理
{
	TH0=0XFD;     //12M: TH0=0XFC;TL0=0XE0;11.0592:TH0=0XFD;TL0=0X1E;
	TL0=0X1E;     // 设定时值为800us  500:FE0C

	if (IRCON<4)
	{
		if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
		{
			IRCON2++;
			IRCode[IRCON]=IRCode[IRCON]<<1;     //每读一次放入变量中的二进制的一个位,每次左移一位
			IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
		}
		else
		{
			IRCON++;  //填满一个字节,指向下一个变量
			IRCON2=0; //计数清零
		}
	}
	else
	{
		TR0 = 0; //关闭定时器
		ET0 = 0; //定时器0中断关闭
		if ((IRCode[1] != 0xFF) && (IRCode[2] != 0xFF))
		{
			if (IRCode[1] == 0x55)
			{   
			   DT = 1;			
			}
		}
	}
}

/***********************************************************************************/
void INT0Fun(void) interrupt 0 using 2//INT0中断
{
	EX0 = 0; //外部中断0关闭
	ET0 = 1; //定时器0中断打开
	TH0=0XFD;
	TL0=0X1E; //设定时值为800us

	for (IRCON=0; IRCON<3; IRCON++)
		 IRCode[IRCON] = 0;

	IRCON = 0;
	IRCON2 = 0; //计数清零
	TR0 = 1;//开始计数
}
/************************************************************************************/
void main(void)
{
	unsigned int de;
	TMOD = 0x01; //定时器0方式1
	EA = 1;      //允许CPU中断
	IT0 = 1;     //INT0下降沿有效
	EX0 = 1;     //开INT0中断
  	P1 =  0xff;
	do
	{	
	    Disp();Led = 1; Disp();    //LED点亮     //调用显示程序
		Disp();Led = 0; Disp();    //LED熄灭     //调用显示程序
		if (DT)
		{
			EX0=0;  //关闭外中断
			for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键
			     Led = 1;
			for (de=0; de<30000; de++)
			     Led = 0;
			     DT = 0;
	        for (i=0; i<256; i++)
			{
                if(daima[i] ==  IRCode[2])
				{
				    P1_3 = 0; 
                    Disp();
					break;//当daima[i]=IRCode[2]时跳出循环
				}
			}
		}
		EX0 = 1;//开中断
		Disp();     //调用显示程序
	}while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -