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触发了中断,而我真正给它发数据请求中断时它又不理,怎么回事啊??
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
仔细看看书上的例程,好好想清楚再动手。
另外,把这两个自相矛盾的判断无视掉之后,
后面的发送过程,是无限发送下去的... 汗个。