STC15串口通信代码
时间: 2023-11-12 08:58:16 浏览: 59
以下是STC15单片机的串口通信代码:
```c
#include <reg51.h>
#define FOSC 11059200L
#define BAUD 9600
unsigned char RxdBuf[4]; // 定义接收缓冲区
unsigned char idata RxdCnt; // 定义接收字节数计数器
bit RxdFlag; // 定义接收完成标志位
void InitUART(); // 串口初始化函数
void SendData(unsigned char dat); // 串口发送函数
void SendString(unsigned char *s); // 串口发送字符串函数
void delay(unsigned int i); // 延时函数
void main()
{
unsigned char i;
InitUART(); // 初始化串口
while (1)
{
if (RxdFlag) // 如果接收完成
{
RxdFlag = 0; // 清除接收完成标志位
for (i = 0; i < RxdCnt; i++) // 循环发送接收到的数据
{
SendData(RxdBuf[i]);
}
SendString("\r\n"); // 发送回车换行
RxdCnt = 0; // 清除接收字节数计数器
}
}
}
void InitUART()
{
TMOD &= 0xF0; // 设置定时器1为模式1
TMOD |= 0x20;
TH1 = TL1 = -(FOSC / 12 / 32 / BAUD); // 设置波特率为9600
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1
SM1 = 1;
REN = 1; // 允许串口接收
ES = 1; // 允许串口中断
EA = 1; // 开启总中断
}
void SendData(unsigned char dat)
{
SBUF = dat; // 将数据写入发送缓冲区
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void SendString(unsigned char *s)
{
while (*s) // 循环发送字符串
{
SendData(*s++);
}
}
void delay(unsigned int i)
{
unsigned int j;
for (j = 0; j < i; j++);
}
void UART_Isr() interrupt 4 using 1
{
if (RI) // 如果接收中断
{
RI = 0; // 清除接收中断标志位
RxdBuf[RxdCnt++] = SBUF; // 读取接收缓冲区中的数据
if (RxdCnt == 4) // 如果接收字节数达到4个
{
RxdFlag = 1; // 设置接收完成标志位
}
}
}
```
该代码实现了单片机与PC之间的串口通信,每当单片机接收到4个字节的数据后,会将接收到的数据原样发送回PC,并在每次发送后加上回车换行。需要注意的是,该代码使用的波特率为9600,如果需要修改波特率,只需要修改TH1和TL1的值即可。