随着我们对通信技术的深入学习,大家要逐渐在头脑中建立起时序这种概念。所谓“时序”从字面意义上来理解,一是“时间问题”,二是“顺序问题”。
先说“顺序问题”,这个相对简单一些。我们在学 UART 串口通信的时候,先 1 位起始位,再 8 位数据位,最后 1 位停止位,这个先后顺序不能错。我们在学 1602 液晶的时候,比如写指令,RS=L,R/W=L,D0~D7=指令码,这三者的顺序是无所谓的,但是最终的 E=高脉冲,必须是在这三条程序之后,这个顺序一旦错误,写的数据也可会出错。
“时间问题”内容相对复杂。比如 UART 通信,每一位的时间宽度是 1/baud。我们初中就学过一个概念,世界上没有绝对的准确。那么每一位的时间宽度 1/baud 要求精确到什么范围内呢?
前边教程我提到过,单片机读取 UART 的 RXD 引脚数据的时候,一位数据,单片机平均分成了 16 份,取其中的 7、8、9 三次读到的结果,这三次中有 2 次是高电平那这一位就是 1,有 2 次是低电平,那这一次就是 0。如果我们的波特率稍微有些偏差,只要累计下来到最后一位停止位,这 7、8、9 还在范围内即可。如图 13-1 所示。
图 13-1 UART 信号采集时序图
我们用三个箭头来表示 7、8、9 这三次的采集位置,大家可以注意到,当采集到 D7 的时候,已经有一次采集偏出去了,但是我们采集到的数据还是不会错,因为有 2 次采集正确。至于这个偏差允许多大,大家自己可以详细算一下。实际上 UART 通信的波特率是允许一定范围内误差存在的,但是不能过大,否则就会采集错误。大家在计算波特率的时候,发现没有整除,有小数部分的时候,就要特别小心了,因为小数部分是一概被舍掉的,于是计算误差就产生了。我们用 11.0592M 晶振计算的过程中,11059200/12/32/9600 得到的是一个整数,如果用 12M 晶振计算 12000000/12/32/9600 就会得到一个小数,大家可以算一下误差多少,是否在误差范围内。
先说“顺序问题”,这个相对简单一些。我们在学 UART 串口通信的时候,先 1 位起始位,再 8 位数据位,最后 1 位停止位,这个先后顺序不能错。我们在学 1602 液晶的时候,比如写指令,RS=L,R/W=L,D0~D7=指令码,这三者的顺序是无所谓的,但是最终的 E=高脉冲,必须是在这三条程序之后,这个顺序一旦错误,写的数据也可会出错。
“时间问题”内容相对复杂。比如 UART 通信,每一位的时间宽度是 1/baud。我们初中就学过一个概念,世界上没有绝对的准确。那么每一位的时间宽度 1/baud 要求精确到什么范围内呢?
前边教程我提到过,单片机读取 UART 的 RXD 引脚数据的时候,一位数据,单片机平均分成了 16 份,取其中的 7、8、9 三次读到的结果,这三次中有 2 次是高电平那这一位就是 1,有 2 次是低电平,那这一次就是 0。如果我们的波特率稍微有些偏差,只要累计下来到最后一位停止位,这 7、8、9 还在范围内即可。如图 13-1 所示。

图 13-1 UART 信号采集时序图
我们用三个箭头来表示 7、8、9 这三次的采集位置,大家可以注意到,当采集到 D7 的时候,已经有一次采集偏出去了,但是我们采集到的数据还是不会错,因为有 2 次采集正确。至于这个偏差允许多大,大家自己可以详细算一下。实际上 UART 通信的波特率是允许一定范围内误差存在的,但是不能过大,否则就会采集错误。大家在计算波特率的时候,发现没有整除,有小数部分的时候,就要特别小心了,因为小数部分是一概被舍掉的,于是计算误差就产生了。我们用 11.0592M 晶振计算的过程中,11059200/12/32/9600 得到的是一个整数,如果用 12M 晶振计算 12000000/12/32/9600 就会得到一个小数,大家可以算一下误差多少,是否在误差范围内。