导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:89c2051串口通信,问题原程序[digiboy]

 *第8377篇: C51编程:89c2051串口通信,问题原程序

  
楼 主:digiboy 2003年2月22日13:59
 C51编程:89c2051串口通信,问题原程序
我用at89c2051做了个最简单的系统,用MOV SBUF,A发数据时,一发某些数值就会造成
无法运行,有些数发了没事。rxd,txd没接线时也是这样。这是为什么??
程序:
        SJMP    START
        ORG     0023H
        AJMP    RXD_INT

START:  MOV     IP,#00H
                          ;SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
        MOV     SCON,#11010000B ; 1   1   0   0   0   0  0  0
        MOV     A,PCON
        ANL     A,01111111B     ;SMOD=0
        MOV     PCON,A
        MOV     P1,#00H
        MOV     TCON,#00H
        MOV     IE,#00H
        MOV     TH1,#0FDH       ;波特率9600
        MOV     TL1,#0FDH
                          ;TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
        MOV     TMOD,#00100000B;   0    0  1   0   0    0   0  0
        SETB    TR1
        SETB    ES
        SETB    EA
        MOV     A,#0FH

LOOP:   ACALL   DELAY     ;循环的发数据
        ACALL   SENT
        SJMP    LOOP

DELAY:  MOV     R0,#0FFH  ;延时子程序
        MOV     R1,#0FFH  ;延时:执行r0*r1*r2条djnz指令的时间
        MOV     R2,#05H   ;
D_1:    DJNZ    R2,INIT_2 ;
        RET               ;延时完成,返回
INIT_2: MOV     R1,#0FFH  ;
D_2:    DJNZ    R1,D_3    ;
        SJMP    D_1       ;
D_3:    MOV     R0,#0FFH  ;
        DJNZ    R0,$      ;
        SJMP    D_2       ;

SENT:   MOV     SBUF,A    ;问题就在这,发某些数就停了
        MOV     P1,A      ;
        INC     A         ;实验发送0-255
        RET

RXD_INT:CLR     TI        ;
        JB      RI,RCV    ;
        RETI              ;
RCV:    CLR     RI        ;接收的数据从p1口显示
        MOV     P1,SBUF   ;p1口接8个LED
        RETI

  
2楼:tm1300 2003年2月22日15:21
 参考
 A.你那里的延时程序会起干扰作用的(会打断正常的数据传送),解决方式:
1.不打开串口中断,往SBUF送数据以后,检测TI标志
  例如:我刚才举的例子写法(只要设置好波特率,打开相应定时器就行了)
2.是在中断中加标志,例如:(TIFG)
SENT:   MOV     SBUF,A    ;问题就在这,发某些数就停了
        JNB TIFG,$  
        CLR TIFG
        INC     A         ;实验发送0-255
        RET

RXD_INT:JB      RI,RCV    ;
        CLR     TI        ;
        SETB    TIFG
        RETI              ;
RCV:    CLR     RI        ;接收的数据从p1口显示
        MOV     P1,SBUF   ;p1口接8个LED
        RETI      
B.你的串口通讯是方式为3,那么,根据奇偶校验等,你的TB8是要不断附值的。建议
串口通讯方式是使用方式1。


   

  
3楼:tm1300 2003年2月22日15:32
 说明
以串口发送一个字节为例:其实,串口通讯过程中,往SBUF送数据以后,数据按起始位,数
据位(高到低),校验位(如果有),停止位的方式,一位一位往外移,而且,每移一个
BIT的时间是固定的(通过波特率可以计算)的。如果,整个过程没有结束,则一个字节也
就没有发送成功。如果在这个过程中,又往SBUF里送数据,那么外部接收的数据肯定乱套
了。如果是方式3的话,校验位也很重要。
  
4楼:红心J 2003年2月22日20:11
 re
经循环测试您的程序,没有发现停机问题,程序应该没有问题。
*注意*
如果使用串信接收,应将“REN”置“1”(SETB REN)。
  
5楼:digiboy 2003年2月22日23:45
 难道我买的at89c2051有问题
难道我买的at89c2051有问题,你是用的这个吗。谢谢你
  
6楼:红心J 2003年2月23日08:51
 at89c2051
at89c2051应该没有问题,可以换一片试试。
用过很多at89c2051,只有在零下二十几度的环境下很少部分极偶尔出现问题。
您的源程序没有允许接收,记得改一下,“REN”=“1”。
  
7楼:tm1300 2003年2月23日10:38
 我看的还不够仔细呀,呵呵
综合一下两个人的建议就行了呀,还有你的复位电路千万不要是看门狗电路,那可能
还要喂狗呢。
  
8楼:digiboy 2003年2月23日18:08
 是复位电路问题吗?
我的复位电路是这样接的:RST通过10UF电容接到VCC,RST还接了个1K的电阻到地。
不会是你说的看门狗电路吧。
  
9楼:tm1300 2003年2月23日21:21
 别问了,你是的程序问题,已经给你提示了,剩下的自己试试吧,那样容易加深印象
  
10楼:红心J 2003年2月24日02:44
 复位没问题。
接收允许“ren"发生错误。
已经说过了,可能没同意。
源程序除不能接收外,都测试过,应该没问题(不是1万/万)。
  
11楼:digiboy 2003年2月24日23:04
 在89c51上一点问题都没有。非常谢谢 红心J和tml300
在89c51上一点问题都没有,装到2051就不行。再不用2051了。
非常谢谢 红心J和tml300
  
12楼:@123 2003年2月24日12:07
  ANL     A,01111111B     ;SMOD=0
 7应该是
ANL     A,#01111111B     ;SMOD=0
  
13楼:LIULI 2006年10月18日09:30
 与温度无关的新(芯)片
现在还有在用at89c2051吗?

>>>>>>对该主题发表你的看法

本主题贴数13,分页: [第1页]


[上一篇主题]:C51编程:请教一个定时器中断的程序

[下一篇主题]:硬件:网卡rj45上有RTX+,RTX-,RX+,RX-,我想知道的是,网卡是怎么传送数据的?