引用 | 編輯
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 |