设定波特率为9600。PC机发123去单片机,单片机再把收到的信息发送给PC机。发送改为中断方式,接收改为查询方式.提交C语言并注解
时间: 2023-06-07 11:11:35 浏览: 248
以下是提交的C语言代码,并注解:
```c
#include <reg52.h>
// 定义定时器1初值
#define BAUDRATE 9600
#define TH1_INIT ((unsigned char)(256 - (11059200UL / 12UL / 32UL / BAUDRATE)))
// 定义串口变量
volatile unsigned char rcv_buf; // 串口接收数据的缓存
volatile bit rcv_flag = 0; // 串口接收完成标志
// 定义发送和接收函数
void uart_init();
void send_data(unsigned char data);
unsigned char receive_data();
// 定义主函数
void main() {
uart_init(); // 初始化串口
while(1) {
send_data('1'); // 发送数据 '1'
while(rcv_flag == 0); // 等待接收完成
unsigned char received = receive_data(); // 获取接收的数据
rcv_flag = 0; // 清除接收标志
}
}
// 初始化串口函数
void uart_init() {
TMOD |= 0x20; // 设置定时器1为模式2,自动重装载
TH1 = TH1_INIT; // 设置波特率
SCON = 0x50; // 设置串口模式
ES = 1; // 打开串口中断
TR1 = 1; // 启动定时器1
EA = 1; // 打开总中断
}
// 发送数据函数
void send_data(unsigned char data) {
SBUF = data; // 将数据写入发送寄存器
while(TI == 0); // 等待发送完成
TI = 0; // 清除发送标志
}
// 接收数据函数
unsigned char receive_data() {
while(RI == 0); // 等待接收完成
unsigned char received = rcv_buf; // 保存接收的数据
RI = 0; // 清除接收标志
return received; // 返回接收到的数据
}
// 串口中断函数
void serial_isr() interrupt 4 {
if(RI) { // 接收中断
rcv_buf = SBUF; // 从接收寄存器获取数据
rcv_flag = 1; // 标志接收完成
}
if(TI) { // 发送中断
TI = 0; // 清除发送标志
}
}
```
此代码是一个简单的单片机和PC机之间进行串口通信的程序,实现了单片机接收并回传数据的功能。具体的说明如下:
在 `main()` 函数中,初始化串口并进入循环。循环中先通过 `send_data()` 函数将数据 `'1'` 发送给了PC机;然后通过 `while(rcv_flag == 0);` 等待串口接收完成,并通过 `receive_data()` 函数获取接收到的数据;最后通过 `rcv_flag = 0;` 清除标志,为下一次循环做准备。
初始化串口的函数是 `uart_init()`,其中首先设置了定时器1为模式2,波特率为9600;然后打开了串口中断和总中断;最后启动了定时器1。
发送数据的函数是 `send_data()`,它将参数 `data` 写入发送寄存器,然后通过 `while(TI == 0);` 等待发送完成,并清除了发送标志。
接收数据的函数是 `receive_data()`,它通过 `while(RI == 0);` 等待接收完成,并从接收寄存器中获取数据;最后返回接收到的数据,并清除了接收标志。
串口中断函数 `serial_isr()` 是当串口接收或发送中断时自动执行的,它通过判断 RI 和 TI 标志位,处理接收或发送操作并清除标志。
需要注意的是,上述代码中使用了中断方式发送数据和查询方式接收数据。在中断方式下,发送数据时必须等待发送完成,并且查询方式下,接收数据时必须等待接收完成。 这种方法有时效率不高,特别是在快速传输数据的情况下,可以考虑使用其他方法来改进。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)