有关于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