有關於8051和ascii的問題謝謝

Home Home
引用 | 編輯 tgs0910
2006-03-27 23:15
樓主
推文 x1
小弟我的石英晶體是 11.0592我想用19200bps的速率
想 p2.1 on時就發射30h和31h
這樣寫對嗎
如果收到30h時 p1.1就on
收到31h時 p1.2就on  這要如何寫
收到的ascll碼是0還是1或是其他
請會的大大幫幫小弟謝謝
---------------------- ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 cmovies
2006-03-28 00:45
1樓
  
-13 應該為 F3, 算法為 2 補數 (一般電腦的負數都用 2 補數來算)
13 = 0Dh = 00001101 取 1 補數(就是反相) -> 11110010 再加 1 就為 2 補數 -> 11110011 = F3h
另外一種算法為 100h - 0Dh = F3h
你可用 Windows 的小算盤, 選擇檢視->工程型. 輸入 -13 然後換成 16 進位看最後兩位就是 F3h

想 p2.1 on時就發射30h和31h
這樣寫對嗎?
-> 不對, 你只有讀 p2.1 但沒有判別 1 或 0, 一般按鍵按下應該拉為 Low, 所以應該要判別 p2.1 為 0 時才動作

如果收到30h時 p1.1就on
收到31h時 p1.2就on  這要如何寫???
->
判別 ri 就可以知道有沒有收到資料, 但你的 SCON 中 REN 設為 0 根本收不到資料
所以 scon = 01111000b
接收很簡單
jnb ri, checkp21
clr ri
mov a, sbuf
cjne a, #30h, chkrcv31h
setb p1.1
jmp checkp21
chkrcv31h:
cjne a, #31h, checkp21
setb p1.2
checkp21:
setb p2.1 ; pull high p2.1 for input
jnb p2.1, START_9 ; 因為你的程式按下 p2.1 送完資料就停了, 所以不考慮這個按鍵是否已處理過的問題

收到的ascll碼是0還是1或是其他
-> 送什麼就收到什麼, 電腦送 Ɔ', 51 就收到 30h 你也可以寫成 Ɔ' 都一樣

獻花 x0
引用 | 編輯 tgs0910
2006-03-28 20:07
2樓
  
首先非常謝謝大大的幫忙
但是小弟還有一點小問題要麻煩大大的幫忙
不知道可不可以
請大大不令賜教幫幫小弟 謝謝


-> 不對, 你只有讀 p2.1 但沒有判別 1 或 0, 一般按鍵按下應該拉為 Low,
所以應該要判別 p2.1 為 0 時才動作



START_2:MOV     P2,#11111111B
    SETB   C
    MOV     C,P2.1
    jc     start_2
    jnc     start_9
這樣寫對嗎
如果不對請大大幫幫小弟改一下好嗎    
   


如果收到30h時 p1.1就on
收到31h時 p1.2就on  這要如何寫???


->
判別 ri 就可以知道有沒有收到資料, 但你的 SCON 中 REN 設為 0 根本收不到資料
所以 scon = 01111000b
接收很簡單
jnb ri, checkp21     若ri不等於零則跳checkp21
clr ri             把ri設為零
mov a, sbuf         把sbuf的內容存到a裡
cjne a, #30h, chkrcv31h 若a不等於30h時就跳到chkrcv31h
setb p1.1           把p1.1設為1
jmp checkp21         跳到check21
chkrcv31h:
cjne a, #31h, checkp21 若a不等於31h時就跳到checkp21h
setb p1.2           把p1.2設為1
checkp21:
setb p2.1 ; pull high p2.1 for input
jnb p2.1, START_9 ; 因為你的程式按下 p2.1 送完資料就停了,
所以不考慮這個按鍵是否已處理過的問題

請問一下我這樣的寫法
不是應該按下p2.1是就重復發送30h和31h嗎


請問一下這最後兩行是什麼意思
checkp21:
setb p2.1 ; pull high p2.1 for input
jnb p2.1, START_9 ;
這樣寫的話不是永遠p2.1等於1嘛
也永遠不會跳到start_9嘛



那我想p2.1等餘零時就發射30h和31h
等我收到30h時就p1.1亮
  收到31h時就p1.2亮是不是這樣寫
  我是用副控制
    ORG   00h          
    MOV   TMOD,#00100000B

    MOV   TH1,#0FDH    
    SETB   TR1      
    ORL   PCON,#80H
    MOV   SCON,#01111000B


START_2:MOV   P2,#11111111B
    SETB   C
    MOV   C,P2.1
    jc     start_2
    Jnc   START_9
   

START_9:mov   dptr,#table  
next:   mov   a,#0      
    movc   a,@a+dptr  
    cjne   a,#$,trans
    RET        
NEXT2: jnb   ri, chkp21    
    clr   ri            
    mov   a, sbuf        
    cjne   a, #30h, chk31h
    CLR   p1.1          
    jmp   chkp21        
chk31h: cjne   a, #31h, chkp21  
    CLR   p1.2          
chkp21: ORL   P2,#11111111B


trans: mov   sbuf,a    
    jnb   ti,$        
    clr   ti        
    inc   dptr        
    ajmp   next      

table: DB     30h
    DB     31h
    DB     $
如果我要收到30h和31h時on p1.3
    收到30h時on p1.1
    收到31h時on p1.2
要如何寫謝謝

獻花 x0
引用 | 編輯 cmovies
2006-03-29 11:05
3樓
  
START_2:MOV   P2,#11111111B
  SETB   C
  MOV   C,P2.1
  jc   start_2
  jnc   start_9
這樣寫對嗎
如果不對請大大幫幫小弟改一下好嗎  
->
這樣寫也可以, 但既然 mov c, p2.1 為何還要 setb c
有了 jc start_2 下一行可以寫 jmp start_9 也不會錯 (不是 1 就是 0 這在數位邏輯不會錯吧)
不過一般會用我下面的寫法
checkp21:
setb p2.1 ; pull high p2.1 for input
jnb p2.1, START_9 ;
這樣寫的話不是永遠p2.1等於1嘛
也永遠不會跳到start_9嘛
-> 當外部輸入拉為 Low 的話, 你讀到的就一定為 Low
setb p2.1 就跟你的 MOV   P2,#11111111B 一樣意思為pull high
在 8051 要讀外部輸入一般都會先將此 port 輸出為 High, 然後由外部輸入拉為 Low

那我想p2.1等餘零時就發射30h和31h
等我收到30h時就p1.1亮
收到31h時就p1.2亮是不是這樣寫
我是用副控制

  ORG   00h      
  MOV   TMOD,#00100000B

  MOV   TH1,#0FDH  
  SETB   TR1    
  ORL   PCON,#80H
  MOV   SCON,#01111000B


START_2:MOV   P2,#11111111B
  SETB   C
  MOV   C,P2.1
  jc   start_2
  Jnc   START_9
 

START_9:mov   dptr,#table  
next:   mov   a,#0    
  movc   a,@a+dptr  
  cjne   a,#$,trans
  RET      
-> 我沒看到你用 call, 為何要用 ret

NEXT2: jnb   ri, chkp21  
  clr   ri        
  mov   a, sbuf      
  cjne   a, #30h, chk31h
  CLR   p1.1      
  jmp   chkp21      
chk31h: cjne   a, #31h, chkp21  
  CLR   p1.2      
chkp21: ORL   P2,#11111111B
-> 下面怎麼直接到 trans 了??? 加個 jmp 吧!

trans: mov   sbuf,a  
  jnb   ti,$      
  clr   ti      
  inc   dptr      
  ajmp   next    

table: DB   30h
  DB   31h
  DB   $
如果我要收到30h和31h時on p1.3
  收到30h時on p1.1
  收到31h時on p1.2
要如何寫謝謝
->
on p1.1 應該是 setb p1.1 吧? 還是你輸出有反相???

如果我要收到30h和31h時on p1.3
-> 你說的是收到 30h, 31h 兩個 bytes 後 p1.3 要 ON 嗎?
你可以在收到 30h 設個 flag 然後再收到 31h 時判別該 flag 是否有設定就可以知道是否收到 30h 31h
如果收到其他資料要記得將該 flag 清除

獻花 x0
引用 | 編輯 tgs0910
2006-03-29 22:32
4樓
  
謝謝大大的幫忙
          ORG   00h    
            MOV   TMOD,#00100000B
            MOV   TH1,#0FDH  
            SETB   TR1  
            ORL   PCON,#80H
            MOV   SCON,#01111000B

START_9:   mov   dptr,#table  
next:       mov   a,#0  
            movc   a,@a+dptr  
            cjne     a,#$,trans
            jmp     start_9

NEXT2:     jnb     ri, chkp21  
          clr       ri      
          mov     a, sbuf    
          cjne     a, #30h, chk31h
          CLR       p1.1    
          jmp       chkp21    
chk31h:   cjne     a, #31h, chkp21  
          CLR       p1.2

chkp21:   setb p2.1 ; pull high p2.1 for input
          jnb p2.1, START_9 ;


   
trans:     mov     sbuf,a  
          jnb       ti,$    
          clr       ti    
          inc       dptr    
          ajmp     next  

table:     DB       30h
          DB       31h
          DB       $
這樣對嘛

你可以在收到 30h 設個 flag 然後再收到 31h 時判別該 flag 是否有設定就可以知道是否收到 30h 31h
如果收到其他資料要記得將該 flag 清除

可以在說的清楚一點嘛
小弟太笨了
請大大多幫忙感激不盡謝謝

獻花 x0
引用 | 編輯 cmovies
2006-03-30 01:00
5樓
  
怎麼越寫越奇怪???
修改如下:
    ORG   00h  
    MOV   TMOD,#00100000B
    MOV   TH1,#0FDH  
    SETB   TR1  
    ORL   PCON,#80H
    MOV   SCON,#01111000B
    clr   20h.0
START:
    jnb   ri, checkp21
    clr   ri
    mov   a, sbuf
    cjne   a, #30h, chkrcv31h
    setb   p1.1
    setb   20h.0
    jmp   checkp21
chkrcv31h:
    cjne   a, #31h, rcvother
    setb   p1.2
    jnb   20h.0, checkp21
    setb   p1.3         ; 收到 30h, 31h
    clr   20h.0
    jmp   checkp21
rcvother:
    clr   20h.0       ; 非 30h, 31h
checkp21:
    setb   p2.1         ; pull high p2.1 for input
    jnb   p2.1, START_9
    jmp   START
   
START_9:
    mov   dptr, #table
next:   mov   a,#0
    movc   a,@a+dptr
    cjne   a,#'$',trans
    jmp   START
     
trans: mov   sbuf,a
    jnb   ti,$
    clr   ti
    inc   dptr
    ajmp   next
table: DB     30h, 31h, '$'

獻花 x0
引用 | 編輯 tgs0910
2006-03-31 00:11
6樓
  
謝謝大大的幫忙
不知大大是否有用過 rs485 和8051來傳輸
如果有的話請大大幫小弟看一下好嗎
我把8051的 rx接485的第一支腳
          tx 接485的第四支腳
          485的第二和第三腳接0時input
                            接1時output
                第五腳接地
                第八腳接+5v
                第六腳接d+
                第七腳接d-
這樣對嗎
但是我用兩顆8051這樣接卻不能用
還是第六七腳要在接啥東西
麻煩大大幫幫小第謝謝

獻花 x0
引用 | 編輯 cmovies
2006-03-31 12:35
7樓
  
RS485 IC 第六七腳就是真正的訊號的輸出/輸入(差動訊號).
因為 485 為兩線式 Bus 訊號, 同時只能有一方送訊號(半多工)
所以第三腳 DE 就為發送時拉 High, 其他時候拉 Low (允許別人發送)
第二腳 /RE 為接收致能(Receive Enable), 必須拉為 Low 才可以接收.

兩個 8051 透過 RS485 來通訊, 就必須將兩個板子上 RS485 D+ D- 透過兩芯線接在一起才會通

以你的程式應該有送有收吧? 還是只有一個送一個收???
如果只有一送一收那你RS485的接法應該可以用!

一般 RS485 腳位的接法, 都是第三腳接到 8051 的某個 I/O, 發送時拉 High
第二腳直接接地, 永遠可以接收.

假設 P1.7 接到 RS485 第三腳 DE
setb p1.7 ; DE 拉 High 發送
mov sbuf, a
jnb ti, $
clr ti
clr p1.7 ; DE 拉 Low 允許其他人發送

獻花 x0
引用 | 編輯 tgs0910
2006-04-03 18:34
8樓
  
ORG   0000H
    MOV   TMOD,#00100000B
    MOV   TH1,#230
    MOV   TL1,#230
    SETB   TR1
;
    MOV   SCON,#01110000B
;
   
LOOP:   CLR   RI
    CLR   TI
    MOV   SBUF,P2
WAIT1: JNB   TI,WAIT1
;
WAIT2: JNB   RI,WAIT2
   
;
    ORL   P1,#11111111B    
    MOV   A,SBUF
    JNB   ACC.0,CASE0
    JNB   ACC.1,CASE1
    JNB   ACC.2,CASE2
    JNB   ACC.3,CASE3
    JNB   ACC.4,CASE4
    JNB   ACC.5,CASE5
    JNB   ACC.6,CASE6
    JNB   ACC.7,CASE7
    AJMP   LOOP

 
CASE0: CLR   P1.0
    AJMP   LOOP
CASE1: CLR   P1.1
    AJMP   LOOP
CASE2: CLR   P1.2
    AJMP   LOOP
CASE3: CLR   P1.3
    AJMP   LOOP
CASE4: CLR   P1.4
    AJMP   LOOP
CASE5: CLR   P1.5
    AJMP   LOOP
CASE6: CLR   P1.6
    AJMP   LOOP
CASE7: CLR   P1.7
    AJMP   LOOP


小弟是做一發一送
這是小弟的程式兩顆都一樣
但是小弟照大大的說法接
把a的第三腳接地
把b的第三腳接正
但是為何我把b的p2.1 on為零時
卻兩顆8051的1.都會亮
如果把b的第二支腳也接正時會出現亂亮的問題
但我不接75176時卻不會有這個問題
請大大幫幫小弟謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-04 01:34
9樓
  
你的 SCON 中的 REN 沒有設為 1 可以接收到任何資料嗎???
我不曉的你原本的 b 的第二腳 /RE 是否接地?
因為 485 有個特性自己送的資料自己會收到, 所以 b 的第二腳 /RE 應該接 High 才不會收到自己的資料
8051 的 P0, P2 為開集極(Open drain), 所以一定要 pull high (可用 4.7K 電阻接 Vcc)

獻花 x0
引用 | 編輯 tgs0910
2006-04-04 17:58
10樓
  
大大可以收到
我a和b的第二腳都接地
那請問一下到底要如何接
才能不要接收到自己的資料
又能當a發射時b能接收
    當b發射時a能接收
但是大大我把 /re 接4.7k電阻接vcc
不管是A接或B接
兩顆都部會亮
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-06 01:28
11樓
  
你到底要一送一收還是兩邊都可以送收??? 或是你要利用 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
引用 | 編輯 tgs0910
2006-04-06 20:43
12樓
  
大大不好意思小弟沒說清楚
小弟想要 a 送資料時只有 b 收到
        b 送資料時只有 a 收到
非同步

SCON 中的 bit 3 為 REN, 8051 的資料上寫的是接收致能, 如果沒設為 1 應該無法接收
不過我倒沒試過設為 0 還能不能接收, 因為書上寫要設為 1, 那為何要設為 0 呢???
能接收
參考金華的書


我不曉的你的 P2 有沒有 pull high, 如果沒有的話, 那麼 MOV SBUF,P2 會送出什麼資料就很難講了
大大所為的 pull high是要外接4.7k的電組還是要在程式上
因為小弟是用副控制

就是要讓p的那知腳亮就把p2和地接在一起
像小弟這種做法須要 pull high嘛
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-07 00:00
13樓
  
小弟想要 a 送資料時只有 b 收到
    b 送資料時只有 a 收到
非同步
-> 我想 RS485 的控制你應該都知道了, 那 A 或 B 想發送資料就必須 DE, /RE 接對電位才行

不過一般我們的應用都是 DE 接到 CPU 的接腳, 要發送之前將 DE 拉 High, 送完後拉Low
/RE 永遠接地來接收. 然後在 Serial INT 內判別 DE 是否為 High, 如果是的話將收到的資料丟掉.
因為這是自己送出來的資料經由RS485 Bus回來.

大大所為的 pull high是要外接4.7k的電組還是要在程式上
因為小弟是用副控制
-> 什麼是副控制??? 我一般是程式跟外部接4.7K到Vcc兩者都用

獻花 x0
引用 | 編輯 tgs0910
2006-04-07 16:44
14樓
  
小弟所謂的副控制就是把接腳接地
                                不接vcc
就是 正電壓永遠on住
要讓哪個動作就加負電壓

然後在 Serial INT 內判別 DE 是否為 High, 如果是的話將收到的資料丟掉
可不可以請大大說清楚一點
小弟太笨了
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-07 19:26
15樓
  
小弟所謂的副控制就是把接腳接地
                    不接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
引用 | 編輯 tgs0910
2006-04-17 21:07
16樓
  
大大不好意思
小弟為了這個問題
去買了一台示波器
小弟的設計是要由8051來控制
rs485的發射和接收
就是像大大所寫的程式那樣
可以發射也可以接收
當a發射時b就接收
當b發射時a就接收
不是同時發射接收
就是經由 RS485 DE, /RE 接 8051的一隻腳用程式寫High 或 Low 來決定
大大你先不管我要用8051來控制的那一段
我現在最大的疑問是
我用a單做發射
    b單做接收
我現在把b的DE, /RE 接地
    把a的 / RE 接地
            DE接VCC時
B可以收到A發射的東西
但是當我把A的DE, /RE接VCC時
B卻收不到A發射的東西

第二個問題是
我用示波器去量ASCII碼時量出來的東西跟二進制的東西是不同的
為什麼會這樣
我用探棒的黑色鱷魚夾去接地
然後用探棒去接8051的RXD
謝謝

第三個問題是
89S52的ASCII碼可以改是發射7個或是8個位元嘛
一般的ASCII碼不是有發射7個位元和8個位元兩種模式嘛
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-19 02:12
17樓
  
有了示波器用來量訊號來找問題就變的很簡單了(前提當然是要會量囉!)
示波器不便宜吧! 如果數位儲存的應該要幾萬塊吧!? 蠻佩服你的上進心啦!

我用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
引用 | 編輯 tgs0910
2006-04-19 18:45
18樓
  
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
引用 | 編輯 cmovies
2006-04-19 19:36
19樓
  
為何收不到
還有我把/RE接VCC
-> 你說的應該是 A 端 /RE, DE 接 High, B 端的 /RE, DE 接 Low 吧!?

量時都沒有信號
-> B 端 RXD 量不到訊號? 確認一下這時 A 端的 TXD 有沒有訊號?
如果 A 端 TXD 有訊號而且 DE 接 High, 那麼可以量一下 RS485 第 6, 7 腳有沒有訊號.
如果沒有那就是 RS485 沒有送出去, 那 B 端 RXD 當然收不到

獻花 x0
引用 | 編輯 tgs0910
2006-04-19 21:16
20樓
  
不好意思時常麻煩大大的幫忙
老大請教一下我18樓的程式對嗎
就算用2顆8051對接也無法收到信號
謝謝
我今天又去買兩個75176
我共有六個75176
但是只有一個可以這樣接還收的到東西
程式是用大大幫小弟改的程式
ORG   00h  
  MOV   TMOD,#00100000B
  MOV   TH1,#0FDH  
  SETB   TR1  
  ORL   PCON,#80H
  MOV   SCON,#01111000B
  clr   20h.0
START:
  jnb   ri, checkp21
  clr   ri
  mov   a, sbuf
  cjne   a, #30h, chkrcv31h
  setb   p1.1
  setb   20h.0
  jmp   checkp21
chkrcv31h:
  cjne   a, #31h, rcvother
  setb   p1.2
  jnb   20h.0, checkp21
  setb   p1.3       ; 收到 30h, 31h
  clr   20h.0
  jmp   checkp21
rcvother:
  clr   20h.0     ; 非 30h, 31h
checkp21:
  setb   p2.1       ; pull high p2.1 for input
  jnb   p2.1, START_9
  jmp   START
 
START_9:
  mov   dptr, #table
next:   mov   a,#0
  movc   a,@a+dptr
  cjne   a,#'$',trans
  jmp   START
   
trans: mov   sbuf,a
  jnb   ti,$
  clr   ti
  inc   dptr
  ajmp   next
table: DB   30h, 31h, '$'
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-20 03:46
21樓
  
老大請教一下我18樓的程式對嗎
-> 有一行打錯字吧!
K5:   JB     P2.5,K5 <- 這應該是 K6

就算用2顆8051對接也無法收到信號
-> 你說的是用 18 樓的程式嗎? 如果是的話上面的錯誤會導致 P2.5 沒按下程式就停住不會送收了

我今天又去買兩個75176
我共有六個75176
但是只有一個可以這樣接還收的到東西
-> 不會吧! 六個只有一個正常. 你有加終端電阻嗎? 就是第 7, 8 腳接一個 50 歐姆
如果兩個 8051 對接會正常嗎???

我覺得你有示波器就應該善用工具來查, 這樣比較容易知道哪裡錯了!

獻花 x0
引用 | 編輯 tgs0910
2006-04-29 18:11
22樓
  
老大小弟終於找出問題的所在了
原來是小弟的麵包版太舊了
有些接觸不良
小弟換了一塊就沒這個問題了
謝謝大大的幫忙
不過小弟還有些問題
可否麻煩大大有空時幫幫小弟謝謝
ORG   00h          
    MOV   TMOD,#00100001B
    MOV   TH1,#0FDH    
    SETB   TR1
    ORL   PCON,#80H
    MOV   SCON,#01110000B
;
LOOP:   MOV   P1,#11111111B
    JNB   RI,K0
    CLR   RI
;
    MOV   A,SBUF
;
C1:   CJNE   A,#FFH,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,#FFH
    ACALL   DELAY
    JMP   K8
;
K1:   JB     P2.1,K2
    MOV   A,#31H
    ACALL   DELAY
    JMP   K8
;
K2:   JB     P2.2,K3
    MOV   A,#32H
    ACALL   DELAY
    JMP   K8
;
K3:   JB     P2.3,K4
    MOV   A,#33H
    ACALL   DELAY
    JMP   K8
;
K4:   JB     P2.4,K5
    MOV   A,#34H
    ACALL   DELAY
    JMP   K8
;
K5:   JB     P2.5,K6
    MOV   A,#35H
    ACALL   DELAY
    JMP   K8
;
K6:   JB     P2.6,K7
    MOV   A,#36H
    ACALL   DELAY
    JMP   K8
;
K7:   JB     P2.7,K9
    MOV   A,#37H
    ACALL   DELAY    
    JMP   K8
;
K9:   JMP   LOOP
;
K8:   MOV   SBUF,A
    JNB   TI,$
    CLR   TI
    JMP   LOOP  
;
DELAY: MOV   R4,#40
   
;
TIMER: MOV   TH0,#3CH
    MOV   TL0,#B0H
    SETB   TR0
;
WAIT:   JB     TF0,OK
    AJMP   WAIT
;
OK:   CLR   TF0
    DJNZ   R4,TIMER
    RET
   
;
END
小弟這樣寫哪裡有問題請大大幫小弟看一下
為什麼不能用
小弟看過可以用 一隻腳來選擇要用哪一段程式
然後把那一隻腳接地就永遠用那一段程式來執行
就是第一段把 P1.1 SETB 時就發射30H
    第二段把 P1.1 SETB 時就發射31H

請問大大知道大概要如何寫
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-04-30 23:52
23樓
  
小弟這樣寫哪裡有問題請大大幫小弟看一下
為什麼不能用
-> 我不曉得你所謂的不能用是指什麼問題?
唯一能看出不太合理的地方是收到資料後, 如果 P2 沒有被按下那麼 P1 的動作立刻就消失了
LOOP:   MOV   P1,#11111111B <- 就是這行
就算 P2 有被按下, 兩秒鐘後 P1 得動作也會消失 (DELAY 在 12 MHz 應該是兩秒吧!?)

如果你的程式是想要發送端的 P2 被按了哪些, 接收端的 P1 相對應的腳位就拉 High 其他為 Low.
那直接把 P2 送出去就好了
  ORG   00h      
  MOV   TMOD,#00100001B
  MOV   TH1,#0FDH  
  SETB TR1
  ORL   PCON,#80H
  MOV   SCON,#01110000B
  MOV   P1,#11111111B  
LOOP:
  JNB   RI,K0
  CLR   RI
  MOV   A,SBUF
  MOV   P1, A
K0:
  MOV   P2,#11111111B
  NOP
  MOV   A,P2
  CPL   A
  MOV   SBUF,A
  CALL DELAY
  JMP   LOOP

DELAY:
  MOV   R4,#40
TIMER:
  MOV   TH0,#3CH
  MOV   TL0,#B0H
  CLR   TF0
  SETB TR0
WAIT:
  JNB   TF0,WAIT
  DJNZ R4,TIMER
  RET
 
  END

小弟看過可以用 一隻腳來選擇要用哪一段程式
然後把那一隻腳接地就永遠用那一段程式來執行
就是第一段把 P1.1 SETB 時就發射30H
  第二段把 P1.1 SETB 時就發射31H
-> 這跟你用 JB 來判別要送哪個資料有什麼不一樣嗎???
LOOP:
  JB   P0.0, CODE1
  JMP   CODE2
CODE1:
  ;
  JMP   LOOP
CODE2:
  ;
  JMP   LOOP

獻花 x0
引用 | 編輯 tgs0910
2006-05-04 21:07
24樓
  
大大不好意思小弟最近比較忙
所以會很晚回復大大的幫忙
小弟是用做串列傳輸用的
還有是要跟plc做串列傳輸
只是先拿兩個8051做試驗
所以要這樣寫

小弟這樣寫卻無法收到資料

對2秒

大大不好意思貌冒昧請教大大一下
大大目前在做什麼事
如果小弟有case要做大大會有意願嗎
謝謝

獻花 x0
引用 | 編輯 cmovies
2006-05-04 21:53
25樓
  
PLC 很多都是用 MODBUS 吧! 像這樣的很少見, 還是 PLC 也是你們寫的?
你只要將條件說清楚, 這樣的小程式我可以給你範例你在自己改就好了

像單晶片最好不要用麵包版做測試, 一不小心出什麼問題都不知道

獻花 x0
引用 | 編輯 tgs0910
2006-05-09 21:47
26樓
  
謝謝大大的幫助
既然大大沒意願小弟也不勉強
只是這樣麻煩大大小弟真的很過意不去
只是這樣還要多多麻煩大大幫幫小弟

如果大大有任何需要 只要小弟辦的到的
小弟一定全力以赴
真是感激不盡

獻花 x0
引用 | 編輯 cmovies
2006-05-10 22:35
27樓
  
你太客氣了. 我也沒幫上多少忙!

有問題的人提出問題, 能回答的人回答這便是論壇的好處不是嗎!?

獻花 x0