![]() |
發布時間: 2020-11-5 11:05
正文摘要:設計一個產品,其中用到紅外開關,為防止干擾,采用紅外一體頭,為使程序簡單,紅外發射采用555產生38k載波,發射數據由單片機p10口提供,紅外接收由外中斷(p32)實現,原理圖如下: |
接收時,脈充寬度,做一個容差 |
程序設計思想問題,發送和接收用中斷, |
這是NEC協議,你程序代碼的時間設置不對,就是判斷時間,你多測試幾次就可以了,重要的是你的載波發生一定要正確 |
沒這樣做過,但是理論上是可行的。38khz頻率,周期26us可以執行很多指令。使用32位單片機(8位高速也行),用兩個定時器來做應該可行。如果模擬nec協議,脈寬是100us級的就更沒問題了。用接收數據的定時器控制發送數據的定時器,考慮優先級,接收數據脈寬范圍,時間精度等。 |
你得首先確定555發射的38K信號能讓P3.2產生中斷,反射式紅外線距離是很短的,用萬用表量一下P3.2腳就能看出,或者在中斷入口處點亮一顆LED指示燈也能測出。 |
樓上說得對:理論上說是不能同時的,但芯片接收和發射用的時間特別短毫秒級的,給人的感覺像同時處理的,接收一般用定時器捕獲或中斷做接收。其實實際上沒有做到同時,但對人來說也差不多了 |
wh8010jky 發表于 2020-11-6 09:08 完全可以做到,最主要的是你發射和接受不能用堵塞式延時。 |
此時有個示波器你就比較好解決問題了,收發端口是否正常就可以檢測出來,考慮中斷是否會影響發數據,有沒有辦法避免,然后就是最好先用兩個單片機先驗證收發數據都可以了,再看怎么整合在一個單片機驗證 |
STC12單片機有定時器輸出口,定時器可以自己重裝,有需要可以開中斷,但產生38k無需中斷。 再開一個定時器T1定時10ms, 這個要中斷,每次中斷反轉TR0。 跑的時候,若TR0為1,接收管輸入端產生中斷,進入測量脈載波長度程序,過程中T1發生中斷將TR0置0,載波消失,即獲得載波長度,若與10ms相符則非干擾,大概是這樣。 AUXR EQU 8EH WAKE_CLKO EQU 08FH ORG 0000H MOV WAKE_CLKO,#00000001B ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4 MOV AUXR, #11111100B ;T0x12,T1x12,UART_M0x6,BRTRUN,S2SMOD,BRTx12,EXTRAM,S1BRS MOV TMOD, #00100010B ;TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER) ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) MOV TL0, #111 ;Tx12 111=38.2K OUTPUT AT P3.4 MOV TH0, #111 SETB TR0 ;RUN T0 |
理論上說是不能同時的,但芯片接收和發射用的時間特別短毫秒級的,給人的感覺像同時處理的,接收一般用定時器捕獲或中斷做接收。 |
P1口好像漏了上拉電阻,那樣的話555第4腳一直都是低電平,不能工作了! |
dalaoshi 發表于 2020-11-5 23:45 我最主要的疑問是:一個單片機能否實現紅外的發和收?按君所言,定時器產生38k信號,在接收管接收時這個38k信號已經發送完畢,如何才能收到?這是我最不懂的地方。 |
dalaoshi 發表于 2020-11-5 23:45 謝謝了!但是,用定時器產生38k信號不是需要頻繁中斷嗎?能否提供一個程序參考一下?再次謝謝! |
既然是自己發自己收就不一定要照著別人的格式,你可以讓發射管發射固定的38k間歇信號,比如10MS開,10MS關,接收管分析接收信號的周期,若符合就不是干擾信號,而產生間歇信號可以用單片機的一個定時器來完成,而且是用中斷來控制,該定時器的中斷權位比P3.2高,因此在P3.2中斷期間輸出信號不會中斷。若還有其他定時器可用,應該用來產生38K信號直接輸出到發射管,不必用555IC。 |
補充說明:發送數據里的4個數據是固定碼,代替32位設備碼和鍵碼 |