daihui713:
中斷查詢解碼————意思就是 邊解碼 邊PWM循環(huán), 例如:以50us的時(shí)基礎(chǔ)作為定時(shí)中斷,時(shí)間一到就去中斷里面解碼,以累計(jì)的方式判斷什么引導(dǎo)碼用戶碼數(shù)據(jù)碼反碼等, 中斷函數(shù)里面最多也就是++,判斷,循環(huán)存放之類的語句,占用不了多少時(shí)間,最多十幾u(yù)S就退出中斷了,這樣就不用一直在那里等電平的變化。退出后又接著繼續(xù)主函數(shù)中的PWM循環(huán),十幾US的執(zhí)行時(shí)間根本不影響PWM調(diào)光的視覺暫留效應(yīng),這樣就看不到閃。 給你個(gè)參考——利用定時(shí)器的固定時(shí)基來查詢紅外脈沖的寬度,從而進(jìn)行解碼!可以自己去分析,至于中間的高電平是多少時(shí)間,低電平是多少時(shí)間都不用去管,只需計(jì)算兩個(gè)下降沿間隔時(shí)間就可以判斷0和1,同時(shí)也可以判斷是否是引導(dǎo)碼,或是結(jié)束碼,或是連續(xù)碼定時(shí)器查看時(shí)間設(shè)置為125us,執(zhí)行定時(shí)器中斷程序一次voidTimer0interrupt1() { irTime++; if(irTime==240)//ir解碼后碼值存放時(shí)間,240*125us=30ms { irTime--; codeCnt=0x3f; } if(IR_IO) Irprot_LastState=1;//記錄IO狀態(tài) elseif(Irprot_LastState) //有下降沿 { Irprot_LastState=0; //下降沿后IO狀態(tài)記錄為0 if(irTime>3]>3]++; //大于15*125us=1.875ms的間隔為數(shù)據(jù)1 } irTime=0; //下降沿處理完成,將時(shí)間清0 }}