c语言写一个stc8g单片机串口中断接收程序
时间: 2023-12-11 09:02:15 浏览: 228
好的,下面是一个简单的STC8G单片机串口中断接收程序的C语言代码:
```c
#include <STC8.H>
// 定义接收缓冲区
#define BUFFER_SIZE 16
unsigned char receive_buffer[BUFFER_SIZE];
// 定义接收指针和计数器
unsigned char receive_index = 0;
unsigned char receive_count = 0;
// 串口中断服务函数
// 注意:此函数必须命名为“串口中断服务函数”,不能更改名称
void UART_ISR() interrupt 4
{
if (RI)
{
// 有数据接收
RI = 0;
// 将接收到的数据存入缓冲区
receive_buffer[receive_index] = SBUF;
receive_index++;
receive_count++;
// 缓冲区已满,重新开始接收
if (receive_index >= BUFFER_SIZE)
{
receive_index = 0;
}
}
}
void main()
{
// 初始化串口
PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
// 开启串口接收中断
EA = 1;
ES = 1;
// 主循环
while (1)
{
// 如果有数据接收,打印出来
if (receive_count > 0)
{
unsigned char data = receive_buffer[(receive_index - receive_count + BUFFER_SIZE) % BUFFER_SIZE];
receive_count--;
printf("%c", data);
}
}
}
```
该程序使用了一个循环缓冲区来存储接收到的数据,当串口接收到数据时,将数据存入缓冲区,当缓冲区满时,重新从缓冲区开头开始存储数据。主循环中检查缓冲区是否有数据,如果有,则将数据打印出来。
需要注意的是,此程序使用了printf函数来打印数据,因此需要在编译时启用printf函数的支持。如果使用的是Keil C51编译器,可以在编译选项中勾选“Use MicroLIB”和“Use printf()”选项来启用printf函数支持。
阅读全文