本人最近写了个串口收发数据程序,利用按键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 |