新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR紅外發(fā)送和接收的頭文件

        AVR紅外發(fā)送和接收的頭文件

        作者: 時間:2016-11-18 來源:網絡 收藏
        *函數庫說明:包含了紅外通訊常用收發(fā)函數和工具*
        *版本說明:1.0Bate*
        *作者:xky183*
        *日期:2003年7月*
        *修改:GorgonMeducer*
        *日期:2005年4月21日*
        *平臺:RC8M*
        **
        *說明:紅外通訊使用的格式為字節(jié)直接發(fā)送模式,提供4位自校驗的函數*
        *通訊時記錄載波寬度。未使用串口幀格式。軟件載波。*
        **
        *硬件連接說明:PC5發(fā)送數據(可以修改宏定義)外中斷0接收數據*
        **
        *使用說明:添加必要的代碼到定時器中斷,并且使用頭函數中的定時器初*
        *始化程序。使用程序中的外中斷初始化程序,添加必要的部分*
        *到外中斷處理程序中。*
        *發(fā)送數據的時候,調用函數RaySend(),也可以調用KeyDeal()*
        *來處理并發(fā)送4位的控制信號。*
        *對于接收信號,直接從Ordar或者RayDataIn中讀取收到的字節(jié)*
        *請自己清空RayDataIn變量*
        *接受到的數據保存在變量ray_ordar*
        *開啟紅外線接收時要開外中斷0:GICR=0x40;*
        ********************************************************************/


        /*------------------------------------------------------------------*
        *紅外發(fā)射程序*
        *------------------------------------------------------------------*/


        #defineray_IO_onPORTC|=0B00100000;
        #defineray_IO_offPORTC&=0B11011111;
        #defineT1I_onTIMSK|=0B00000001;
        #defineT1I_offTIMSK&=0B11111110;
        /*---------------------*/
        /*紅外發(fā)射全局變量*/
        /*---------------------*/
        charray_Flag=0;
        charray_Sign=0;

        /*---------------------*/
        /*函數聲明區(qū)*/
        /*---------------------*/
        charKeyDeal(charTempData);//數據編碼發(fā)送函數
        voidRaySend(unsignedcharDataTemp);//數據紅外發(fā)送函數
        voiddelay_1ms(void);
        voidDelay_Ms(unsignedintn);
        voidTimer0_init(void);
        voidray_send_init(void);

        /***********紅外線發(fā)射*****************
        voidray_send_init(void)*
        {*
        Timer0_init();*
        }*
        **************************************/

        /********************************************************************
        *函數說明:1MS延時程序*
        ********************************************************************/
        voiddelay_1ms(void)
        {
        unsignedinti;
        for(i=1;i<(unsignedint)(8*143-2);i++)
        ;
        }

        /********************************************************************
        *函數說明:MS延時程序*
        *輸入:需要延時的時長*
        ********************************************************************/
        voidDelay_Ms(unsignedintn)
        {
        unsignedinti=0;
        while(i
        {
        delay_1ms();
        i++;
        }
        }
        /*-------------------------------------------------------------------
        *發(fā)射程序需要定時器0的支持,請粘貼以下代碼到主程序*
        --------------------------------------------------------------------/
        /********************************************************************
        *函數說明:定時器0中斷處理程序,用來產生40MHz的載波*
        *********************************************************************
        #pragmainterrupt_handlertimer0_ovf_isr:10
        voidtimer0_ovf_isr(void)//需要定時器0的中斷支持本函數庫
        {
        TCNT0=0xa5;
        ray_Flag++;
        ray_Sign=1;
        }
        /********************************************************************
        *函數說明:定時器0初始化程序*
        *********************************************************************
        voidTimer0_init(void)
        {
        TCCR0=0x01;//CK
        TCNT0=0x9b;

        }
        -------------------------------------------------------------------*/

        /*******************************************************************
        *函數說明:紅外發(fā)送程序*
        *輸入:要發(fā)送的數據*
        *******************************************************************/
        voidRaySend(unsignedcharDataTemp)
        {
        unsignedchari=0,DataBit=0;

        ray_Flag=0;
        ray_Sign=0;
        T1I_off;

        for(i=0;i<8;i++)
        {
        DataBit=DataTemp&0x01;
        if(DataBit==0)
        {
        T1I_on;
        while(ray_Flag<40)
        {
        ray_IO_on;//產生高電平
        ray_Sign=0;
        while(ray_Sign!=1);
        ray_IO_off;//產生低電平
        ray_Sign=0;

        while(ray_Sign!=1);
        }
        ray_Flag=0;
        ray_Sign=0;
        ray_IO_off;//產生低電平
        //13.125us的時間
        while(ray_Flag<=40);//50
        T1I_off;
        ray_Flag=0;
        ray_Sign=0;

        DataTemp=DataTemp>>1;
        }
        else
        {
        T1I_on;
        while(ray_Flag<80)
        {ray_IO_on;//產生高電平
        ray_Sign=0;
        while(ray_Sign!=1);
        ray_IO_off;//產生低電平
        ray_Sign=0;

        while(ray_Sign!=1)
        ;
        }
        ray_Flag=0;
        ray_Sign=0;
        ray_IO_off;//產生低電平
        //13.125us的時間
        while(ray_Flag<=40);//50
        T1I_off;
        ray_Flag=0;
        ray_Sign=0;
        DataTemp=DataTemp>>1;
        }
        }

        ray_Flag=0;
        ray_IO_off;//為低電平
        i=0;
        T1I_off;

        Delay_Ms(6);//兩個字節(jié)的數據之間間隔
        }

        charKeyDeal(charTempData)
        /********************************************************************
        *函數說明:數據格式轉換(4位數據加上自己的反碼作交驗)*
        *輸入:需要轉換和發(fā)送的信息*
        *輸出:轉換好的數據,并自動發(fā)送數據*
        ********************************************************************/
        {
        charTempReturn=0;
        chari=0;
        TempReturn=~TempData&0x0f;
        TempReturn<<=4;
        TempReturn|=0x0f&TempData;
        for(i=0;i<10;i++)
        {
        RaySend(TempReturn);
        Delay_Ms(6);
        }
        returnTempReturn;
        }




        /*------------------------------------------------------------------*
        *紅外接受程序*
        *------------------------------------------------------------------*/

        /*---------------------*/
        /*紅外接收全局變量*/
        /*---------------------*/
        charray_singal_num=0;//接受信號
        charray_data_in=0;//ray_data_in為接收的數據
        charray_symbol=0;
        charray_count_array[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位數組
        charray_ordar=0;//最終得到的命令(雞肋)

        /*---------------------*/
        /*函數聲明區(qū)*/
        /*---------------------*/
        voidray_judger(void);
        voidint0_init(void);
        voidTimer1_init(void);

        /*******紅外線接收**********
        voidray_receive_init(void)
        {
        int0_init();
        Timer1_init();
        }
        ***************************/


        /*-------------------------------------------------------------------
        *發(fā)射程序需要定時器1和外中斷0的支持,請粘貼以下代碼到主程序*
        --------------------------------------------------------------------/
        /********************************************************************
        *函數說明:定時器1初始化程序*
        *********************************************************************
        voidTimer1_init(void)
        {
        TCNT1=0;
        TCCR1B=0x03;
        }
        /********************************************************************
        *函數說明:外中斷0初始化程序*
        *********************************************************************
        voidint0_init(void)
        {
        MCUCR=0x02;//開中斷0、下降沿觸發(fā)脈沖
        GIFR=0Xff;
        }
        #pragmainterrupt_handlerext_int0:2//M8參考外中斷向量
        /********************************************************************
        *函數說明:外中斷0中斷處理程序*
        *********************************************************************
        voidext_int0(void)
        {
        chartemp=0;
        temp=TIMSK;
        TIMSK=0;
        if(ray_symbol==0)
        {
        if(TCNT1>=0x00ff)//大于4MS則重置指針
        {
        ray_singal_num=0;
        }
        TCNT1=0X00;//0.5ms記數值為31
        MCUCR=0X03;//INT0上升沿觸發(fā)
        ray_symbol=1;
        }
        else
        {
        if((TCNT1H==0)&&(TCNT1<=0x00ff))
        {
        ray_count_array[ray_singal_num]=TCNT1L;
        ray_singal_num++;
        if(ray_singal_num==8)
        {
        ray_singal_num=0;
        ray_judger();
        }
        ray_symbol=0;
        }
        else
        {

        ray_singal_num=0;
        }

        MCUCR=0X02;//INT0下降沿觸發(fā)
        TCNT1=0;
        }
        TIMSK=temp;
        }
        /*******************************************************************/

        /********************************************************************
        *函數說明:紅外信號處理程序*
        ********************************************************************/
        voidray_judger(void)
        {
        chari=0;
        ray_data_in=0;

        for(i=0;i<8;i++)//加入適當的冗錯處理
        {
        if(ray_count_array[i]<0x38)//0.5ms為低電平
        {
        , ;ray_data_in&=~(1<
        }
        if(ray_count_array[i]>=0x38)//1ms為高電平
        {
        ray_data_in|=(1<
        }
        }
        ray_ordar=ray_data_in;
        }


        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 南靖县| 玉环县| 盐亭县| 龙山县| 延津县| 曲沃县| 梓潼县| 株洲市| 澄江县| 新民市| 竹山县| 宕昌县| 沁源县| 怀远县| 泗阳县| 泰和县| 延津县| 淮安市| 厦门市| 连云港市| 武城县| 铜陵市| 台南县| 大姚县| 濮阳县| 澳门| 黔江区| 克拉玛依市| 即墨市| 临江市| 梁平县| 惠安县| 鲜城| 云阳县| 乌兰浩特市| 游戏| 武陟县| 长顺县| 关岭| 东丰县| 鞍山市|