红外解码c语言,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]);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值