导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→帮帮忙看下这个串口程序出什么问题了……[lee40106]

 *第42823篇: 帮帮忙看下这个串口程序出什么问题了……

  
楼 主:lee40106 2006年8月22日19:28
 帮帮忙看下这个串口程序出什么问题了……
ORG 0000H
                JMP START
                ORG 23H                        ;串口中断入口地址
 JMP SIO_INT
 ORG 0100H

START: CLR EA                         ;关所有中断
T1_SET: MOV     TMOD,#20H                ;设定T1定时器,方式2定时
 MOV TL1,#0D0H           
 MOV TH1,#0D0H
SIO_SET:  MOV     PCON,#80H                   ;波特率加倍 1200
 MOV     SCON,#0D0H              ;设定串口工作在多机模式3,允许接收
 SETB TR1                      ;启动定时器1
 SETB ES                         ;------------
 SETB EA                        ;串口中断允许


BEGIN1: MOV     A,#0BFH                       ;没有中断是发送BF
            MOV     SBUF,A
WAIT1:  JNB     TI,WAIT1
             CLR     TI
             CALL    DELAY
            JMP     BEGIN1

SIO_INT:   CLR EA                ;串口中断地址入口
 CLR ES
 CLR RI
                MOV A,SBUF
                CJNE    A,#0H,QUIT
                MOV     SBUF,A
 MOV     R3,#30
                CALL    DELAY
                CJNE    A,#0FFH,QUIT
BEGIN:      MOV     A,#0AFH           ;收到FF后发送AF
               MOV     SBUF,A
WAIT3:    JNB     TI,WAIT3
              CLR     TI
              CALL    DELAY
             JMP     BEGIN

DELAY:
             MOV    R1,#0
DL2:       MOV    R2,#0
DL1:       DJNZ   R2,DL1
             DJNZ   R1,DL2
             RET

QUIT:   RETI

        END

不知道怎么回事,程序一运行就进入中断了,串口助手显示收到一个00触发了中断,而我真正给它发数据请求中断时它又不理,怎么回事啊??

  
2楼:Kallor 2006年8月23日10:42
 你是否需要这样的程序吗
 ORG 0000H
            JMP    START
 
 ORG 23H                         ;串口中断入口地址
  JMP    SIO_INT
  
 ORG 0100H 

START:
 CLR     EA                      ;关所有中断

T1_SET:
        MOV     TMOD,#20H               ;设定T1定时器,方式2定时
 MOV     TL1,#0D0H           
 MOV     TH1,#0D0H

SIO_SET:
        MOV     PCON,#80H               ;波特率加倍 1200
 MOV     SCON,#0D0H              ;设定串口工作在多机模式3,允许接收
        SETB    TR1                     ;启动定时器1
        SETB    ES                      ;------------
        SETB    EA                      ;串口中断允许

BEGIN1:
        MOV     A,#0BFH                 ;没有中断是发送BF
        MOV     SBUF,A

WAIT1: 
 JNB     TI,WAIT1
        CLR     TI
 ACALL   DELAY
 JMP     BEGIN1

SIO_INT:                                ;串口中断地址入口
        JB      TI,QUIT                 ;如发送产生中断跳出中断处理程序
 CLR     EA                      
 CLR     ES
 CLR     RI
 MOV     A,SBUF
 JZ      QUIT_ON                 ;如接收数据为"0"则退出中断程序
 MOV     SBUF,A                  ;将接收的数据再发送回去
 MOV     R3,#30

WAIT2:
        JNB     TI,WAIT2                ;等待发送完成
  CJNE    A,#0FFH,QUIT_ON

BEGIN:
        CLR     TI
 MOV     A,#0AFH                 ;收到FF后发送AF
 MOV     SBUF,A

WAIT3:
 JNB     TI,WAIT3
  CLR     TI
 ACALL   DELAY
 
QUIT_ON:   
        SETB    EA
 SETB    ES

QUIT:
 RETI
 

DELAY:
        MOV     R1,#0

DL2:
        MOV     R2,#0

DL1:
        DJNZ    R2,DL1
 DJNZ    R1,DL2
 RET


 END


你是否需要这样的程序吗?根据你的描述及所写的程序很难看清你想要完成的动作。
如需帮助可以将要求发给我。

Kallor168@yahoo.com.cn


  
3楼:galiu 2006年8月23日11:23
 程序里有些问题
第一次进中断是因为你发数据时引发了串口中断。
另外在你的中断服务程序里你关了中断,忘记打开了。
所以之后既使有串口数据进来,也不会再引发中断。

仔细看看书上的例程,好好想清楚再动手。

  
4楼:galiu 2006年8月23日11:31
 中断服务程序有点乱
另,中断服务程序里有点乱,还真是看不出你的意图...
  
5楼:galiu 2006年8月23日12:01
 刚好有点时间仔细看一下
中断服务程序里逻辑错误。
先判断收到的数据是否为0,不为0就直接出中断;
然后又加了一次判断同一数据是否为0FFH,不是又直接出中断了;
这样发数据的程序什么时候能执行啊?

另外,把这两个自相矛盾的判断无视掉之后,
后面的发送过程,是无限发送下去的... 汗个。


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

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


[上一篇主题]:寻求1688LCD模块资料

[下一篇主题]:嵌入式培训机构(也是MIPS、Vxworks原厂商指定培训)