#define MHz 1000000U // 定义 MHz
#define gCLK (22.1184*MHz) // 系统时钟频率
#define UART_BAUD 9600 // 定义所用的波特率
// 串行通讯初始化函数,在程序开始时调用
void serial_init(void)
{
SCON = 0x50; // Mode 1: 8-bit UART, 允许接收
TMOD |= 0x20; // 定时器1 Mode 2: 8-Bit reload
PCON = 0x80; // SMOD = 1
TH1 = 256 - (uchar)(gCLK/192.0F/UART_BAUD);
TR1 = 1; // 定时器 1 启动
ES = 1; // 串行中断允许
}
此为最常用的模式:方式1,8位数据位,以定时器1作波特率发生器,SMOD置1。
当然,也可以将波特率的值以参数形式传入,如:
void serial_init(unsigned long lBaud){...}
但那样的话,TH1的赋值就要通过计算来得到,效率较低。
另外,使用不同波特率时要计算一下误差,防止误码率太高。