51单片机汇编程序???????

如何通过串口向51单片机某一片类存储空间写入一段数据?????用串口调试软件写入啊????数据格式是16进制的!!!急急急
要汇编程序啊???

第1个回答  2008-10-25
楼上的程序采用查询方式,简单、直接,应该可以用,不过这个程序有一定的弊端。
主要是主程序一直在等待数据的接收,不能做其他工作,这样的程序在说明原理时还可以,但在实际使用中意义不大。查询发送倒影响不是很大,但查询接收处理会长时间占用CPU,基本很少使用。

故建议采用串口中断,在中断子程序中完成接收。这样主程序可以做主要任务。
代码如下:(在楼上的基础上做了修改)

ORG 0000H
LJMP MAIN
ORG 0023H
LJMP RECE
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0FDH
MOV TL1,#0FDH ; 波特率9600
MOV SCON,#50H ; 设定串行口工作方式
ANL PCON,#0EFH ; 波特率不倍增
SETB TR1 ; 启动定时器1
MOV IE,#90H ; 打开串口中断
MOV R0,#** 储存区起始地址

start:
SJMP start;此处可替换为自己的主程序代码

RECE:
CLA EA ; 关闭总中断
CLR RI
MOV A,SBUF ; 暂存接收到的数据
MOV @R0,A ;
INC R0
SETB EA;开启总中断
RETI

END
这个程序中没有添加协议,可能造成的后果是接收数据过多,会溢出51的128字节的存储空间(52为256字节)。
若要在实际中使用,建议添加协议,比如每次固定传送多少字节数据;
或如不固定字节数,采用与上位机软件一致的协议--每次先传送起始触发数据(如55h 66h 77h)后,才认定以后数据为有效数据(否则为干扰),接收第一个数据为数据包字节数n,然后再开始接收n字节数据,存入内部RAM。
不过这样程序会复杂的多。如果有这样的需求,请再说明交流。本回答被提问者采纳
第2个回答  2008-10-20
ORG 0000H
LJMP MAIN
MAIN:
MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0FDH
MOV TL1,#0FDH ; 波特率9600

MOV SCON,#50H ; 设定串行口工作方式
ANL PCON,#0EFH ; 波特率不倍增

SETB TR1 ; 启动定时器1
MOV IE,#0 ; 禁止任何中断

MOV R0,#** 储存区起始地址
MOV R2,#** 数据个数
MAIN_RX:
JNB RI,$ ; 是否有数据到来
CLR RI
MOV A,SBUF ; 暂存接收到的数据
MOV @R0,A ; 数据传送到P0口
INC R0
DJNZ R2,MAIN_RX
JMP MAIN

END

望采纳
第3个回答  2019-07-12
首先,你这样的写法是不对的,
ORG
001BH
AJMP
sign0
这两句应该放到LJMP
main后面,以免中间的字节占用到001B,那样就会出乱的。
第二、你的定时器0是用做中断吗?没看见你的中断入口。
第三、你的中断处理程序这样写是大忌:LJMP
$
;虚拟主程序,等待中断
中断处理程序不
跳出去
,除非是中断优先级更高的中断才能进来,而且这样做程序的流程更混乱
第四、你的p1.0
取反
在两个地方都写了,最好只在一秒处理里面写。