|
發布時間: 2019-6-4 20:43
正文摘要:基于51單片機的紅外解碼程序 1602顯示屏 可以顯示8位16進制 38k的遙控都可以,制作萬能遙控器的話這個程序可以起到作用 制作出來的實物圖如下: |
51_User 發表于 2019-6-20 20:13 中斷程序如果執行周期過長,同時你進入中斷后應該是關閉中斷的。所以肯定會漏掉部分下降沿的。所以你那個方法在51單片機中無法實現。除非是有時鐘頻率更高的單片機來實現你的方法。 |
|
感謝回復。 那我可能抓錯了。 自己再研究一下。 |
| 肯定會有33個下降沿啊 |
| 感謝分享 |
devcang 發表于 2019-6-4 23:02 受教了 我是業余玩玩,40位還真鬧不明白了 哈哈 |
|
我是新手,正好在學習紅外信號解碼,遇到困難,望高手指教。 我想通過中斷響應一次紅外遙控器發出的一幀數據(有33個脈沖)的每個脈沖信號來啟動定時器計算并保存脈沖信號的寬度來解碼紅外信號。 但是實際上一直不成功。 通過多次檢查中間變量的值,發現一幀紅外數據雖然有33個脈沖,但是實際上只會引起幾次中斷,并不是33此。 請問我原本希望一幀數據的33個脈沖都能引起中斷響應的想法是錯誤的嗎?實際上一幀數據會引起幾次中斷響應? |
|
本帖最后由 51_User 于 2019-6-5 14:20 編輯 我是新手,正好在學習紅外解碼,遇到困難,望指教。 我采用P32口中斷和定時器方式接收解碼紅外信號,想法是中斷為低電平跳邊沿方式,紅外遙控器按下一個按鍵后,發出的一幀數據里的每個脈沖都能引起中斷響應,在中斷響應程序里保存通過定時器計算出的前后兩個低電平脈沖之間的時間,用于解碼。 實際上運行程序,無法解碼。 經過多次測試后,發現好像單片機的中斷無法對紅外遙控器發出的一幀數據里的每個脈沖都響應,實際上似乎只響應數次(原本以為33個脈沖,應該會有33次中斷響應)。 請問我對紅外信號的中斷響應的理解是不是錯了。 附上中斷程序和定時器源碼,請幫忙分析指教。 void Infraredrevive() interrupt 0 { if (timercounter>31 && timercounter<50)//判斷是否為NEC編碼引導碼 { //計算引導碼接收次數13500x11.592/12/256=48,識別引導碼的定時器計數為48次 //識別引導碼丟掉,不保存 count_i=0;//數組下標清零,準備保存脈沖時間 } if(newpulse_flag==1) //下一個pulse來臨,保存兩個跳低電平pulse之間的計時器時間倍數 { timerArray[count_i]=timercounter; count_i=count_i+1; }else { newpulse_flag=1;//下一個pulse來臨標志,也是為了識別第一個pulse的開始 } if (count_i==32)//33個脈沖信號,丟掉引導碼,共32個信號 { decode_pulse();//33個脈沖信號接收結束,調用解碼函數 count_i=0; } timercounter=0;//timer時間倍數清零,用于下一個計數 } void timer0() interrupt 1//定時器中斷一次256x12/1105920秒 { timercounter++; } void IRinitial()//中斷設定初始化 { ///*中斷設定開始 EA=1;//中斷總開關 // IE0=0;// EX0=1;//外部中斷0 ET0=1;//定時器T0 TR0=1;//啟動T0定時器,后面需要放在中斷程序里嵌套使用定時器 ,清零 // TF0=0;//為timer溢出標志位,用于判斷 TMOD=0x02;//設置定時器t0為8位模式,自動裝入 TH0=0;//196;//重裝數據,為了精確時間,每次跳12/11059200秒 TL0=0;//196;//初始值 IT0=1;//下降沿觸發 //中斷設定結束*/ } |
| 這有一篇空調編碼的,可以參考 https://my.oschina.net/u/1242247/blog/3052004 |
|
還有一些是長度不同。 像格力的空調遙控器,是40位,各功能不同的拼合,每次都發送這40位。但起始碼相似的 音響的也不同。 |
| 按照 順序顯示 用戶碼 用戶反碼 數據碼 和數據反碼 ,空調遙控比較特殊, |