单片机实验 串口通信中,实现发送数据功能的方式有几种?请分别列举说明。
时间: 2024-03-08 15:51:12 浏览: 75
单片机的串口发送
在单片机实验中,实现串口通信中发送数据的方式可以分为以下两种:
1. 轮询方式发送
轮询方式发送是指在程序中不断地查询串口发送缓冲区的状态,当缓冲区为空时,将数据发送到串口。该方式实现简单,但是效率较低,容易造成CPU占用过高。
示例代码:
```
#include <reg52.h>
void send_data(unsigned char dat)
{
while(!TI); // 查询发送缓冲区是否为空
TI = 0; // 发送数据
SBUF = dat;
}
void main()
{
TMOD = 0x20; // 定时器1工作在方式2,自动重载
TH1 = 0xFD; // 波特率9600,定时器初值
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1,8位数据位,1位停止位,可变波特率
while(1)
{
send_data('A'); // 发送数据
}
}
```
2. 中断方式发送
中断方式发送是指通过串口中断来实现数据发送,当数据发送完成时触发串口中断,通过中断服务程序将数据发送到串口。该方式效率较高,且不会占用过多CPU资源。
示例代码:
```
#include <reg52.h>
void send_data(unsigned char dat)
{
ES = 0; // 关闭串口中断,防止中断服务程序与主程序冲突
SBUF = dat;
while(!TI); // 等待数据发送完成
TI = 0;
ES = 1; // 打开串口中断
}
void main()
{
TMOD = 0x20; // 定时器1工作在方式2,自动重载
TH1 = 0xFD; // 波特率9600,定时器初值
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1,8位数据位,1位停止位,可变波特率
EA = 1; // 打开总中断
ES = 1; // 打开串口中断
while(1)
{
send_data('A'); // 发送数据
delay(1000); // 延时1秒
}
}
// 串口中断服务程序
void serial_isr() interrupt 4
{
if(TI) // 发送完成中断
{
TI = 0;
}
}
```
以上两种方式都可以实现串口通信中发送数据的功能,具体选择哪种方式取决于实际需求和开发者的编程习惯。
阅读全文