51单片机与PC机串行通信
要实现的功能如下:单片机给PC机发送字符55H,在PC机上看到后,用串口调试助手发送AAH给单片机,单片机接收到之后,再给PC机发送字符“K”。我调试了两天,但怎么都调试...
要实现的功能如下:单片机给PC机发送字符55H,在PC机上看到后,用串口调试助手发送AAH给单片机,单片机接收到之后,再给PC机发送字符“K”。
我调试了两天,但怎么都调试不出来,波特率用9600,我编的程序如下,这个程序的调试结果不对。给大家参考下,大家帮帮我。。能帮我调试出来的分肯定给上了。
ORG 0000H
AJMP START
ORG 0023H
LJMP SERIALS
ORG 0030H
START:MOV SP,#5FH
MOV TMOD,#20H
MOV PCON,#80H
MOV TH1,#0FAH
MOV SCON,#50H
SETB TR1
SETB ES
SETB EA
ajmp $
SERIALS:
MOV A,#55H ;给PC机发送字符55H
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,SBUF ; 等待PC机发送字符AAH,接到AA后,给PC机发送字符K
CJNE A,#0AAH,$
MOV A,#'K'
MOV SBUF,A
CLR RI
reti
END
回happycxz:
1,为什么要加上关总中断?
2,CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了 这我也不明白,为什么会死掉?要换的话换成什么?看我改过的程序,换成那样行不?
3,MOV A,#'K' 这句话没问题的,就是把K的ASCII码发到A上
我按照你的意思,把程序改了下。不过调试的时候还是不行,麻烦你再看看
SERIALS:
CLR EA
MOV A,#55H
MOV SBUF,A
JNB TI,$
CLR TI
D1:JNB RI,$
MOV A,SBUF
CLR RI
CJNE A,#OAAH,D1
MOV A,#'K'
MOV SBUF,A
JNB TI,$
CLR TI
CLR RI
RETI
END
哈哈,我终于调出来了,原来是整个程序没能触发串口中断,在START里加个SETB TI,然后就可以了,谢谢happycxz的帮助! 展开
我调试了两天,但怎么都调试不出来,波特率用9600,我编的程序如下,这个程序的调试结果不对。给大家参考下,大家帮帮我。。能帮我调试出来的分肯定给上了。
ORG 0000H
AJMP START
ORG 0023H
LJMP SERIALS
ORG 0030H
START:MOV SP,#5FH
MOV TMOD,#20H
MOV PCON,#80H
MOV TH1,#0FAH
MOV SCON,#50H
SETB TR1
SETB ES
SETB EA
ajmp $
SERIALS:
MOV A,#55H ;给PC机发送字符55H
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,SBUF ; 等待PC机发送字符AAH,接到AA后,给PC机发送字符K
CJNE A,#0AAH,$
MOV A,#'K'
MOV SBUF,A
CLR RI
reti
END
回happycxz:
1,为什么要加上关总中断?
2,CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了 这我也不明白,为什么会死掉?要换的话换成什么?看我改过的程序,换成那样行不?
3,MOV A,#'K' 这句话没问题的,就是把K的ASCII码发到A上
我按照你的意思,把程序改了下。不过调试的时候还是不行,麻烦你再看看
SERIALS:
CLR EA
MOV A,#55H
MOV SBUF,A
JNB TI,$
CLR TI
D1:JNB RI,$
MOV A,SBUF
CLR RI
CJNE A,#OAAH,D1
MOV A,#'K'
MOV SBUF,A
JNB TI,$
CLR TI
CLR RI
RETI
END
哈哈,我终于调出来了,原来是整个程序没能触发串口中断,在START里加个SETB TI,然后就可以了,谢谢happycxz的帮助! 展开
展开全部
SERIALS:
; 加上关总中断
MOV A,#55H ;给PC机发送字符55H
MOV SBUF,A
JNB TI,$
CLR TI
; 这里加上,等待RI=1的语句
MOV A,SBUF ; 等待PC机发送字符AAH,接到AA后,给PC机发送字符K
CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了
MOV A,#'K' ; 汇编中表示字符是这样吗?#'K' 请查证后再写
MOV SBUF,A
;为什么不加上等待发送结束?
CLR RI
reti
END
加上的:
1,为什么要加上关总中断?
答:就怕在中断程序中又触发其它优先级更高的中断。
2,CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了 这我也不明白,为什么会死掉?要换的话换成什么?看我改过的程序,换成那样行不?
答:CJNE A,#0AAH,$ 判断A里,如果不是你要的值0aaH 那程序就一直在原处,并且,程序是不会响应串口再次发送的数据,换成你写的这样,就可以:一直到上位机发AAH,才往下执行。可以的。
3,MOV A,#'K' 这句话没问题的,就是把K的ASCII码发到A上
我按照你的意思,把程序改了下。不过调试的时候还是不行,麻烦你再看看
另外,我多嘴一句,你这个程序很容易就死在中断程序里,汇编我不常用,看看是可以。
做双方通信,你要确定以下内容:
1、电路是否正常工作
2、波特率、起始位、停止位是否一致
3、用上位机小软件时,是否选择是字符发送接收还是十六进制数发送接收。
串口中断程序中,不要加入太多程序,建议:
串口中断程序中,写,判断是接收中断还是发送中断,是发送中断,执行空语句,是接收中断,接收到什么置相应标志位,然后主程序中判断标志位,作相应的处理,可以理解吗?
; 加上关总中断
MOV A,#55H ;给PC机发送字符55H
MOV SBUF,A
JNB TI,$
CLR TI
; 这里加上,等待RI=1的语句
MOV A,SBUF ; 等待PC机发送字符AAH,接到AA后,给PC机发送字符K
CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了
MOV A,#'K' ; 汇编中表示字符是这样吗?#'K' 请查证后再写
MOV SBUF,A
;为什么不加上等待发送结束?
CLR RI
reti
END
加上的:
1,为什么要加上关总中断?
答:就怕在中断程序中又触发其它优先级更高的中断。
2,CJNE A,#0AAH,$ ;这一句要换掉,不然,你接收的不是0aaH,你就死在这了 这我也不明白,为什么会死掉?要换的话换成什么?看我改过的程序,换成那样行不?
答:CJNE A,#0AAH,$ 判断A里,如果不是你要的值0aaH 那程序就一直在原处,并且,程序是不会响应串口再次发送的数据,换成你写的这样,就可以:一直到上位机发AAH,才往下执行。可以的。
3,MOV A,#'K' 这句话没问题的,就是把K的ASCII码发到A上
我按照你的意思,把程序改了下。不过调试的时候还是不行,麻烦你再看看
另外,我多嘴一句,你这个程序很容易就死在中断程序里,汇编我不常用,看看是可以。
做双方通信,你要确定以下内容:
1、电路是否正常工作
2、波特率、起始位、停止位是否一致
3、用上位机小软件时,是否选择是字符发送接收还是十六进制数发送接收。
串口中断程序中,不要加入太多程序,建议:
串口中断程序中,写,判断是接收中断还是发送中断,是发送中断,执行空语句,是接收中断,接收到什么置相应标志位,然后主程序中判断标志位,作相应的处理,可以理解吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询