串口
原理图
工作方式 1
配置串口:
- 工作方式 1,8 位 UART,波特率可变;
- 使用独立波特率作为串口的波特率发生器;
- 允许串口发送或接收数据完成之后请求中断;
- 直接将串口接收到的数据发送出去。
main.c 文件:
#include <reg51.h>
#ifndef SYSTEM_CLOCK
#define SYSTEM_CLOCK (1000000 * 12) // 12MHz
#endif
/** Bits definition of PCON */
#define PCON_SMOD 0x80
#define PCON_SMOD0 0x40
sfr AUXR = 0x8E;
/** Bits definition of AUXR */
#define AUXR_BRTR 0x10
#define AUXR_BRTx12 0x04
#define AUXR_S1BRS 0x01
sfr BRT = 0x9C;
sfr AUXR1 = 0xA2;
/** Bits definition of AUXR1 */
#define AUXR1_UART_P1 0x80
#define UART1_BAUD_RATE 9600
void main() {
PCON &= ~PCON_SMOD; // 串口波特率不加倍
PCON &= ~PCON_SMOD0; // 禁用帧错误检测
// 串口工作方式 1:8 位 UART,波特率可变
SM0 = 0;
SM1 = 1;
REN = 1; // 允许串口接收器
// 清除串口的发送、接收中断请求标志
TI = 0;
RI = 0;
// 设置串口波特率
if((PCON & PCON_SMOD) == PCON_SMOD) {
BRT = 256 - (SYSTEM_CLOCK / 16 / 9600);
} else {
BRT = 256 - (SYSTEM_CLOCK / 32 / 9600);
}
AUXR |= AUXR_S1BRS; // 使用独立波特率发生器
AUXR |= AUXR_BRTx12; // 独立波特率发生器在每个时钟计数一次
AUXR |= AUXR_BRTR; // 允许独立波特率发生器运行
// AUXR1 |= AUXR1_UART_P1; // 将串口从 P3 切换到 P1
ES = 1; // 允许串口请求中断
EA = 1; // 使能全局中断
while(1) {}
}
/**
* 串口中断服务
*/
void uartInterruptService() interrupt 4 {
unsigned char buffer = 0x00;
// 如果接收数据完成,清除接收中断请求标志,然后通过串口将数据发送出去
if (RI) {
RI = 0;
buffer = SBUF;
SBUF = buffer;
}
// 如果发送数据完成,清除发送中断请求标志
if (TI) {
TI = 0;
}
}
将编译好的 HEX 文件下载到单片机中,打开串口助手发送数据,可以看到单片机将数据回传: