设甲、乙两台单片机的fosc=11.0592MHz,以9600的波特率在方式1下实现如下的串行通信,用汇编语言编写程序实现此功能。 在实验中实现甲机发送功能:将字符串“Welcom to the MCU world!”向乙机发送。编程实现甲机发送的程序,综合利用Proteus仿真软件、串口调试和虚拟串口管理器手进行仿真实现。
时间: 2024-03-09 19:46:50 浏览: 84
以下是一份8051单片机的汇编代码,可以实现甲机发送字符串“Welcom to the MCU world!”到乙机:
```
; 甲机串口通信发送程序
; 定义常量
BAUD_RATE EQU 9600 ; 波特率为9600
DATA_BITS EQU 8 ; 数据位为8
STOP_BITS EQU 1 ; 停止位为1
; 定义端口
SBUF EQU 99H ; 串口缓冲区寄存器
SCON EQU 98H ; 串口控制寄存器
; 定义字符串
MESSAGE DB "Welcom to the MCU world!", 0 ; 字符串以0结尾
ORG 0H ; 程序从0地址开始
MAIN:
; 初始化串口
MOV TMOD, #20H ; 定时器1工作在模式2
MOV TH1, #-3 ; 定时器1计数初值
MOV SCON, #50H ; 串口工作在模式1,允许接收
; 设置波特率
MOV PCON, #80H ; PCON.7=1,SMOD=1
MOV SBUF, #BAUD_RATE_DIV ; 将波特率分频值写入串口缓冲区
CLR RI ; 清除接收标志位
SETB TI ; 启动发送
; 发送字符串
MOV DPTR, #MESSAGE ; 将字符串的地址存储在DPTR中
SEND_LOOP:
MOV A, @DPTR ; 将DPTR指向的字符读入A
INC DPTR ; DPTR指向下一个字符
CJNE A, #0, SEND_CHAR ; 如果不是结尾符,则发送字符
SJMP $ ; 结束发送
SEND_CHAR:
CLR RI ; 清除接收标志位
MOV SBUF, A ; 发送字符
SEND_DELAY:
JNB TI, SEND_DELAY ; 等待发送完成
SETB TI ; 启动下一次发送
SJMP SEND_LOOP ; 继续发送下一个字符
; 计算波特率分频值
BAUD_RATE_DIV EQU -(FOSC/BAUD_RATE/16)
END
```
该代码使用了定时器1和串口中断来实现串口通信发送功能。在初始化时,将定时器1工作在模式2,使其计数器自动重载,以产生波特率时钟。同时,将串口控制寄存器设置为模式1,允许发送和接收数据。
在发送字符串时,将字符串的地址存储在DPTR中,然后逐个发送每个字符。发送时,先将字符写入串口缓冲区,然后等待发送完成,再启动下一次发送。在发送完成后,程序将跳转到结束。
在Proteus中,可以使用串口调试工具来模拟乙机,接收甲机发送的数据。同时,也可以使用虚拟串口管理器来模拟甲机和乙机之间的串口连接,方便调试和测试。
阅读全文