線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2620
推到 Plurk!
推到 Facebook!

關於紅外線訊號資料傳輸問題

缺席
btiy
一般會員


發表:15
回覆:31
積分:9
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-07 17:40:35 IP:61.218.xxx.xxx 未訂閱
請問一下 若我將一個紅外線訊號接收到後 如何把它分成四個位元(34H 35H 36H 37H)或者其他 因為它是一個波形的型態,然後我透過RS-232將收到資料傳到電腦 像這樣我如何用組合語言寫 我硬體是89s51 我是有想說,如果我寫一段程式判斷它多少時間內若從高變低或低電高 這樣為一個1,然後過八個時間點後他可能收到分別為1或0這樣,然後 我再把它加起來這樣就可以成為上面所寫的34H 可是我認為這樣方式好笨,一定有其他的方式吧! 一直很困擾,也不知如何撰寫,找資料也找不到,所以求助各位高手 謝謝
penguin5
資深會員


發表:116
回覆:317
積分:431
註冊:2004-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-07 19:32:37 IP:220.139.xxx.xxx 未訂閱
請參考 http://www.ustr.net/infrared/index.shtml http://www.jasonbauer.net/rc/8051_ir.asp 歡迎參觀麗嘉真空管研究室http://myweb.hinet.net/home4/penguin5/
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-07 19:35:28 IP:220.139.xxx.xxx 未訂閱
1、 紅外線發射時讀取時為(0)沒有線發射時讀取時為(1)。 2、 用timer設定約100us中斷一次,中段時讀取紅外線接收訊號,將收到的訊號右移至暫存器,八次為一位元組並將此位元組存到記憶體。 3、 中段時讀取紅外線接收訊號時,同時判斷讀取時為(1)的次數若超過50次表示訊號結束,並設定結束旗標。 4、 主程式中判斷結束旗標,若是則讀取儲存到記憶體的資料,將資料移至暫存器,用右移判斷位元,再經由RS232傳到PC,就可以看到紅外線訊號的內容。 5、 請參考http://myweb.hinet.net/home11/macgyvertek/
btiy
一般會員


發表:15
回覆:31
積分:9
註冊:2005-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-08 09:18:38 IP:61.218.xxx.xxx 未訂閱
引言: 1、 紅外線發射時讀取時為(0)沒有線發射時讀取時為(1)。 2、 用timer設定約100us中斷一次,中段時讀取紅外線接收訊號,將收到的訊號右移至暫存器,八次為一位元組並將此位元組存到記憶體。 3、 中段時讀取紅外線接收訊號時,同時判斷讀取時為(1)的次數若超過50次表示訊號結束,並設定結束旗標。 4、 主程式中判斷結束旗標,若是則讀取儲存到記憶體的資料,將資料移至暫存器,用右移判斷位元,再經由RS232傳到PC,就可以看到紅外線訊號的內容。 5、 請參考http://myweb.hinet.net/home11/macgyvertek/
那也就是說當我接收到紅外線訊號時,他一定會變到0的狀態嗎? 因為他不是0101的在變換,難道他不會有特例嗎? 還有若真的是會這樣的話,那也就是說在程式中若判定他變為0時 ,在一個中斷時間記錄它的值,然後放到ACC中,下一個訊號近來後 先右旋一次後把值放進去ACC中,等到紀錄八次後,再把值放到暫存器。 如果這樣是對的話,但是我有一個問題了,這樣子的話要怎樣寫我就不懂了 可以教教我嗎?這樣類似的我沒寫過就不知道如何下手。
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-08 13:02:32 IP:61.66.xxx.xxx 未訂閱
8051不是本身就有RS-232介面嗎??
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-08 19:30:31 IP:220.139.xxx.xxx 未訂閱
引言:
引言: 1、 紅外線發射時讀取時為(0)沒有線發射時讀取時為(1)。 2、 用timer設定約100us中斷一次,中段時讀取紅外線接收訊號,將收到的訊號右移至暫存器,八次為一位元組並將此位元組存到記憶體。 3、 中段時讀取紅外線接收訊號時,同時判斷讀取時為(1)的次數若超過50次表示訊號結束,並設定結束旗標。 4、 主程式中判斷結束旗標,若是則讀取儲存到記憶體的資料,將資料移至暫存器,用右移判斷位元,再經由RS232傳到PC,就可以看到紅外線訊號的內容。 5、 請參考http://myweb.hinet.net/home11/macgyvertek/
那也就是說當我接收到紅外線訊號時,他一定會變到0的狀態嗎? 因為他不是0101的在變換,難道他不會有特例嗎? 還有若真的是會這樣的話,那也就是說在程式中若判定他變為0時 ,在一個中斷時間記錄它的值,然後放到ACC中,下一個訊號近來後 先右旋一次後把值放進去ACC中,等到紀錄八次後,再把值放到暫存器。 如果這樣是對的話,但是我有一個問題了,這樣子的話要怎樣寫我就不懂了 可以教教我嗎?這樣類似的我沒寫過就不知道如何下手。
請參考http://myweb.hinet.net/home11/macgyvertek/ 以下是解紅外線波形程式碼,若有問題請與我連絡,因為非三言兩與可回答
 
red_rx                equ     p3.2                ;
tx_flag                equ     20h.0                ;
first_flag        equ     20h.1                ;
tx_enable_flag        equ     20h.2                ;
invalid                equ     20h.3                ;
noise_flag        equ     20h.4                ;
data_buf        equ     30h                ;
;==================================
        org     0h                        ;程式起始位址
        jmp     start                        ;
        org     03h                        ;int0 中斷向量
        jmp     ext0_int                        ;
        org     0bh                        ;timer0 中斷向量
        jmp     t0_int                        ;
        org     23h                        ;RS232 中斷向量
        jmp     rs232int                ;
;==================================
start:
        mov     sp,#70h                        ;設定堆疊指標
        call    init_rs232              ;RS232 初始化 timer0 int 初始化
;=======initial data===============        
        setb        ex0                        ;enable ext0
        setb        it0                        ;負緣觸發
        clr        first_flag
        clr        tx_enable_flag                ;
;==================================
main:
        call        tx_rs232                ;
        jmp     main                    ;
;=======ext0_int===================
ext0_int:
        jb        invalid,ext0_ret
        clr        ex0                        ;disable ext0
        setb        et0                        ;enable t0 int
        setb        tr0                        ;start t0
        setb        tf0                        ;set t0 overflow
ext0_ret:
        clr        invalid
        reti
;=======timer0 int=================
t0_int:
        jb        red_rx,data_hi
        clr        c
          call        save                        ;
        mov        r1,#0                        ;
        jmp        t0_ret                        ;
data_hi:
        cjne        r0,#data_buf,normal        ;消除雜訊
        clr        first_flag
        setb        invalid
        setb        ex0
        jmp        t0_ret
normal:
        setb        c
          call        save                        ;
        inc        r1                        ;
        cjne        r1,#50,t0_ret                ;end of data
        clr        et0                        ;disable t0 int
        mov        a,#0ah                        ;
          mov        @r0,a                        ;
        clr        first_flag                ;
        clr        et0
        clr        tr0
        setb        tx_enable_flag                ;
        setb        tx_flag                        ;enable tx
        jmp        t0_ret
t0_ret:
        reti
;=======save=======================
save:            jb        first_flag,save_next        ;
        setb        first_flag                ;
        mov        r0,#data_buf                ;read data_buf address
        mov        r2,#8
        mov        r3,0
save_next:
        mov        a,r3
        rrc        a
        mov        r3,a
        djnz        r2,save_ret
        mov        r2,#8
        mov        @r0,a
        inc        r0
save_ret:
        ret
;==================================
tx_rs232:            jnb        tx_enable_flag,tx_ret        ;        
        jb        first_flag,tx_next        ;
        setb        first_flag                ;
        mov        r0,#data_buf                ;read data_buf address
        mov        a,@r0                        ;read first data
        mov        r3,a
        mov        r2,#8                        ;8 bit
tx_next:
        mov        a,r3
        rrc        a
        mov        r3,a
        jc        tx_1
        mov        a,#30h
        jnb        tx_flag,$
        clr        tx_flag
        mov        sbuf,a                        ;
        jmp        tx_2
tx_1:
        mov        a,#31h
        jnb        tx_flag,$
        clr        tx_flag
        mov        sbuf,a                        ;
tx_2:
        djnz        r2,tx_next
        mov        r2,#8
        inc        r0                        ;read next data
        mov        a,@r0
        mov        r3,a
        cjne        a,#0ah,tx_next
        jnb        tx_flag,$
        clr        tx_flag
        mov        a,#0dh
        mov        sbuf,a        
        jnb        tx_flag,$
        clr        tx_flag
        mov        a,#0ah
        mov        sbuf,a        
        clr        first_flag                ;
        clr        tx_enable_flag                ;
        mov        r5,#200
        call        delay
        setb        invalid
        setb        ex0                        ;enable ext0 int    tx_ret:
        ret
;=======RS232 INT==================
rs232int:
        jbc     ri,receive              ;
        clr     ti                      ;
        setb        tx_flag                        ;
        jmp     int_ret                 ;
receive:
        clr     ri
int_ret:
        reti
;=======init_rs232=================
init_rs232:
        mov     tmod,#00100010B         ;set tiMER1 MODE 2 tiMER0 MODE 2
        anl     pcon,#01111111B         ;set SMOD=0
        mov     Th1,#0FDh               ;set rate 9600
        mov     Th0,#(255-160)          ;
        mov     Tl0,#(255-160)          ;
        setb    tr1                     ;start tiMER1
        mov     SCON,#01010000B         ;set MODE 1 aND REN=1
        mov     IE,#10010000B           ;ENaBLE INT aND COM_PORT
        ret
;=======delay=====================
delay:                                  ;tiME=R5*1ms
        mov     R6,#5                        ;
DEL:
        mov     R7,#107                        ;
        djnz    R7,$                        ;
        djnz    R6,DEL                        ;
        djnz    R5,delay                ;
        ret
;=================================            end
btiy
一般會員


發表:15
回覆:31
積分:9
註冊:2005-08-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-13 09:17:12 IP:61.218.xxx.xxx 未訂閱
引言:
引言:
引言: 1、 紅外線發射時讀取時為(0)沒有線發射時讀取時為(1)。 2、 用timer設定約100us中斷一次,中段時讀取紅外線接收訊號,將收到的訊號右移至暫存器,八次為一位元組並將此位元組存到記憶體。 3、 中段時讀取紅外線接收訊號時,同時判斷讀取時為(1)的次數若超過50次表示訊號結束,並設定結束旗標。 4、 主程式中判斷結束旗標,若是則讀取儲存到記憶體的資料,將資料移至暫存器,用右移判斷位元,再經由RS232傳到PC,就可以看到紅外線訊號的內容。 5、 請參考http://myweb.hinet.net/home11/macgyvertek/
那也就是說當我接收到紅外線訊號時,他一定會變到0的狀態嗎? 因為他不是0101的在變換,難道他不會有特例嗎? 還有若真的是會這樣的話,那也就是說在程式中若判定他變為0時 ,在一個中斷時間記錄它的值,然後放到ACC中,下一個訊號近來後 先右旋一次後把值放進去ACC中,等到紀錄八次後,再把值放到暫存器。 如果這樣是對的話,但是我有一個問題了,這樣子的話要怎樣寫我就不懂了 可以教教我嗎?這樣類似的我沒寫過就不知道如何下手。
請參考http://myweb.hinet.net/home11/macgyvertek/ 以下是解紅外線波形程式碼,若有問題請與我連絡,因為非三言兩與可回答 發表人 - src 於 2005/09/09 06:02:00
謝謝,我好好研究ㄧ下,看看你是用怎樣的方法
tms
一般會員


發表:0
回覆:6
積分:1
註冊:2005-09-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-23 15:33:09 IP:202.132.xxx.xxx 未訂閱
您的接收電路是否嚴謹?所接收是否為市售之視聽遙控器?
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-23 23:29:00 IP:220.139.xxx.xxx 未訂閱
引言: 您的接收電路是否嚴謹?所接收是否為市售之視聽遙控器?
你好 紅外線接收電路只是用外線接收模組,它有3隻腳電源、接地及信號輸出,信號輸出直接接到P3.2外部中斷輸入。 以上程式是解紅外線的波形,任何紅外線遙控器都可以,分析波行後才能正確解碼,真正解碼程式不一樣。
tms
一般會員


發表:0
回覆:6
積分:1
註冊:2005-09-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-24 09:20:21 IP:202.132.xxx.xxx 未訂閱
是的,我知了.先不論FIRMWARE之寫法,此次本人僅對IR RECEIVER此HARDWARE做簡述心得. 一般IR RECEIVER 3PINS採放大迴路與BPF設計. 放大迴路可允許遙控信號能更遠距傳送而BPF(Band Pass Filter)則可濾掉非正確範圍內之資料與載波(CARRIER DATAs),進而保留允許之信號,隨即整型後從信號腳輸出(接至MCU/CPU pin). 因市面上之遙控器並非都使用相同之CARRIER,故IR RECEIVER's BPF 亦有不同.(雖曾經有人倡導G-CODE). 原問題製造者應先確定所進行測試之REMOTE CONTROL & RECEIVER之資料是否MATCH,否則直接進行實驗或許會有怪怪的信號->DATA.
btiy
一般會員


發表:15
回覆:31
積分:9
註冊:2005-08-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-26 10:25:01 IP:61.218.xxx.xxx 未訂閱
引言: 是的,我知了.先不論FIRMWARE之寫法,此次本人僅對IR RECEIVER此HARDWARE做簡述心得. 一般IR RECEIVER 3PINS採放大迴路與BPF設計. 放大迴路可允許遙控信號能更遠距傳送而BPF(Band Pass Filter)則可濾掉非正確範圍內之資料與載波(CARRIER DATAs),進而保留允許之信號,隨即整型後從信號腳輸出(接至MCU/CPU pin). 因市面上之遙控器並非都使用相同之CARRIER,故IR RECEIVER's BPF 亦有不同.(雖曾經有人倡導G-CODE). 原問題製造者應先確定所進行測試之REMOTE CONTROL & RECEIVER之資料是否MATCH,否則直接進行實驗或許會有怪怪的信號->DATA.
我現在遇到的問題是,就我所了解的當紅外線訊號接收到時它訊號一開始會先處於LOW一段時間所謂的(前導碼),然後HIGHㄧ段時間後才是真正的訊號,但是真的是所有的紅外線訊號(市售的遙控器訊號)都是這樣的嗎? 我知道要去把它訊完整訊號接收進來就要了解所有的紅外線訊號,但種是有些特例,認知的也有限,所以問問大家看大家經驗是怎樣的。
系統時間:2024-07-05 13:57:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!