51微控制器STC89C52 紅外解碼
阿新 • • 發佈:2019-02-09
/******************************** **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]); }