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 |
|
|
|