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

📄 cont.c

📁 自己写的51接收遥控器解码
💻 C
字号:
#include "reg51.h" 
typedef unsigned char  u8;
typedef unsigned short u16;
typedef unsigned long  u32;
typedef char           s8;
typedef long           s32;
typedef short          s16;
//p0 = R2,R1,R0,C4,C3,C2,C1,C0

#define	X_RF		0xAF	//R1,C4	
#define	X_STOP		0XB7	//C3
#define	X_PAUSE		0XBB	//C2	
#define	X_FF		0XBD	//C1
#define	X_PLAY		0XBE	//C0
#define	X_MENU		0X6F	//R2,C4
#define	X_UP		0X77	//C3
#define	X_DOWN		0X7B	//C2
#define	X_SELECT	0X7D	//C1
#define	X_REC		0X7E	//C0	


sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;


void SCI_INI(void);      //sci_a init
u8 key(void);			//check key
void delay(int);
void sendkey(u8);
void Time_intt(void);		//0.2ms 定时中断
void Com_sucess(void);

u8 key_flag_a;
u8 key_flag_b;
u8 key_flag_c;
u8 last_flag;

u8 ch_flag;
u8 funt_flag;

u8	ch=1;
u16	com_times=0;
u32	Buffer;
u8	com_bits=0;
u8	bit_cnt=0;
u8	send_tmp=0;
u8	out_flag=0;
bit last_state;
bit	bit_state;
bit	bit_statex;


void main(void)
{
	u8 k;
	u8	flag=0;  	//funtion / control flag,1: control, 0:funtion 

	u8	key_flag2;		//pressing key  flag,1:pressing ,0:no key
	


	SCI_INI();	

	while(1)	//测试接收的号码
	{
		if(out_flag)
		{
		//for test-----------------------
			SBUF=0x55;
			while(!TI);
			TI=0;
			
			SBUF=0xaa;
			while(!TI);
			TI=0;

			out_flag = 0;
			
			SBUF=Buffer >> 24;
			while(!TI);
			TI=0;
			
			SBUF=Buffer >> 16;
			while(!TI);
			TI=0;
				
			SBUF=Buffer >> 8;
			while(!TI);
			TI=0;

			SBUF=Buffer;
			while(!TI);
			TI=0;
		//---------------------------------
	
		}
	//	SBUF=0x55;
	//	while(!TI);
		TI=0;
	}

	while(1)
	{
		if (!(P2 & 0x01))   //test funtion key
		{				//press the funtion key
			delay(6);
			if (!(P2 & 0x01)  ) 
			{
				if (funt_flag==0)
				{
					if(flag==0x55) 
					{
						flag=0;		//control
						
					}
					else 
					{
						flag=0x55;
					
					}
					funt_flag=0x55;
				}
			}
		}
		 else 
			{
			delay(6);
			if (P2 & 0x01) funt_flag=0;   //release funtion key
			}	
///8********************************
		if(flag==0x55)   //funtion or control display
			{			//control
			//*****************************************8
			 if (!(P2 & 0x02))   //test ch key
				{
				delay(6);
				if (!(P1 & 0x20) ) 
					{
					if (ch_flag==0)
						{
						ch++;
						if (ch==5) ch=1;
						ch_flag=0x55;
						}
					
					}
		
				}
				else 
				{
				delay(6);
				if (P2 & 0x02) ch_flag=0;   //release channel key
				}
			P2_2=0;
			P2_3=1;

			P3=0xff;		//245 not select
			

			P1=0x1f;
			}
		else 
			{			//funtion
			P2_2=1;
			P2_3=0;

			P3=0x0f;
			

			P1=0xff;
			P2_4=1;      //off channel led
			P2_5=1;
			P2_6=1;
			P2_7=1;
			}


		if (flag)
			{
					switch (ch)			//display the channel led
						{
						case 1:
							P2=(P2 & 0xf) | 0x70;
							break;
						case 2:
							P2=(P2 & 0xf) | 0xb0;
							break;
						case 3:
							P2=(P2 & 0xf) | 0xd0;
							break;
						case 4:
							P2=(P2 & 0xf) | 0xe0;
							break;
						default:
							break;
						}
					P2_0=1;
					P2_1=1;
			k=key();
			if(k) 
				{
				
				if (!key_flag2) 
					{
					key_flag2=0x55;
					switch (k)
					{
						case 30:

							if (key_flag_a) key_flag_a=0;	//a new key
							else key_flag_a=0x55;
							break;
					    case 50:
							if (key_flag_b) key_flag_b=0;	//a new key
							else key_flag_b=0x55;
							break;
						case 90:
							if (key_flag_c) key_flag_c=0;	//a new key
							else key_flag_c=0x55;
							break;
						default:
							break;
					}
					sendkey(k);
					}
				
				}
			else 
				{
				k=key();
				if (key_flag2)		//stop key
					{
					key_flag2=0;
					sendkey(0xff);
						
					}
				}

			}
	}
}

void SCI_INI(void)
{	
	P0=0XFF;
	P1=0XfF;
	P2=0XFF;
	P3=0X0f;

	TMOD=0x22; //timer1  use as sci bord ,timer0 use as 16bit counter

	TL1=0XFd;
	TH1=0xfd; //sci bord speed=9600 when 11.052Mhz./12.000

	TL0=91;
	TH0=91;	//0.178ms中断

	TR1=1;     //timer1 enable
	TR0=1;



	PCON=0X0;
	SCON=0X40;

	IE=0X82;	//开定时0中断	

}

u8 key(void)
{
	u8 temp;
	temp=P1 & 0x1f;
	if (temp != 0x1f)
		{
		delay(6);
		P1=0xdf;
		temp=P1 & 0x1f;
		if (temp==0x1f) 
			{
			P1=0xbf;
			temp=P1 & 0x1f;
			if (temp==0x1f) 
				{
				P1=0x7f;
				temp=P1 & 0x1f;
				if (temp==0x1f) temp=0;
				else temp=~P1;
				}
			else temp=~P1; 
			}
		else temp= ~P1;
		}
	else temp=0;
	P1=0x1f;
 	return temp;
}

void sendkey(u8 kk)
{	
	u8 k_code;
	

	switch (kk)
	{
		case 0x30:		//key1
			if (key_flag_a) k_code=0x0e;
			else k_code=0xf;
			break;
		case 0x28:		//2
			k_code=0x03;
			break;
		case 0x24:		//3
			k_code=0x02;
			break;
		case 0x22:		//4
			k_code=0x01;
			break;
		case 0x21:		//5
			k_code=0xee;
			break;
		case 0x50:		//6
			if (key_flag_b) k_code=0x0b;
			else k_code=0x2b;
			break;
		case 0x48:		//7
			k_code=0x06;
			break;
		case 0x44:		//8
			k_code=0x05;
			break;
		case 0x42:		//9
			k_code=0x09;
			break;
		case 0x41:		//10
			k_code=0x0;
			break;
		case 0x90:		//11
			if (key_flag_c) k_code=0x32;
			else k_code=0x31;
			break;
		case 0x88:		//12
			k_code=0x07;
			break;
		case 0x84:		//13
			k_code=0x04;
			break;
		case 0x82:		//14
			k_code=0x08;
			break;
			
		case 0x81:		//15
			k_code=0x0;
			break;
		case 0xff:		//stop all
			k_code=0xff;
			break;
		default:
			k_code=0;
			break;
	}
	if (k_code) 
	{	
		if (k_code==0xee) k_code=0;

		//P2_3=0;
		
		SBUF=0xeb;
		while(!TI);
		TI=0;
		
		SBUF=0x20;
		while(!TI);
		TI=0;
		
		SBUF=ch;
		while(!TI);
		TI=0;
		
		SBUF=0xaa;
		while(!TI);
		TI=0;
		
		SBUF=k_code;
		while(!TI);
		TI=0;
		
		SBUF=0x55;
		while(!TI);
		TI=0;

	//	P2_3=1;
	}

}

void Time_intt() interrupt 1 
{
//	P1_0=P3_0;
//	return;
//	if (com_times==255)
//		P1=~P1;
//	return;
	com_times++;

	P1_2 = P3_0;
	if(bit_statex == P3_0)	//接收滤波
		bit_state = P3_0;
	
	if(bit_state != last_state)	//跳变
	{
		if(com_bits == 0 )	//引导码
		{
			if((com_times > 20) && (last_state == 0))
				com_bits =1;	
		}
		
		else
		{
			if(com_times > 20)	//接收超时,错误
			{
				if(com_bits > 1)
				{
					SBUF = com_bits;
					com_bits = 0;
					P1_0 =0;
					
				}
			}
			else if(com_times > 6)	//收到 1
			{
				Buffer = (Buffer << 1) | 1; 
				com_bits ++;
			}
			else if((com_times > 1) && (last_state == 1))	//收到 0
			{
				Buffer = (Buffer << 1) ; 
				com_bits ++;
			}
		}
		
		com_times = 0;	//定时计数清零

	}
	if(com_bits == 32)
	{
		Buffer <<= 1;
		Com_sucess();
		com_bits = 0;
		out_flag =1;
	}
/*
	if (com_times < 50)	//接收中
	{

		Buffer = (Buffer << 1) | (P3_0);
		com_bits++;
		
		if(com_bits == 8 ) 	//接收完毕
		{
			com_bits = 1;
			
			//Com_sucess();		//模拟键盘输出
			//P1_0=0;
			SBUF=Buffer;
			P1_0=0;			//串口发送号码到pc,测试用
		}
		
	} 
	else
	{
		com_bits = 0;
	}*/
	if(com_times >= 300) 		//间隔时间停留,输出释放
	{
		com_times = 300;
		com_bits = 0;
		bit_cnt = 0;
		Buffer = 0;
		P1_0=1;
	}

	last_state = bit_state;
	bit_statex = P3_0; 
}

void Com_sucess(void)
{


	switch (Buffer & 0x3F)
	{
		case 1:
			P0 = X_RF;
			break;
		case 2:
			P0 = X_STOP;
			break;
		case 3:
			P0 = X_PAUSE;
			break;
		case 4:
			P0 = X_FF;
			break;
		case 5:
			P0 = X_PLAY;
			break;
		case 6:
			P0 = X_MENU;
			break;
		case 7:
			P0 = X_UP;
			break;
		case 8:
			P0 = X_DOWN;
			break;
		case 9:
			P0 = X_SELECT;
			break;
		case 0X1E:
			P0 = X_REC;
			break;

		default:
			break;
    }
}


void delay(int ms)
{
	int i,j;
	for (i=0;i<ms;i++)
		for(j=0;j<255;j++);
}

⌨️ 快捷键说明

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