/********************************
**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]);
}
51單片機STC89C52 紅外解碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.