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

📄 cont0822.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;

sbit P1_0 = P1^0;
sbit P1_2 = P1^2;
/*------------------------------------------------
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;
u8 ch_flag;
u8 funt_flag;
u8	ch=1;
u16	Com_times=0;
u16	Buffer;
u8	Com_bits=0;
bit Last_state;

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
//	u8	i;

	SCI_INI();	

	while(1)
	{
	P2=9;
	}

	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_7=1;		//245 not select
			P3_6=1;

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

			P3_7=0;
			P3_6=0;

			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;
					if (key_flag) key_flag=0;	//a new key
					else key_flag=0x55;
					
					sendkey(k);
					}
				
				}
			else 
				{
				k=key();
				if (!k)		//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=2400 when 11.052Mhz.

	TL0=77;
	TH0=77;	//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) 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) k_code=0x0b;
			else k_code=0x2b;
			break;
		case 0x48:		//7
			k_code=0x06;
			break;
		case 0x44:		//8
			k_code=0x04;
			break;
		case 0x42:		//9
			k_code=0x09;
			break;
		case 0x41:		//10
			k_code=0x0;
			break;
		case 0x90:		//11
			if (key_flag) k_code=0x32;
			else k_code=0x31;
			break;
		case 0x88:		//12
			k_code=0x07;
			break;
		case 0x84:		//13
			k_code=0x05;
			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_2;
//	return;

	Com_times++;
//	if (Com_times==255)
//		P1=~P1;
//	return;

	if (Com_bits)	//接收中
	{

		//P1=0;	//test

		if (Last_state ^ P3_0)	//跳变
		{
			if((Com_times > 7) && (Com_times < 13))	//接收正确
			{
				Buffer = (Buffer << 1) | (~P3_0);
				Com_bits++;
				Com_times =0;
			}
			else if(Com_times > 13)		//接收码超时出错 
			{
				Com_bits=0;
				Com_times=0;
				P1_2=0;
			}
			if(Com_bits == 14 ) 	//接收完毕
			{
				Com_bits = 0;
				Com_times = 0;
				Com_sucess();		//模拟键盘输出
				P1_0=0;
			}
		}
	} 
	else if (P3_0 == 0)
	{
		if(Com_times > 200)   	//码间隔足够
		{
			Com_bits =1;
			Com_times = 0;
		}
		else Com_times = 0;
	}
	if(Com_times >= 400) 		//间隔时间停留,输出释放
	{
		Com_times = 250;
		Com_bits = 0;
		P1=0xFF;
	}
	Last_state = P3_0;
}

void Com_sucess(void)
{
	switch (Buffer & 0x37)
	{
		case 23:
			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 + -