引用 | 编辑
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 |