C8051F020 UART0自发自收数据 c语言
时间: 2023-09-01 21:11:39 浏览: 116
C8051f020 UART0
5星 · 资源好评率100%
以下是C8051F020的UART0自发自收数据的C语言代码示例:
```c
#include <C8051F020.h>
#define SYSCLK 22118400 // 系统时钟频率,单位为Hz
#define BAUDRATE 9600 // 波特率
#define SCALE_FACTOR 256 // 定时器预分频因子
unsigned char buffer[64]; // 缓冲区
unsigned char buf_head = 0; // 缓冲区头指针
unsigned char buf_tail = 0; // 缓冲区尾指针
void UART0_ISR() interrupt 4 // UART0中断服务程序
{
if (RI0 == 1) // 接收到了数据
{
buffer[buf_tail] = SBUF0; // 将接收到的数据存入缓冲区
buf_tail = (buf_tail + 1) % 64; // 更新缓冲区尾指针
RI0 = 0; // 清除接收中断标志位
}
if (TI0 == 1) // 发送完了数据
{
TI0 = 0; // 清除发送中断标志位
}
}
void UART0_init()
{
SCON0 = 0x50; // 8位数据,无校验,1位停止位
TMOD &= ~0xf0; // 清除定时器1模式位
TMOD |= 0x20; // 定时器1工作在模式2
TH1 = -(SYSCLK / (SCALE_FACTOR * BAUDRATE)); // 计算定时器重载值
TL1 = TH1; // 初值等于重载值
TR1 = 1; // 启动定时器1
ET0 = 0; // 关闭定时器0中断
ES0 = 1; // 允许UART0中断
EA = 1; // 打开总中断开关
}
void main()
{
UART0_init(); // 初始化UART0
while (1)
{
while (buf_head != buf_tail) // 当缓冲区不为空时
{
SBUF0 = buffer[buf_head]; // 发送缓冲区中的数据
buf_head = (buf_head + 1) % 64; // 更新缓冲区头指针
while (TI0 == 0); // 等待发送完成
}
}
}
```
该代码中,首先定义了系统时钟频率、波特率和定时器预分频因子等常量,然后定义了一个长度为64的缓冲区和两个指针,分别指向缓冲区的头和尾。接着编写了一个UART0中断服务程序,用于处理接收和发送数据。在主函数中,首先调用了初始化UART0的函数,然后进入一个死循环,不断检查缓冲区是否为空。如果缓冲区不为空,则将缓冲区中的数据发送出去,并等待发送完成。如果缓冲区为空,则继续等待。
阅读全文