写一段51单片机,波特率9600,串口1,不定长度接收的程序
时间: 2023-08-28 13:09:52 浏览: 135
以下是一个简单的51单片机串口1接收程序,它可以接收不定长度的数据,并将数据通过串口发送回去:
```c
#include <reg52.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1 (65536UL - (FOSC / 4 / BAUD))
void uart_init() {
SCON = 0x50; // 设置串口为模式1,允许接收
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = TIMER_1 / 256; // 设置定时器1高8位计数初值
TL1 = TIMER_1 % 256; // 设置定时器1低8位计数初值
TR1 = 1; // 开启定时器1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void uart_send(char c) {
SBUF = c; // 将字符写入串口发送缓冲区
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void uart_receive() interrupt 4 {
static char buffer[255];
static unsigned char count = 0;
char c = SBUF; // 读取串口接收缓冲区的字符
if (c == '\r' || c == '\n') { // 如果接收到的是回车或换行符
buffer[count] = '\0'; // 将缓冲区最后一个字符置为'\0',表示字符串结束
for (int i = 0; i < count; i++) {
uart_send(buffer[i]); // 将缓冲区中的字符通过串口发送回去
}
uart_send('\r'); // 发送回车符
uart_send('\n'); // 发送换行符
count = 0; // 重置计数器
} else {
buffer[count++] = c; // 将接收到的字符存入缓冲区
}
}
void main() {
uart_init(); // 初始化串口
while(1); // 程序循环等待串口中断
}
```
在上面的程序中,我们首先定义了常量`FOSC`和`BAUD`来分别表示单片机的晶振频率和波特率。然后,在`uart_init()`函数中,我们设置了串口模式1(8位数据,无校验位,1位停止位),并将定时器1设置为模式2(8位自动重装载计数器),以实现9600波特率的串口通信。在`uart_send()`函数中,我们将要发送的字符写入串口发送缓冲区,并等待发送完成。在`uart_receive()`中断服务程序中,我们定义了一个静态字符数组`buffer`和一个静态计数器`count`来保存接收到的数据。如果接收到的字符是回车或换行符,则说明当前一行数据已经接收完成,我们将`buffer`数组中的字符通过串口发送回去,并在最后加上回车符和换行符。如果接收到的不是回车或换行符,则说明当前数据还未接收完成,我们将接收到的字符存入`buffer`数组中,并递增计数器`count`。在`main()`函数中,我们初始化串口并进入一个无限循环等待串口中断。
阅读全文