新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用MSP430 TimerA的CCR1捕獲模式進行紅外解碼的實例

        利用MSP430 TimerA的CCR1捕獲模式進行紅外解碼的實例

        作者: 時間:2016-11-13 來源:網絡 收藏
        利用MSP430 TimerACCR1捕獲模式對紅外遙控芯片M50560-008P進行紅外解碼的實例。注:定義的測量時間都是經過實際調試后調整得到,可能與芯片手冊會有出入。

        //紅外遙控芯片M50560-008P,其編碼格式和M50560-001P一致,可參閱數據手冊。

        本文引用地址:http://www.104case.com/article/201611/316541.htm
        #define UserCode 0xC2
        #define LeadCodeOrSeprateTime 4000 //4ms,對應1MHz的計數時鐘
        #define Bit0Time1 600 //0.600ms,對應1MHz的計數時鐘
        #define Bit0Time2 520 //0.520ms,對應1MHz的計數時鐘
        #define Bit1Time1 600 //0.600ms,對應1MHz的計數時鐘
        #define Bit1Time2 1600 //1.600ms,對應1MHz的計數時鐘
        #define DataCount 8 //8位的用戶碼或數據碼
        void ParaSet(uchar DataCode)//紅外遙控輸入處理
        {
        //處理代碼
        }
        void SysInit(void)
        {
        //系統參數初始化代碼
        }
        void main(void)//主函數
        {
        SysInit();//系統參數初始化
        P1DIR=0xFB;//初始化P1.2(紅外接收頭)為輸入
        P1IE=0x04;//使能P1.2的中斷
        P1IES=0x04;//下降沿觸發P1.2中斷(紅外接收頭反相輸出)
        }
        #pragma vector=PORT1_VECTOR
        __interrupt void PORT1()//紅外遙控輸入中斷處理
        {
        uint LeadBitTime[2],BitTime[3],LastBitTime;
        uchar i,j,k,Data[2];
        P1IE=0x00;//關閉P1.2中斷
        _EINT();//進入中斷后,系統自動關總中斷允許,因此需再開總中斷允許
        if((P1IFG&0x04)==BIT2)//紅外遙控輸入
        {
        P1IFG&=0xFB;//中斷標志位復位
        P1SEL|=0x04;//P1.2第二功能選擇,進入TimerA的CCR1捕獲模式
        TACTL|=MC_2+TACLR;//啟動TA計數器的連續計數模
        TACCTL1&=~CCIFG;//復位捕獲標志
        for(k=0;k<2;k++)
        {
        while((TACCTL1&BIT0)!=CCIFG);//等待上升沿
        LeadBitTime[0]=CCR1;
        TACCTL1&=~CCIFG;
        while((TACCTL1&BIT0)!=CCIFG);//等待下降沿
        LeadBitTime[1]=CCR1;
        TACCTL1&=~CCIFG;
        if(LeadBitTime[1]-LeadBitTime[0]>LeadCodeOrSeprateTime+500||LeadBitTime[1]-LeadBitTime[0] {
        TACTL|=MC_0+TACLR; //停止TA計數
        P1SEL&=0xFB;//P1.2恢復選擇第一功能即為I/O口
        return;
        }//如果引導碼不符則退出
        LastBitTime=LeadBitTime[1];
        for(i=0;i {
        BitTime[0]=LastBitTime;//位碼開始時刻賦初值
        for(j=1;j<3;j++)
        {
        while((TACCTL1&BIT0)!=CCIFG);//等待上升沿或下降沿跳變
        BitTime[j]=CCR1;//讀取捕獲計時值
        TACCTL1&=~CCIFG;//復位捕獲標志
        }
        LastBitTime=BitTime[2];//為下一個位碼保存開始時刻初值
        Data[k]>>=1;//得到的用戶碼和數據碼右移1位,高位填0,準備接收碼位碼值
        if(BitTime[2]-BitTime[1]>Bit0Time2-200&&BitTime[2]-BitTime[1] if(BitTime[2]-BitTime[1]>Bit1Time2-200&&BitTime[2]-BitTime[1] }
        }
        if(Data[0]!=UserCode)
        {//如果用戶碼不為0xC2則退出
        TACTL|=MC_0+TACLR; //停止TA計數
        P1SEL&=0xFB;//P1.2恢復選擇第一功能即為I/O口
        return;
        }
        TACTL|=MC_0+TACLR; //停止TA計數
        ParaSet(Data[1]);//參數設置
        TACTL|=MC_0+TACLR; //停止TA計數
        P1SEL&=0xFB;//P1.2恢復選擇第一功能即為I/O口
        }
        P1IE=0x04;//使能P1.2的中斷
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 东辽县| 兴隆县| 二手房| 福清市| 南通市| 富源县| 锡林郭勒盟| 丹寨县| 临漳县| 兴化市| 乐山市| 五峰| 扶风县| 东乡族自治县| 沅江市| 济阳县| 湖南省| 友谊县| 深州市| 库车县| 新乡市| 兰溪市| 博湖县| 神农架林区| 上杭县| 江口县| 彭泽县| 遂宁市| 丽水市| 松潘县| 南涧| 通许县| 宜良县| 丰宁| 和龙市| 云浮市| 保山市| 南华县| 镇雄县| 九龙县| 察雅县|