用定时中断来接收红外遥控信号
生活随笔
收集整理的這篇文章主要介紹了
用定时中断来接收红外遥控信号
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
//====紅外接收相關(guān)定義=============================
#define IrDatHigh (P_IrRec == 1) //接收數(shù)據(jù)高
#define IrDatLow (P_IrRec == 0) //接收數(shù)據(jù)低
#define Ir_EdgeDown ((RStatus_IR&0x03) == 0x02)//IR下降沿 1--0
#define Ir_EdgeUp ((RStatus_IR&0x03) == 0x01) //IR上升沿 0--1//紅外數(shù)據(jù)長度 N個字節(jié) 可自定義
#define IrDatLong (uint8)20 //--------------起始
#define TST_LOW (uint8)107 //起始低脈寬 5.35MS
#define TST_LOW_L (TST_LOW - 20) //起始低判斷范圍
#define TST_LOW_H (TST_LOW + 20) //12
#define TST_HIGH (uint8)145 //起始高脈寬 7.25MS
#define TST_HIGH_L (TST_HIGH - 20) //起始高判斷范圍
#define TST_HIGH_H (TST_HIGH + 20) //
//---------------數(shù)據(jù)
#define TDAT_LOW (uint8)28 //數(shù)據(jù)低脈寬 1.4MS
#define TDAT_LOW_L (TDAT_LOW - 19) //數(shù)據(jù)
#define TDAT_LOW_H (TDAT_LOW + 19) //10
#define TDAT_HIGH (uint8)66 //數(shù)據(jù)高脈寬 3.3MS
#define TDAT_HIGH_L (TDAT_HIGH - 19) //數(shù)據(jù)
#define TDAT_HIGH_H (TDAT_HIGH + 19) //void interrupt ser(void)//中斷服務(wù)程序
{static uint8 PIR = 0 ;static uint8 RStatus_IR = 0 ;static uint8 ByteNum=0,BitNum=0;TIM6_SR1 = 0x00; // 清除更新標(biāo)志 50u 中斷一 次TconIr ++ ; //脈沖計(jì)數(shù)if(TconIr == 0) //溢出{RMIR = MIR_RST ; //退出接收狀態(tài) }PIR <<= 1 ;if(IrDatHigh) //讀IR接收管腳的狀態(tài){PIR |= 0x01 ;}//對接收管腳的數(shù)據(jù)進(jìn)行濾波處理RStatus_IR <<= 1 ;if((PIR & 0x07) == 0x07)//111{ RStatus_IR |= 0X01 ;}else if((PIR & 0x07) == 0X00)//000{RStatus_IR &= ~0X01 ; }else {if(RStatus_IR & 0x02)RStatus_IR |= 0x01 ;}if(F_IrRecOk) return ; //數(shù)據(jù)未取出 不再接收數(shù)據(jù)//--上升沿或下降沿到來-------------if(Ir_EdgeDown || Ir_EdgeUp) {//-------1111--空閑--------------------if(RMIR == MIR_RST) //{if(Ir_EdgeUp) {RMIR = MIR_RST ; //退出接收狀態(tài)}else //起始接收下降沿{TconIr = 0 ;RMIR = MIR_P1 ;//接收起始F_IrStatus = 0 ;// 接收起始低}}//----22222--接收起始碼-----------------else if(RMIR == MIR_P1)//{if(!F_IrStatus)//起始狀態(tài)0 只接收上升沿{if(Ir_EdgeUp){ //接收起始碼低電平脈寬if((TconIr >= TST_LOW_L) && (TconIr <= TST_LOW_H)){F_IrStatus = 1 ; //起始低驗(yàn)證成功TconIr = 0 ;}else {RMIR = MIR_RST ; //退出接收狀態(tài)}}}else //if(F_IrStatus)//起始狀態(tài)1 只收下升沿{if(Ir_EdgeDown){//接收起始碼高電平脈寬if((TconIr >= TST_HIGH_L) && (TconIr <= TST_HIGH_H)){RMIR = MIR_P2 ; //起始高驗(yàn)證成功TconIr = 0 ;ByteNum = 0;BitNum = 0;}else {RMIR = MIR_RST ; //退出接收狀態(tài)}} }}//----33333--接收數(shù)據(jù)碼--------------else if(RMIR == MIR_P2) //{if(Ir_EdgeUp)//濾過低電平{TconIr = 0 ;return ;}else //if(){ //接收到數(shù)據(jù)低if((TconIr >= TDAT_LOW_L)&&(TconIr <= TDAT_LOW_H)){ IrDatRce[ByteNum] &= ~(1<<BitNum) ; }//接收到數(shù)據(jù)高else//if((TconIr >= TDAT_LOW_L) && (TconIr <= TDAT_LOW_H)){IrDatRce[ByteNum] |= (1<<BitNum) ;}BitNum ++ ;if(BitNum > 7){BitNum = 0 ;ByteNum ++ ;if(ByteNum >= IrDatLong){ByteNum = 0 ;RMIR = MIR_RST ;//結(jié)束完成 退出F_IrRecOk = 1 ;//可以取數(shù)據(jù)}}}}}
}
總結(jié)
以上是生活随笔為你收集整理的用定时中断来接收红外遥控信号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java处理XSS过滤的方法
- 下一篇: 理解MySQL——索引与优化