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个状态,理论上对应于每一位的中间段,若发送端与接收端的传输速率不一致,就会发生采样偏移。这种传输速率的误差在允许范围内不致产生错位或漏码;但当误差超出允许范围时,便会发生错位,使接收的某数据重复接收,因而产生接收数据错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)