51單片機STC89C52 紅外解碼

/********************************
**For:Car mp3 IrControler
**Author:YWZ
**Date:2013/10/16
********************************/
#include "reg52.h"

typedef unsigned char U8; 
typedef unsigned int U16;

U8 code aHexIndex[]={
'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'
};
U8 xdata aRx[16]={0};
U8 xdata u8RxPos=0;
U8 aHexStr[6]={0};
U16  u16Tim0Cnt=0;
U16 xdata aTimSap[40]={0};
U8 xdata aBin[34]={0};
U16  u16TimSapP=0;
U16 u16Tmp1=0;
U16 u16CntIrStart=0;
U8 u8UsrCode=0;
U8 u8UsrCodeA=0;
U8 u8Oper=0;
U8 u8OperA=0;
union _tagFlag{
	struct _tag{
		volatile unsigned char IrStart:1,
							   IrRecvDone:1,
							   IrDecDone:1;
	}bitt;
	unsigned int uiFlag;
}uFlag;

void uart_Init();
void uart_SendByte(U8 dat);
void uart_SendString(U8 *p);
void ext0_Init();
void timer0_InitMode1();
void timer0_InitMode2();
void uart_PrtHexSu(U8 dat);

void main(void)
{
	uFlag.uiFlag=0;
	uart_Init();
	uart_SendString("\r\nSys starting...");
	ext0_Init();
	timer0_InitMode2();	
	while(1)
	{
		if(uFlag.bitt.IrRecvDone==1)
		{
			uFlag.bitt.IrRecvDone=0;
			uart_SendString("\r\n紅外來了");
			u16Tmp1=((aTimSap[1]>aTimSap[0])?(aTimSap[1]-aTimSap[0]):(aTimSap[0]-aTimSap[1]));
			if((u16Tmp1>50)&&(u16Tmp1<58)) //13.5ms
			{
				uart_SendString("\r\nHead 13.5ms");
				for(u16Tmp1=33;u16Tmp1>0;u16Tmp1--)
				{
					aTimSap[u16Tmp1] = aTimSap[u16Tmp1]-aTimSap[u16Tmp1-1];				
				}
				for(u16Tmp1=2;u16Tmp1< 34;u16Tmp1++)
				{
					if((aTimSap[u16Tmp1]>=3)&&(aTimSap[u16Tmp1]<=5))
					{
						aBin[u16Tmp1-2]=0;		
					}
					else if((aTimSap[u16Tmp1]>=7)&&(aTimSap[u16Tmp1]<=9))
					{
						aBin[u16Tmp1-2]=1;		
					}
					else
					{
						uart_SendString("\r\nOut of Scope!");
						break;
					}
					uFlag.bitt.IrDecDone=1;
				}
				if(uFlag.bitt.IrDecDone==1)
				{
					uFlag.bitt.IrDecDone=0;
					uart_SendString("\r\nIr Decoded Ok!");
					for(u16Tmp1=0;u16Tmp1<8;u16Tmp1++)
					{
						u8UsrCode<<=1;
						if(aBin[u16Tmp1]==1)
							u8UsrCode|=1;	
					}
					for(u16Tmp1=0;u16Tmp1<8;u16Tmp1++)
					{
						u8UsrCodeA<<=1;
						if(aBin[u16Tmp1+8]==1)
							u8UsrCodeA|=1;	
					}
					for(u16Tmp1=0;u16Tmp1<8;u16Tmp1++)
					{
						u8Oper<<=1;
						if(aBin[u16Tmp1+16]==1)
							u8Oper|=1;	
					}
					for(u16Tmp1=0;u16Tmp1<8;u16Tmp1++)
					{
						u8OperA<<=1;
						if(aBin[u16Tmp1+24]==1)
							u8OperA|=1;	
					}
					uart_SendString("\r\n用戶碼:");
					uart_PrtHexSu(u8UsrCode);
					uart_SendString("\r\n用戶反碼:");
					uart_PrtHexSu(u8UsrCodeA);
					uart_SendString("\r\n操作碼:");
					uart_PrtHexSu(u8Oper);
					uart_SendString("\r\n操作反碼");
					uart_PrtHexSu(u8OperA);
				}
			}
			else if((u16Tmp1>35)&&(u16Tmp1<41)) //9.5ms 
			{
				uart_SendString("\r\nHead 9.5ms");
			}
			else if((u16Tmp1>15)&&(u16Tmp1<21)) //4.5ms
			{
				uart_SendString("\r\nHead 4.5ms");
			}
			else
			{
				uart_SendString("\r\nHead Ng");
			}
			EX0=1;
		}
	}	
}

void uart_Isr(void) interrupt 4 using 1
{
	ES=0;
	if(u8RxPos>15)
		u8RxPos=0;
	aRx[u8RxPos++] = SBUF;
	SBUF=aRx[u8RxPos-1];
	while(TI==0);
	TI=0;
	RI=0;
	ES=1;
}

void ex0_Isr() interrupt 0 using 2
{
	aTimSap[u16TimSapP] = u16Tim0Cnt;
	u16TimSapP++;
	if(u16TimSapP>39)
		u16TimSapP=0;
	if(u16TimSapP==1)
	{		
		u16CntIrStart=0;
		uFlag.bitt.IrStart=1;
	}
}

void timer0_Isr() interrupt 1 using 3
{
	u16Tim0Cnt++;
	if(u16Tim0Cnt%1999==0)
	{
		P1 ^= 0xff;		
	}
	if(uFlag.bitt.IrStart==1)
	{
		u16CntIrStart++;
		if(u16CntIrStart>=370)
		{
			uFlag.bitt.IrStart=0;
			u16CntIrStart=0;
			if(u16TimSapP==0x22)
			{
				EX0=0;
				uFlag.bitt.IrRecvDone=1;
			}
			u16TimSapP=0;
		}
	}
}

void ext0_Init()
{
	IT0=1;
	EX0=1;
	EA=1;
}

#if 0
void timer0_InitMode1()
{
	TMOD = TMOD &(~15) |1; //定時器0工作方式1
	TH0=(65536-46083)/256; //11.0592M晶振,定時50ms溢出
	TL0=(65536-46083)%256;
	ET0=1;
	TR0=1;
	EA=1;
}
#endif

void timer0_InitMode2()
{
	TMOD = TMOD &(~15) |2; //定時器0工作方式2
	TH0=(255-230); //11.0592M晶振,定時250us溢出
	TL0=(255-230);
	ET0=1;
	TR0=1;
	EA=1;
}

void uart_Init()
{
	TMOD = 0x20;
	TH1 = 0xfd;
	TL1 = 0xfd;
	SCON = 0x50;
	PCON &= (~(1<<7));
	TR1 = 1;
	TI = 0;
	RI=0;
	ES=1;
	EA=1;
}

void uart_SendByte(U8 dat)
{
	ES=0;
	SBUF=dat;
	while(!TI);
	TI=0;
	ES=1;
}

void uart_SendString(U8 *p)
{
	while(*p)
	{
		uart_SendByte(*p++);
	}
}

void uart_PrtHexSu(U8 dat)
{
	aHexStr[2]=aHexIndex[dat/16];
	aHexStr[3]=aHexIndex[dat%16];
	aHexStr[4]=' ';
	aHexStr[5]=0;
	uart_SendString(&aHexStr[2]);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章