串口只有在参数一致的情况下才能正常通信,主要的参数有波特率、停止位、校验位,可选的波特率有1200、2400、4800、9600、19 200、38 400、115 200等,停止位可选1位或2位,校验位可选无校验(n)、偶校验(e)和奇校验(o)。例如,常见的串口通信参数可表示为:9600,n,8,1,其中9600代表波特率9600bps,n代表无校验,8代表8个数据位,1代表1个停止位。
图1-1是不同波特率串口时序对比图,输出同样字符“12”的时序波形一致,区别就是每个数据位的间隔不同,9600bps每个数据位间隔约0.104ms,8个数据位加上前面1个起始位和后面1个停止位,总周期约1ms,也就是说,当波特率为9600时,每发送1个字节约需1ms;同理,当波特率为1200时,每发送1个字节约需8.3ms。
图1-1 不同波特率串口时序对比图
当使用校验位时,每个字节会含11个数据位,不同校验设置时的串口输出波形对比见图1-2。测试时发出的数据字符是“12”,十六进制数据为0x31、0x32,先发送1位起始位0,然后是8位数字位,低位在前,有校验时再发送1位校验位,校验位是根据前面8位数据位算出来的,最后发送停止位1。
图1-2 不同校验设置时的串口输出波形对比图
1.串口可在不同引脚间切换
此功能限于引脚数为16及以上的单片机。图1-3是单片机STC15W201S不同封装引脚示意图,SOP16封装的单片机STC15W201S 根据寄存器的设定,串口可以在[P3.0/RxD,P3.1/TxD]和[P3.6/RxD_2,P3.7/TxD_2]间切换,这样的设计优点有两个:一是[P3.0/RxD,P3.1/TxD]只作为编程口,程序运行时切换到[P3.6/RxD_2,P3.7/TxD_2],这样编程和运行互不影响;二是可以分时切换,当两个串口用,提高了单片机引脚利用效率和灵活性。SOP8封装的单片机串口引脚[P3.0/RxD,P3.1/TxD]就只能既用来编程又用来运行了,此时从电路上就要考虑外部接线是否会影响编程,如影响编程可以考虑加跳线帽或拨码开关实现切换。
图1-3 单片机STC15W201S不同封装引脚示意图
2.串口1可设置为中继广播方式
串口1的RxD端收到数据能同步输出到TxD端,这种功能可以用于一对多通信;但是由于主机只能发送数据,所以这个功能不常用。
3.STC15W4K系列单片机有4个串口
单片机外围模块大多都是通过串口与单片机进行通信的。当某个项目需要多个串口时,普通单片机只能通过扩展电路的方式来增加串口,如CH432系列单片机就是利用SPI接口实现串口扩展的。而STC15W4K系列单片机本身支持4个串口,与扩展串口相比,在满足单片机与多外围模块之间通信要求的同时,也简化了程序代码。
4.奇偶校验位不能自动添加
这是STC15W系列单片机的一个缺点。一般单片机使能奇偶校验后,校验位是自动生成、自动添加的。STC15W系列单片机的奇偶校验位能自动生成到寄存器PSW,发送数据时需要编程添加到SCON寄存器,具体使用方法见以后的代码。实际使用中尽量避免使用奇偶校验,一般多在通信协议中设置校验字节来保证数据的正确性。
STC单片机的程序下载软件的附加功能非常实用,有定时器、波特率计算功能,还有封装引脚位和范例程序等功能,方便使用。图1-4就是计算串口波特率的界面截图,选好参数后,单击“生成C代码”按钮即可自动生成串口初始化代码。
图1-4 计算串口波特率的界面截图
使用串口通信时,单片机的系统频率最好使用11.0592MHz或其整数倍值,如22.1184MHz,此时波特率最为准确,误差理论上为零。当选为12MHz时误差为0.16%,感觉上不是很好,实际上也不影响通信准确性,一般认为误差在4.5%以内是允许的。
STC15W系列单片机的串口波特率发生器一般都占用定时器2;对于STC15W4K系列4串口单片机,4个串口可以都使用定时器2,但此时波特率必须一致,如果波特率不一致就必须使用不同的定时器,串口1可以用定时器1,串口3可以用定时器3,串口4可以用定时器4。
定时器初值计算公式如下:
当系统频率MAIN_Fosc=11 059 200Hz,波特率Baudrate1=9600时,T2H=0xFE,T2L=0xE0。