| 
                
                  | cmovies 
         
  
 | 分享:        ▲
                    
                      ▼         
 
   你到底要一送一收還是兩邊都可以送收??? 或是你要利用 RS485 的腳位控制來當發送或接收端???
 不想接收 RS485 資料就把 /RE 接 High 就可以了.
 想發送資料的 RS485 第三腳 DE 接 High 就可以發送了, 但不可以兩邊同時接 High,
 那麼即使 8051 沒有發送也會有問題.
 SCON 中的 bit 3 為 REN, 8051 的資料上寫的是接收致能, 如果沒設為 1 應該無法接收
 不過我倒沒試過設為 0 還能不能接收, 因為書上寫要設為 1, 那為何要設為 0 呢???
 
 我不曉的你的 P2 有沒有 pull high, 如果沒有的話, 那麼  MOV SBUF,P2 會送出什麼資料就很難講了.
 
 假設情況:
 一. 經由 RS485 的腳位來決定 A 或 B 當發送端或接收端(或一個送另一個收)
 A 當發送端: RS485 DE 接 High, /RE 接 High.  B 當接收端: RS485 DE 接 Low, /RE 接 Low
 如果這種接法還不行, 你可以用示波器來量接收端 RS485 的第一腳是否有訊號進來.
 如果沒有示波器也可以用三用電表的 DC 電壓來量這隻腳.
 當有訊號接收時, 你會看到電壓會變動, 如果沒有資料的話電壓會維持在大約 5V 而且不會變動
 
 二. 兩者同時又想送也想收
 以 RS485 Bus 價購是無法雙向送收的.
 一般的作法是一個當 Master, 另一個當 Slave.
 由 Master 主動送資料給 Slave 然後等待 Slave 的回應
 這樣兩邊就不會有同時送資料的情況發生
 另一種作法就類似 Ethernet 網路的作法(CSMA/CD)
 簡單來說就是送之前先檢查 Bus 有沒有人在送資料
 如果沒有就將資料送出去並檢查送出去的資料是否正確(如果別人也在送資料可能會被破壞)
 一旦有問題就停止發送一段特定的時間(每片網路卡的特定時間不一定相同)
 然後再回到檢查 Bus 有沒有人在送資料的階段
 如此週而復始幾次後還不成功就告知上層傳送失敗.
 
 |  
                  | 
                
                  | 
 |  
                  |  x0  [11 樓]
                    
                    
                     From:台灣中華電信 
 |  Posted:2006-04-06 01:28 | |  |  
                
                  | cmovies 
         
  
 | 分享:        ▲
                    
                      ▼         
 
   小弟所謂的副控制就是把接腳接地不接vcc
 就是 正電壓永遠on住
 要讓哪個動作就加負電壓
 -> 這兩段話好像有點矛盾, "正電壓永遠 ON 住"跟"不接 Vcc" 不太合?
 不過這不是重點, 我不曉的你現在的情況有什麼問題嗎?
 還有我總覺得你想要 A 發送 B 接收, 然後又希望 A 接收 B 發送.
 這在你目前的軟硬體線路下應該是不可能的.
 還是我弄錯了??? 那你怎麼確定要由 A 發送或 B 發送??
 經由 RS485 DE, /RE 接 High 或 Low 來決定嗎?
 如果是就應該跟我 11 樓寫的情況一相同了
 那這樣會有問題嗎?
 
 Serial INT 指的是 8051 的串列中斷. 下面為我常用的程式寫法, 你可以參考看看
 但是我覺得重點是你的問題在哪裡是否己經清楚了, 不然我想改了也沒用吧!?
 
 org 0023h
 jmp SerialINT
 
 SeralINT:
 push psw
 push a
 PollSerial:
 jbc ti, TrmInt
 jbc ri, RcvInt
 jmp SerialINT_Exit
 TrmInt:
 setb XmtDataReady
 jmp PollSerial
 RcvInt:
 mov a, sbuf
 jb  P3.4, PollSerial  ; 假設 P3.4 接到 RS485 DE, 如果 DE 為 High, 就將資料丟掉
 ; 將收到的資料放在記憶體或直接判別也可以
 jmp PollSerial
 SerialINT_Exit:
 pop a
 pop psw
 reti
 
 SendChar:
 clr ti
 clr XmtDataReady
 setb p3.4   ; 將 RS485 DE 拉 High
 mov sbuf, a
 SendChar_Wait:
 jbc ti, SendChar_Exit
 jnb XmtDataReady, SendChar_Wait
 SendChar_Exit:
 clr p3.4  ; 將 RS485 DE 拉 Low
 ret
 
 |  
                  | 
                
                  | 
 |  
                  |  x0  [15 樓]
                    
                    
                     From:台灣中華電信 
 |  Posted:2006-04-07 19:26 | |  |  
                
                  | cmovies 
         
  
 | 分享:        ▲
                    
                      ▼         
 
   有了示波器用來量訊號來找問題就變的很簡單了(前提當然是要會量囉!)示波器不便宜吧! 如果數位儲存的應該要幾萬塊吧!? 蠻佩服你的上進心啦!
 
 我用a單做發射
 b單做接收
 我現在把b的DE, /RE 接地
 把a的 / RE 接地
 DE接VCC時
 B可以收到A發射的東西
 但是當我把A的DE, /RE接VCC時
 B卻收不到A發射的東西
 -> 這不太合理, 你可以量 B 端的 RXD 及 A 端的 TXD 看看那邊有問題?
 一般示波器應該有兩個 Channel, 你可以同時量測這兩隻腳就應該知道問題出在哪了?
 除非 /RE 接 High 會影響 DE, 不過看 datasheet 應該不會啊!
 所以量量看最容易知道問題在哪!
 如果 B 端的 RXD 及 A 端的 TXD 同時有訊號那麼就應該是你的程式或判斷有問題了!?
 
 第二個問題是
 我用示波器去量ASCII碼時量出來的東西跟二進制的東西是不同的
 為什麼會這樣
 我用探棒的黑色鱷魚夾去接地
 然後用探棒去接8051的RXD
 謝謝
 -> 這樣接沒錯, 應該是你解讀錯誤. RS232 的通訊協定一般為
 1 Start bit, 8 Data bits, 1 Stop bit
 Start bit 為 Low
 Data bit 為 bit 0 先送出, 然後 bit 1, 2, 3, 4...
 Stop bit 為 High
 例如: 你送出 Ɔ'(30h=00110000b), 示波器看到的是
 0 00001100 1 (1 Start bit,  8 Data bits, 1 Stop bit)
 
 三個問題是
 89S52的ASCII碼可以改是發射7個或是8個位元嘛
 一般的ASCII碼不是有發射7個位元和8個位元兩種模式嘛
 謝謝
 -> 可以. 如果為 7 Data bits, 一般都會再跟一個同位檢查位元 (Parity bit), 有四種模式
 1. Even(偶同位) - 所有 Data bits 的 1 必須為偶數, 如 0000100 同位元就為 1 湊成偶數
 2. Odd(奇同位) - 所有 Data bits 的 1 必須為奇數, 如 0000110 同位元就為 1 湊成奇數
 3. Space - 強迫為 0
 4. Mark - 強迫為 1
 8051 只支援 8 Data bits, 9 Data bits 所以如果要 7 Data bits
 你可以選擇用 Mark(如果接收者沒有同位檢查位元), 或跟接收者同樣的同位檢查
 8051 可沒有像 PC 的 UART chip 一樣有上面幾種模式可以選
 如果你要同位檢查必須自己寫程式加上去
 例如: (7 Data bits)
 1. Even: (利用 8051 PSW 中的 P 位元, 因為 8051 的 P 位元就是偶同位)
 clr a.7
 mov c, p
 mov a.7, c
 mov sbuf, a
 2. Odd:
 clr a.7
 mov c, p
 cpl c
 mov a.7, c
 mov sbuf, a
 3. Space
 clr a.7
 mov sbuf, a
 4. Mark
 setb a.7
 mov sbuf, a
 
 |  
                  | 
                
                  | 
 |  
                  |  x0  [17 樓]
                    
                    
                     From:台灣中華電信 
 |  Posted:2006-04-19 02:12 | |  |  
                
                  | tgs0910   
         
  
 | 分享:        ▲
                    
                      ▼         
 
   ORG        00h               MOV       TMOD,#00100000B
 MOV       TH1,#0FDH
 SETB      TR1
 ORL        PCON,#80H
 MOV       SCON,#01110000B
 ;
 LOOP:   JNB         RI,K0
 CLR         RI
 ;
 MOV       A,SBUF
 ;
 C1:       CJNE       A,#30H,C2
 CLR        P1.0
 JMP        K0
 ;
 C2:       CJNE       A,#31H,C3
 CLR        P1.1
 JMP        K0
 ;
 C3:        CJNE      A,#32H,C4
 CLR        P1.2
 JMP        K0
 ;
 C4:       CJNE       A,#33H,C5
 CLR        P1.3
 JMP        K0
 ;
 C5:       CJNE       A,#34H,C6
 CLR        P1.4
 JMP        K0
 ;
 C6:       CJNE       A,#35H,C7
 CLR        P1.5
 JMP        K0
 ;
 C7:       CJNE       A,#36H,C8
 CLR        P1.6
 JMP        K0
 ;
 C8:       CJNE       A,#37H,LOOP
 CLR        P1.7
 JMP        K0
 ;
 K0:       MOV       P2,#11111111B
 JB          P2.0,K1
 MOV       A,#30H
 JMP        K8
 ;
 K1:       JB          P2.1,K2
 MOV      A,#31H
 JMP        K8
 ;
 K2:       JB          P2.2,K3
 MOV       A,#32H
 JMP        K8
 ;
 K3:       JB          P2.3,K4
 MOV       A,#33H
 JMP        K8
 ;
 K4:       JB          P2.4,K5
 MOV       A,#34H
 JMP        K8
 ;
 K5:      JB           P2.5,K5
 MOV        A,#35H
 JMP         K8
 ;
 K6:     JB           P2.6,K7
 MOV       A,#36H
 JMP        K8
 ;
 K7:     JB          P2.7,LOOP
 MOV        A,#37H
 JMP         K8
 ;
 K8:     MOV      SBUF,A
 JNB       TI,$
 CLR       TI
 AJMP     LOOP
 ;
 END
 大大請問一下我這樣寫有什麼問題
 為何收不到
 還有我把/RE接VCC
 量時都沒有信號
 我去
 
 |  
                  | 
                
                  | 
 |  
                  |  x0  [18 樓]
                    
                    
                     From:台灣
 |  Posted:2006-04-19 18:45 | |  |  |