写出一个单片机汇编程序,利用单片机串行口,实现本机串行接口的自通讯;连接起本机的TXD和RXD,将本机数据通过异步方式的TXD引脚发送,再从本机的RXD引脚接收。单片机从P2口读入的按键数值并向TXD引脚发送,之后从RXD引脚接收数据,并通过P1口显示在LED发光二极管上。
时间: 2023-10-07 08:09:46 浏览: 79
下面是一份8051单片机的汇编程序,实现了串口自通讯功能,同时实现了从P2口读入按键数值,并向TXD引脚发送数据,再从RXD引脚接收数据并通过P1口显示在LED发光二极管上:
```
ORG 0H
MOV P1, #0H ; 初始化P1口为0
MOV SCON, #50H ; SCON寄存器设置,SM0=0、SM1=1,即异步方式,波特率为9600
MOV TMOD, #20H ; TMOD寄存器设置,GATE=0,CT=0,T1M=2,即T1定时器工作模式为8位自动重载
SETB TR1 ; 启动T1定时器
SETB EA ; 开启全局中断
SETB ES ; 开启串口中断
SJMP MAIN ; 跳转到主程序
UART_ISR:
JNB RI, RX_ISR ; 判断RI是否被触发,如果没有,跳转到TX_ISR
CLR RI ; 清除RI中断标志位
MOV A, SBUF ; 将SBUF中的数据读入寄存器A
MOV P1, A ; 将A中的数据写入P1口
SJMP UART_ISR ; 跳转到UART_ISR
RX_ISR:
CLR RI ; 清除RI中断标志位
MOV A, SBUF ; 将SBUF中的数据读入寄存器A
MOV P1, A ; 将A中的数据写入P1口
SETB TI ; 设置TI中断标志位,启动TX_ISR
RETI
TX_ISR:
CLR TI ; 清除TI中断标志位
MOV A, P2 ; 将P2中的数据读入寄存器A
MOV SBUF, A ; 将A中的数据写入SBUF
RETI
MAIN:
CJNE P2, #0FFH, MAIN ; 判断P2口的数值是否为0xFF,如果是,跳转到MAIN
CPL P1 ; 取反P1口的数值
SJMP MAIN ; 跳转到MAIN
```
该程序的主要思路是:设置串口通讯波特率为9600,使用T1定时器产生波特率时钟,开启串口和全局中断。在程序主循环中,通过判断P2口的数值是否为0xFF来进行LED的闪烁,同时将P2口的数值通过串口发送出去。当串口接收到数据后,触发RI中断,将接收到的数据通过P1口显示在LED上,同时启动TX_ISR将P2口的数据发送出去。当TX_ISR将数据发送完后,触发TI中断,程序返回到主循环中。
阅读全文