求助:一个单片机串口通信的程序,请帮忙找下错误
将单片机与计算机通过RS232相连,单片机的P1.4接蜂鸣器,P1.5接红灯,P1.6接绿灯。调试时使用串口调试助手。当从输入18H时,要求蜂鸣器响,19H时红、绿灯一起亮,1AH时红灯亮,1BH时绿灯亮。
下面是我的程序。调试时基本已实现了要求,可是,有一点毛病,比如我先输入18H,蜂鸣器响了,然后我再输入1AH,正确的结果是红灯亮,我的程序是先是蜂鸣器响,然后再发一次,红灯才会亮,我搞了好久,真不知道怎么办了,哪位高手帮帮忙啊!
ORG 0000H
LJMP START
ORG 0023H
START: MOV SP,#30H
MOV TMOD, #21H ; 定时计数器0工作于方式1,1工作于方式2
MOV TH1, #0FDH ; 波特率9600
MOV TL1, #0FDH
MOV SCON, #50H ; 置串口为方式1,允许接收
SETB TR1
SETB EA ; 开中断
SETB ES ; 允许串口中断
LOOP: LCALL SIN
LCALL DELAY_1
AJMP LOOP
SIN: MOV A,SBUF
JNB RI,$
CLR RI
CJNE A,#18H,GR ;如果收到18H,即"↑",蜂鸣器响
JNB RI,$
CLR RI
CLR P1.4
LCALL DELAY_1
SETB P1.4
RET
GR: CJNE A,#19H,RED ;如果收到19H,即"↓",红、绿灯一起亮
JNB RI,$
CLR RI
CLR P1.6
CLR P1.5
LCALL DELAY_1
SETB P1.6
SETB P1.5
SETB ES
RET
RED: CJNE A,#1AH,GREEN ;如果收到1AH,即"→",红灯亮
JNB RI,$
CLR RI
CLR P1.5
LCALL DELAY_1
SETB P1.5
SETB ES
RET
GREEN: CJNE A,#1BH,ENT0 ;如果收到1BH,即"←",绿灯亮
CLR RI
CLR P1.6
LCALL DELAY_1
SETB P1.6
SETB ES
RET
ENT0: SETB ES ;允许串行中断
RETI ;中断返回
DELAY_1:
MOV R0, #0FFH
LOOP2:MOV R1, #0FFH
LOOP1:NOP
NOP
DJNZ R1, LOOP1
DJNZ R0, LOOP2
RET
END
ORG 0000H
LJMP START
ORG 0023H
START: MOV SP,#30H
MOV TMOD, #21H ; 定时计数器0工作于方式1,1工作于方式2
MOV TH1, #0FDH ; 波特率9600
MOV TL1, #0FDH
MOV SCON, #50H ; 置串口为方式1,允许接收
SETB TR1
SETB EA ; 开中断
SETB ES ; 允许串口中断
LOOP: LCALL SIN ; 返回初始状态( $QQT:0000 <CR> <LF> )
LCALL DELAY_1
AJMP LOOP
SIN: MOV A,SBUF
JNB RI,$
CLR RI
CJNE A,#18H,GR ;如果收到18H,即"↑",蜂鸣器响
JNB RI,$
CLR RI
CLR P1.4
LCALL DELAY_1
SETB P1.4
RET
GR: CJNE A,#19H,RED ;如果收到19H,即"↓",红、绿灯一起亮
JNB RI,$
CLR RI
CLR P1.6
CLR P1.5
LCALL DELAY_1
SETB P1.6
SETB P1.5
SETB ES
RET
RED: CJNE A,#1AH,GREEN ;如果收到1AH,即"→",红灯亮
JNB RI,$
CLR RI
CLR P1.5
LCALL DELAY_1
SETB P1.5
SETB ES
RET
GREEN: CJNE A,#1BH,ENT0 ;如果收到1BH,即"←",绿灯亮
CLR RI
CLR P1.6
LCALL DELAY_1
SETB P1.6
SETB ES
RET
ENT0: SETB ES ;允许串行中断
RETI ;中断返回
DELAY_1:
MOV R0, #0FFH
LOOP2:MOV R1, #0FFH
LOOP1:NOP
NOP
DJNZ R1, LOOP1
DJNZ R0, LOOP2
RET
END
发表时间:2007年4月9日19:03:22