cmovies
|
分享:
▲
▼
-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 你也可以寫成 Ɔ' 都一樣
此文章被評分,最近評分記錄財富:100 (by codeboy) | 理由: 很熱心的回答喔~^^給你一些獎勵喔~請繼續在此幫忙喔~^^thx | |
|
|
|
|
x0
[1 樓]
From:台灣中華電信
| Posted:2006-03-28 00:45 |
|
|
tgs0910
|
分享:
▲
▼
首先非常謝謝大大的幫忙 但是小弟還有一點小問題要麻煩大大的幫忙 不知道可不可以 請大大不令賜教幫幫小弟 謝謝
-> 不對, 你只有讀 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
[2 樓]
From:台灣中華電信
| Posted:2006-03-28 20:07 |
|
|
cmovies
|
分享:
▲
▼
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
[3 樓]
From:台灣中華電信
| Posted:2006-03-29 11:05 |
|
|
tgs0910
|
分享:
▲
▼
謝謝大大的幫忙 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
[4 樓]
From:台灣中華電信
| Posted:2006-03-29 22:32 |
|
|
cmovies
|
分享:
▲
▼
怎麼越寫越奇怪??? 修改如下: 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
[5 樓]
From:台灣中華電信
| Posted:2006-03-30 01:00 |
|
|
tgs0910
|
分享:
▲
▼
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時卻不會有這個問題 請大大幫幫小弟謝謝
[ 此文章被tgs0910在2006-04-03 18:42重新編輯 ]
|
|
x0
[8 樓]
From:台灣
| Posted:2006-04-03 18:34 |
|
|
|