打印

大虾们帮忙看看简单的串口中断收发数据问题(汇编)

[复制链接]
1606|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liaoyaohui|  楼主 | 2010-7-20 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近写了个串口收发数据程序,利用按键P1.0发数据,再测试利用串口中断收到一串数据后储存起来,再立即发送出去(不用按键发),接受中给P1.7口的指示灯取反(高电平灯灭)。单片机复位工作后先按键发送数据用串口助手接受的数据一切正常,可串口助手发送一串数据给单片机时,前面一次返回的数据和第二第三次的不同,三次后返回的数据都是一样的。但此时再按键P1.0单片机就发数据不出,且接受的指示灯一直常亮。还请各位高手耐心看完,指导指导下小弟!!程序如下:
ORG 0
JMP MAIN
ORG  0023H
CALL UART_INT
ORG 0030H
MAIN:
ACALL CSH            //初始化串口
SETB P1.7            //指示灯灭
START:
SETB P1.7
  JB  P1.0,$
    CALL DELAY1
JNB  P1.0,$           //等待按键松开
CLR  A
MOV  R5,#12       //数据长度
MOV  R6,#0
MOV  DPTR,#TABD      //指向表格地址
LOOP:   
CLR  EA                    //关中断
MOVC  A,@A+DPTR         ;查表取数    ///////发码成功
MOV  30H,A
CALL CHUAN
    INC   DPTR
CLR  A
DJNZ R5,LOOP      
SETB  EA                  //开中断
JMP  START
CHUAN:                       //发送子程序
MOV  SBUF,30H
JNB  TI,$
CLR  TI
RET
CSH:                                //串口初始化子程序
MOV  SP,#50H
MOV  TMOD,#00100001B
MOV  SCON,#01010000B
MOV  PCON,#80H
MOV  TL1,#0FAH
MOV  TH1,#0FAH                // 9600波特率
SETB EA
SETB TR1
SETB ES
RET
UART_INT:                              ///中断程序
CLR  EA
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH
MOV  PSW,#08H                      //切换寄存器组1
    MOV  R1,#35H                     
MOV  R2,#8
JIESHOU:
JNB  RI,$
CLR  RI
CPL  P1.7                             //接受时取反指示灯
MOV  @R1,SBUF                   //把数据存35H开始的地址中
INC  R1
DJNZ R2,JIESHOU
MOV  R2,#8
MOV  R1,#35H
SETB P1.7
FASONG:                             //接受后再发送出去8个字节
MOV  30H,@R1
MOV  SBUF,30H
JNB  TI,$
CLR  TI
INC  R1
DJNZ R2,FASONG
POP  DPH
POP  DPL
POP  ACC
POP  PSW
SETB EA
SETB P1.7
RETI      
DELAY1:
MOV  R7,#200
D2: MOV  R6,#75
DJNZ R6,$
DJNZ R7,D2
RET
TABD:
DB 0AEH,00H,00H,01H,06H,31H,30H,31H,30H,31H,30H,0A8H
END

相关帖子

沙发
liaoyaohui|  楼主 | 2010-7-20 21:33 | 只看该作者
这样太难看了,各位可以拷贝到Keil中看没这么累,万分谢谢!
ORG 0
JMP MAIN
ORG  0023H
CALL UART_INT
ORG 0030H

MAIN:
        ACALL CSH            //初始化串口
     SETB P1.7            //指示灯灭

START:
        SETB P1.7
        JB  P1.0,$
        CALL DELAY1
        JNB  P1.0,$           //等待按键松开
     CLR  A
        MOV  R5,#12       //数据长度
     MOV  R6,#0
        MOV  DPTR,#TABD      //指向表格地址
LOOP:   
        CLR  EA                    //关中断
     MOVC  A,@A+DPTR         ;查表取数    ///////发码成功
     MOV  30H,A
       CALL CHUAN
       INC   DPTR
       CLR  A
       DJNZ R5,LOOP      
       SETB  EA                  //开中断
     JMP  START

CHUAN:                       //发送子程序
      MOV  SBUF,30H
         JNB  TI,$
         CLR  TI
         RET

CSH:                                //串口初始化子程序
      MOV  SP,#50H
         MOV  TMOD,#00100001B
         MOV  SCON,#01010000B
         MOV  PCON,#80H
         MOV  TL1,#0FAH
         MOV  TH1,#0FAH                // 9600波特率
      SETB EA
         SETB TR1
         SETB ES
         RET

UART_INT:                              ///中断程序
      CLR  EA
         PUSH PSW
         PUSH ACC
         PUSH DPL
         PUSH DPH
         MOV  PSW,#08H                      //切换寄存器组1
         MOV  R1,#35H                     
         MOV  R2,#8
JIESHOU:
         JNB  RI,$
         CLR  RI
         CPL  P1.7                             //接受时取反指示灯
      MOV  @R1,SBUF                   //把数据存35H开始的地址中
      INC  R1
         DJNZ R2,JIESHOU
         MOV  R2,#8
         MOV  R1,#35H
         SETB P1.7
FASONG:                             //接受后再发送出去8个字节
      MOV  30H,@R1
         MOV  SBUF,30H
         JNB  TI,$
         CLR  TI
         INC  R1
         DJNZ R2,FASONG
         POP  DPH
         POP  DPL
         POP  ACC
         POP  PSW
         SETB EA
         SETB P1.7
         RETI      

DELAY1:
         MOV  R7,#200
         D2: MOV  R6,#75
         DJNZ R6,$
         DJNZ R7,D2
         RET

TABD:
DB 0AEH,00H,00H,01H,06H,31H,30H,31H,30H,31H,30H,0A8H

END

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:听说21ic里面大虾多,我来学习学习。

18

主题

67

帖子

0

粉丝