新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)紅外遙控編碼與解碼的問(wèn)題分析

        PIC單片機(jī)紅外遙控編碼與解碼的問(wèn)題分析

        作者: 時(shí)間:2012-09-02 來(lái)源:網(wǎng)絡(luò) 收藏

        假如用中斷的話(huà)也可用時(shí)間查詢(xún)的方法,只是接收口改用帶中斷的口線(xiàn);RB4--RB7,CCP1,CCP2,都可以。建議不要用RB0(他當(dāng)按鍵輸入最好用);

        本文引用地址:http://www.104case.com/article/170942.htm

        還有就是時(shí)的容陷和誤碼處理(有一種寫(xiě)法是在移位時(shí)利用進(jìn)位標(biāo)制C同時(shí)移位;我個(gè)人認(rèn)為不太好,因?yàn)橹灰钜晃粵](méi)接收到,整個(gè)接收到的都是誤碼且浪費(fèi)時(shí)間)

        原理是接收的逆過(guò)程

        例程如下(用來(lái)發(fā)6221;分頻比為256)

        ;///////////////////////////////////////////////////////////////////////////////////////////////
        READDIGT:
        MOVF SENDLOOP,0
        ADDWF PC,1
        GOTO SENDC4
        GOTO SENDC3
        GOTO SENDC2
        GOTO SENDC1
        GOTO SENDC0
        ;///////////////////////////////////
        SENDC0:
        MOVF C4COUNT,0;;讀要發(fā)的數(shù)據(jù)(假設(shè)要發(fā)5個(gè)字)
        RETURN
        SENDC1:
        MOVF C3COUNT,0
        RETURN
        SENDC2:
        MOVF C2COUNT,0
        RETURN
        SENDC3:
        MOVF C1COUNT,0
        RETURN
        SENDC4:
        MOVF C0COUNT,0
        RETURN
        ;///////////////////////////////////
        SENDBIT:
        CLRF TIME
        BCF PORTB,1
        SENDBIT1:
        CLRWDT
        MOVLW .35
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDBIT1
        CLRF TIME
        BSF PORTB,1
        SENDBIT2:
        CLRWDT
        MOVLW .18
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDBIT2
        CLRF SENDLOOP ;碼頭數(shù)據(jù)發(fā)送

        //////////////////////////////////////////////
        SENDBIT3:
        CLRWDT
        BCF INTCON,7
        CALL READDIGT
        MOVWF SENDCOUNT
        BSF INTCON,7
        CALL SENDDIGT
        INCF SENDLOOP,1
        MOVLW .5
        SUBWF SENDLOOP,0
        BTFSS STATUS,2
        GOTO SENDBIT3
        CLRF TIME
        BCF PORTB,1
        SENDDIGT5:
        CLRWDT
        MOVLW .2;;加發(fā)一個(gè)結(jié)束位
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDDIGT5
        BSF PORTB,1
        BSF STARTBIT
        RETURN
        ;/////////////////////////////////////////////////////////////////////////////////////////
        SENDDIGT:;;實(shí)現(xiàn)0和1的發(fā)送
        MOVLW .8
        MOVWF LOOPSENDCOUNT
        SENDDIGTGO:
        BTFSS SENDCOUNT,7
        GOTO ZERSEND
        CLRF TIME
        SENDDIGT1:
        CLRWDT
        BCF PORTB,1
        MOVLW .2
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDDIGT1
        CLRF TIME
        SENDDIGT2:
        CLRWDT
        BSF PORTB,1
        MOVLW .6
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDDIGT2
        GOTO SENDOVER
        ZERSEND:
        CLRF TIME
        SENDDIGT3:
        CLRWDT
        BCF PORTB,1
        MOVLW .2
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDDIGT3
        CLRF TIME
        SENDDIGT4:
        CLRWDT
        BSF PORTB,1
        MOVLW .2
        SUBWF TIME,0
        BTFSS STATUS,2
        GOTO SENDDIGT4
        SENDOVER:
        RLF SENDCOUNT,1
        DECFSZ LOOPSENDCOUNT
        GOTO SENDDIGTGO
        RETURN

        相應(yīng)的C代碼如下:(C5口是發(fā)送口)

        #include
        #include
        #include
        unsigned char dispcount[5];//要發(fā)送的碼值
        unsigned char i,k,data,rfbit,zbit,rfgobit;
        #pragma interrupt_level 1
        interrupt adint(void)
        {
        if(TMR1IF==1)
        {
        TMR1IF=0;
        TMR1H=0b11111100;
        TMR1L=0b00010111;
        rfbit=rfbit+1;//發(fā)送指針加一
        send( );
        }
        }
        //////////////////////////////////////////
        send( )
        {
        if(rfgobit==0)
        {
        switch(rfbit)
        {
        case 1 :
        RC5=0;
        break;
        case 6 :
        RC5=1;
        break;
        case 7 :
        RC5=0;
        rfgobit=1;//制發(fā)送完標(biāo)制
        rfbit=0;
        break;
        default :
        break;
        }
        }
        if(rfgobit==1)
        {
        zbit=dispcount[i]0b00000001;
        switch(rfbit)
        {
        case 1:
        RC5=1;
        break;
        case 2 :
        if(zbit==0)
        {
        RC5=0;
        rfbit=0;
        rf( );
        }
        break;
        case 3 :
        if(zbit==1)
        {
        RC5=0;
        rfbit=0;
        rf( );
        }
        break;
        default :
        break;
        }
        }
        }
        //////////////////////////////////////////////
        rf( )
        {
        k=k+1;
        if(k==8)
        {
        i=i+1;
        k=0;
        if(i==6)
        {
        i=1;
        rfgobit=0;
        TMR1H=0;
        TMR1L=0;
        RC5=1;
        dispcount[1]=0xaa;
        dispcount[2]=0xbb;
        dispcount[3]=0xcc;
        dispcount[4]=0xdd;
        dispcount[5]=0xee;
        }
        return;
        }
        dispcount[i]=dispcount[i]>>1;
        }
        //////////////////////////////////////
        main( )
        {
        di( );
        TRISC=0b11011111;
        TRISA=0b111111;
        TRISB=0b11111111;
        i=1;
        k=0;
        TMR1H=0b11111100;
        TMR1L=0b00010111;
        T1CON=1;
        TMR1IE=1;
        RC5=1;
        PEIE=1;
        ei( );
        dispcount[1]=0xaa;
        dispcount[2]=0xbb;
        dispcount[3]=0xcc;
        dispcount[4]=0xdd;
        dispcount[5]=0xee;
        while( 1 )
        {
        ;
        }
        }
        這兩個(gè)程序只是一個(gè)演示例程

        在實(shí)際運(yùn)用中可變通的把這種發(fā)送與接受用于兩機(jī)之間的通訊(好處是移植性好,抗干擾好且一發(fā)一收只要兩根線(xiàn)或一根線(xiàn))另外如要產(chǎn)生載波(38KHZ)的話(huà)可用其輸出口去調(diào)制38KHZ發(fā)生源(比如555電路,PWM)來(lái)得到,或干脆用軟件來(lái)實(shí)現(xiàn)(不過(guò)難度較大;不如用帶38KHZ的來(lái)做)

        紅外遙控器相關(guān)文章:紅外遙控器原理

        上一頁(yè) 1 2 3 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 七台河市| 志丹县| 灵宝市| 景宁| 柯坪县| 勐海县| 新民市| 上犹县| 昭觉县| 仪陇县| 镇坪县| 阳春市| 安康市| 双峰县| 广丰县| 扬中市| 屏南县| 朝阳市| 龙泉市| 仙游县| 怀宁县| 玉树县| 镇远县| 舟山市| 满城县| 延长县| 北宁市| 越西县| 孟村| 永兴县| 晋州市| 南雄市| 湟源县| 项城市| 久治县| 本溪市| 侯马市| 池州市| 文登市| 西平县| 东台市|