控制/MCU
51单片机具有串行通信能力。其串行接口( UART)是一个全双工的通信接口,能方便地与其他单片机实现双机或多机串行通信。随着IBM - PC机的普及和单片机应用的迅速发展,把这两种微型机结合起来的应用日益广泛,从而使之既具有较强的实时控制功能,又有很强的数据处理能力,充分发挥了不同机种的特长。在这种应用中,双方都采用了RS - 232C标准串行通信接口,以实现双机或多机之间的通信。
在不同机种的微机通信中,众所周知的一个问题是进行通信的双方应该采用相同的传输速率,即双方都应使用同样的传输波特率,这是确保通信成功的重要条件之一。下面仅对通信中波特率的设置问题作一些论述,供大家参考。
在IBM - PC/XT系统中,配备有异步通信适配器,该板上设有INS8250异步通信接口。PC机上波特率的设置是通过对8250初始化而实现的。在8250端口寄存器中,3FSH和3F9H分别设置为波特率因子的低8位和高8位值。该因子取值范围为1~65 535,对输入时钟(1. 843 2 MHz)进行分频,产生16倍波特率的波特率发生器时钟(BAUDOUT),因而
对8250初始化预置了波特率因子之后,波特率发生器方可产生规定的波特率。
51单片机串行通信的波特率因串行口工作方式选择不同而异。它除了与系统的振荡频率、电源控制寄存器PCON的SMOD位有关外,还与定时器T1的设置有关。
在串行口工作方式O时,波特率固定不变,其大小为foSC/12。在串行口方式2时,波特率也只固定为两种,与SMOD位的值有关:当SMOD-O时,波特率为foSC/64;当SMOD=1时,波特率为foSC/32。串行口方式1、3的波特率是可变的,除与SMOD位的取值有关外,主要取决于定时器1的溢出率。当定时器1用作串行通信的波特率发生器时,波特率可由下式确定:
波特率=T1溢出率/n
式中:n=32或16,对应于PCON中SMOD=O或1。而Ti的溢出率取决于计数速率和定时时间常数,即
T1溢出率=计数速率/256-x
此时T1工作于方式2,即8位自动装载方式。这种方式可以避免重新设定定时初值。式中x即为在TH1和TL1中装入的初始计数值。定时器1的计数速率与定时器工作方式的选择有关。当选择T1为定时工作方式时,其计数输入脉冲为内部时钟信号,即每个机器周期使寄存器值加1,而每个机器周期为12个振荡周期,故计数速率为fosc/12。若系统fosc=12 MHz,则T1计数速率为fosc/12=1 MHz。由此可得出
例如,假定串行通信双方波特率要求为9 600 b/s.系统振荡频率fosc=11. 59 MHz,当SMOD选为1时,TH1、TL1的初值计算如下:
将此值置入TH,、TL1时,波特率发生器产生的实际的传输速率为
在这种情况下,PC机与单片机可以进行正常的接收与发送。
根据以上条件,若系统采用12 MHz系统时钟,按照上面公式计算可得出z≈250或249(FAH或F9H)。此时在THi和TL1中置入FAH或F9H时,实际的传输速率为10 416. 67或8 928. 57 b/s,其误差分别为-8.5%或+7%。
实践表明,PC机与单片机在这种条件下不能实现正常的接收与发送。
上面的计算表明,在串行通信中,当规定了传输速率以后,波特率的设置与系统使用的振荡频率有着很重要的作用,可直接影响通信的成功与失败。上例中,当双机约定了传输速率为9600 b/s时,若系统振荡频率为12 MHz或6 MHz,PC机的波特率为9 600 b/s,而单片机实际的波特率大于(或小于)9 600 b/s.则波特率误差为8.5%。也就是说,若PC机以101.17 μs的时间发送一位数据,则单片机以96 μs的时间接收一位数据。在接收一帧数据的过程中,由于误差的累积,则产生了错码。
我们知道,在单片机的串行接收方式(1、2、3)中,CPU以16倍波特率的采样速率不断对接收数据(RxD)采样,一旦检测到由1到0的负跳变,16分频计数器立刻复位,使之满度翻转的时刻恰好与输入位的边沿对准。16分频计数器把每个接收位的时间分为16份,在中间三位即7、8、9状态时,位检测器对RxD端的值采样,并以3取2的表决方式,确定所接收的数据位。这3个状态,理论上对应于每一位的中间段,若发送端与接收端的传输速率不一致,就会发生采样偏移。这种传输速率的误差在允许范围内不致产生错位或漏码;但当误差超出允许范围时,便会发生错位,使接收的某数据重复接收,因而产生接收数据错。
下面仅对由波特率误差引起的错码现象作一分析。例如PC机与单片机的通信速率约定为9 600 b/s,系统时钟为6 MHz时,为了按约定的速率通信,PC机在8250异步通信接口中的3F8H和3F9H寄存器中设定波特率因子分别为OCH和OOH;而单片机中定时器1初值TH1=TL1 =FDH。此时,PC机发送数据与单片机接收数据情况如下:
10H—1FH 30H~3FH
以上数据表明了接收数据中出现的错码情况。通过对上述错码进行剖析可以看到:当因波特率误差引起接收端采样偏移时,如果这个偏移使得接收某数据位的采样在该位中点的半位间隔时,将会对该位采样两次,因而形成了上面的错码情况。下面公式表明错码或漏码发生的位数N:
即当串行异步通信的帧格式为11位时:
●N≤11,表示一帧数据中有某位被采样错,且采样出错在第N位;
●N》ll,表示一帧数据中没有数据位发生采样错。
本例中,波特率误差为8. 5%,由上面公式得出8.5%×11=0.935》0.5,说明在这个波特率误差下将出现采样错,且出错位为:
即在数据帧包括起始位的第6位发生错码,在第6位采样了两次,因而得到上面错码情况。
由此可以类推出错误的接收数据。
相反,当PC机的传送波特率大于单片机的传送波特率时,则会在第N位出现漏码错误。这里不再赘述。
由上面的公式还可以推断出,当波特率相对误差小于4. 5%时,这种采样的偏移将不影响正常的数据接收。但一般为了保证传输的可靠性,通常波特率误差不大于2.5%,而尽量选择最小的传输误差率。
在波特率的设置中,还有一个问题值得注意,这就是SMOD位的选择也影响着波特率的准确率。请看下面例子:
设波特率为2 400 b/s,fosc=6 MHz时,SMOD可以任选为0或1。但是由于对SMOD不同的选择,产生了不同的波特率误差:
上面的分析说明了SMOD值虽然是可以任意选择的,但在某些情况下,它直接影响着波特率误差范围,因而在波特率设置时,对SMOD的选取也需要做适当的考虑。
以上对串行通信所必须涉及的波特率设置问题作了一些分析。由此可以看出,在异机种的串行通信中,波特率的设置是很重要的问题,它直接关系着串行通信的成功与失败,因此在波特率设置时需要给予足够的认识。
全部0条评论
快来发表一下你的评论吧 !