历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2018年06月21日 | 51单片机STC89C52 红外解码

2018-06-21 来源:eefocus

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

**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]);  

}  


推荐阅读

史海拾趣

Cadeka公司的发展小趣事

在竞争激烈的电子行业中,Cadeka公司为了增强自身实力,积极寻求并购与整合的机会。公司先后收购了几家具有技术优势和市场份额的小型电子企业,通过整合资源和技术,实现了优势互补和协同效应。这些并购不仅提升了Cadeka公司的技术实力和市场地位,还为公司带来了更多的发展机遇。

Artaflex公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。为了保持领先地位,Artaflex公司积极寻求与其他企业的技术合作。通过与一家知名半导体公司的合作,双方共同研发了一款新型芯片,不仅提升了产品的性能,还降低了生产成本。这一合作不仅增强了Artaflex的技术实力,也为其打开了更广阔的市场空间。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

进入21世纪后,中国市场的快速发展吸引了Futaba Electric的注意。为了更好地服务于中国市场,公司于2002年在北京成立了双叶电子科技开发(北京)有限公司。这家子公司专营Futaba Electric的全线产品,包括VFD真空荧光显示管、RC无线遥控设备等。通过深耕中国市场,Futaba Electric不仅扩大了产品销量,还进一步提升了品牌知名度和影响力。

Analogix Semiconductor公司的发展小趣事

Fukushima Futaba Electric Co., Ltd.(以下简称“Futaba Electric”)的创立可以追溯到1948年,由熊本县出身的卫藤五郎和北海道出身的细矢礼二在千叶县共同创立。公司名“Futaba”取自两人故乡的首字,寓意着双叶的结合与协作。初期,Futaba Electric专注于电气设备的制造与研发,凭借创始人的远见卓识和不懈努力,逐渐在电子行业崭露头角。这一时期,公司主要生产基础的电气元件,如电阻器、电容器等,为后续的发展奠定了坚实的基础。

Coleman Cable Inc公司的发展小趣事

品质一直是Coleman Cable的生命线。公司建立了严格的质量控制体系,从原材料采购、生产过程到成品检验,每一个环节都严格把关。这种对品质的执着追求,使得Coleman Cable的产品在市场上享有良好的声誉。同时,公司还积极听取客户反馈,不断改进产品和服务,赢得了客户的信赖和忠诚。

雅特力(Artery)公司的发展小趣事

雅特力在追求经济效益的同时,也高度重视企业社会责任和可持续发展。公司积极参与社会公益事业,通过捐款、捐物等方式支持教育、环保等领域的发展。此外,雅特力还注重环境保护和资源利用,采用环保材料和节能技术,努力降低生产过程中的能耗和排放。这些举措不仅有助于提升公司的社会形象,也为实现可持续发展做出了积极贡献。

问答坊 | AI 解惑

430初学入门资料总结

刚开始学习MSP430开发。搜集了点有用的资料和大家分享。希望在后续的开发中能不断完善…

查看全部问答>

铁电的时序是不是需要模拟?

本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河 ATMEL的扩展FLASH好象可以直接直接访问…

查看全部问答>

请问在哪里可以下载到EZDriverInstaller的源程序?

因为工作需要,需要看DriverStudio 中的工具NuMega EZDriverInstaller的源代码,请问在哪里可以下载到?谢谢!…

查看全部问答>

交换开发板

我现在想用lm3s8962或者TMS320F交换lpc2000系列开发板。 联系方式:kxs002@163.com QQ:81960697…

查看全部问答>

一个基于msp430的EKG制作

一个基于msp430的EKG制作…

查看全部问答>

关于F28335和CPLD无法同时工作

是这样的,我的电路上使用了一片DSP F28335,还有一片芯片XA2c256。现在板子的问题是,每当DSP在工作的时候,CPLD就无法和赛灵思的下载器连接在一起,提示的错误是,芯片的IDCODE是全部为0.也就是无法连接。到最后我把DSP的晶振去掉了,结果CPLD就 ...…

查看全部问答>

求一篇dcdc直流开关电源的设计论文

具体要求 1、 开关电源与线性电源进行对比,总结开关电源的优点。 2、 在对开关电源的整体结构进行了介绍的基础上,对开关电源的主回路和控制回路进行设计:在主回路中整流电路采用单相桥式、功率转换电路采用单端正激功率转换电路、采用增加副边 ...…

查看全部问答>

68013的开发板成本价出售

本帖最后由 wu2345 于 2014-3-4 12:03 编辑 68013的开发板成本价出售。板上把68013的IO都引出来了,方便使用。 价格68013(20)+板子(10)+TLV1117(1)+方口usb(1)+晶振、按键和其他阻容、贴装费(共8)。要eeprom的根据容量适当收取费用,保 ...…

查看全部问答>

晒设计方案+STM32F429i开发板之触摸屏

     F429这块板子上最主要的亮点也就属这块屏了。带触摸的屏幕,输入,输出都有了。      关于屏幕的实验,官方例程中一共有4个。      今天看看它的触摸实验,我所选的是他的一个 ...…

查看全部问答>