×
单片机 > 单片机程序设计 > 详情

51单片机STC89C52 红外解码

发布时间:2020-06-08 发布时间:
|

/******************************** 

**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  红外解码

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
minis3c2440移植之内核移植