求单片机高手编写一个串口通信接受字符程序,用汇编语言. 急急急!!!!

求单片机高手编写一个串口通信接受字符程序,用汇编语言. 急急急!!!!,第1张

ORG 烂孝樱 00H

AJMP  MAIN

ORG  23H

AJMP  URT        串口中断

ORG  30H

MAIN:

MOV  SP,#60H

MOV  R0,#50H

MOV  TMOD,#20H   T1工作方式2

SETB  EA       慎谈  开总中断

ACALL  URTINIT    串口初始化

AJMP  $    等待串口中断

URT:       饥丛      串口中断每次只收1 个字节,未完继续进入中断,接收。

PUSH  ACC

JNB  RI,URT1

URT0:

CLR  ES

CLR  RI

MOV  A,SBUF

MOV  @R0,A      先保存

INC  R0

CJNE R0,#60H,URT1

CLR  EA

URT1:

SETB  ES

POP  ACC

RTI:  RETI

URTINIT:

MOV  SCON,#50H   串口工作方式1,接收

MOV  TH1,#0F4H   11.0592M 2400BPS

MOV  TL1,TH1

SETB  TR1         开启定时器

SETB  ES          开启串口中断

RET

END

ORG 0000H

SJMP 0050H

ORG 0023H

LJMP S_INT

TAB:DB 20H,49H,20H,47H,45H,54H,20H,'NULL'

ORG 0050H

MOV TMOD,#20H

MOV TH1,#0FDH

MOV TL1,#0FDH

SETB TR1

SETB SM1

CLR SM0

SETB EA

SETB ES

MOV R0,#30H

MOV A,#1H

MAIN:SETB REN

ACALL DELAY

JNZ MAIN

MOV R2,#0

MOV DPTR,#TAB

MOV R7,#7

SEND:MOV A,R2

MOVC A,@A+DPTR

CLR ES

MOV SBUF,A

JNB TI,$

CLR TI

INC R2

DJNZ R7,SEND

MOV R0,#30H

SHOW:MOV A,@R0

MOV SBUF,A

JNB TI,$

CLR TI

INC R0

CJNE A,#40H,SHOW

SETB ES

MOV A,#1

MOV R0,#30H

SJMP MAIN

S_INT:CLR RI

MOV A,SBUF

MOV @R0,A

CJNE A,#40H,NEXT

MOV A,#0

NEXT:INC R0

RETI

DELAY:MOV 7DH,#200

LOOP1:MOV 7EH,#40

DJNZ 7EH,$

DJNZ 7DH,LOOP1

RET

END

这个是方式一的

HERE: AJMP HERE

SINT: MOV P1,R0

JB RI,RECV

JB TI,SEND

AJMP HERE

中断里面直接用这种方式直接跳到主程序,我以前还是真没试过,不过估计能行吧。 我一直用RETI 返回堆栈地址位置的。

但下面这地方肯定有错旁铅闭的,就是执行MOV SBUF,A 后没有等待!!

正确的顺序是: CLR TI 清发送标记

MOV SBUF,A 发送

JNB TI,$ 这里是如果TI没有被置1就等待,因为送数可能还没有完成。。就去执行别的动作,可能会有问题。

接收也一样要等待:

MOV A,SBUF

JNB RI,$ 等待接收完成激吵标志。

另外:

CPL P1.7 有问题,我猜你是用P1.7来观察接收次数,

但由于CPL P1.7取反命令是读一下P1.7再取反输出的,如果你的p1.7外接电路不科学,不合理,可能会出现你每次不管发1,还是发0,p1.7都是低电平,比如你将p1.7直接接在npn三管基极就会一直是0V或0.7V , P1.7的读入值会总为0,CPL 输出会总是为1

你可以运裂用内部(非P口的位地址过度一下),比如: CPL 01H

MOV C,01H

MOV P1.7,C

你先试验吧。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12327460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存