单片机与IBM-PC机的串行通信分析
扫描二维码
随时随地手机看文章
51单片机和IBM - PC机是目前我国应用最广的两种微型计算机。作为单片机,51单片机不但功能强,体积小,价格低,而且使用方便,特别市场上提供的多种51单片机开发系统,为开发应用51单片机提供了非常方便的手段。因此,51单片机在许多领域,特别是工业控制和智能仪器领域已得到广泛的应用。事实已证明,51单片机已成为8位微机之首。作为系统机,IBM - PC的优点已众所周知,可以说,IBM - PC微机的出现为微机领域带来了一场革命。在我国,由于汉字操作系统(CCDOS)的引入,使得IBM - PC在各个领域得到迅速的推广使用。
串行通信是计算机进行数据通信的主要方式之一。由于其连线少,成本低,再加上有调制/解调功能,因而特别适合于距离较远,且通信点较多的场合,如各种计算机网络和分布式系统等。RS - 232C是最常用的一种串行通信标准。在IBM - PC微机中,一般都有1~2个标准RS - 232C串行口,简称COM1和COM2。利用这两个串行口,IBM - PC可以与其他数字设备(计算机)进行一般的数据传送,或构成局部网络、多用户系统和分布式控制系统等。
51单片机片内即含有一个全双工的串行口,并具有多机通信功能,可以方便地构成多机控制系统。但是,由于51单片机的串行口并非标准的RS -232C,加上其波特率是采用系统时钟由内部通用定时器产生的,误差大;而其数据处理速度也比系统机低得多。因此当其与IBM - PC微机进行串行数据通信,特别是构成分布式多机控制系统时,将会遇到许多意想不到的技术问题,诸如硬件连接、波特率选择、数据同步以及多机通信控制等。我们根据多年的实践经验,对这些问题提出了一些具体解决办法,供广大同行参考。
一、硬件连接
RS - 232C采用负逻辑。其电平范围通常为:逻辑1=-3~-15 V;逻辑0=+3~+15 V。由于51单片机的串行口是TTL电平,故必须进行电平转换,一般都采用MC1488(输出)和MC1489(输入)来完成。其连接方法如图1- 32所示。图中,MC1488采用土12 V电源,MC1489采用+5 V电源。IBM - PC串行口中的第4脚RTS(请求发送,输出)与第5脚CTS(清除发送,输入),以及第6脚DSR(数据装置准备好,输入)与第20脚DTR(数据终端准备好,输出)分别连接在一起,主要是因为PC机BIOS中的INT14H(串行通信程序)在接收和发送数据时,均要判别CTS和DSR是否有效。如果用户自己编制通信程序,采用判断收/发缓冲区是否满/空的办法来完成数据输入/输出,则可不必短接。
顺便指出,IBM - PC及其兼容机串行口中的电平转换器通常有两种:老式原装机和长城0520机,采用7515075154。而一般的兼容机均用75188( MC1488)/75189 (MC1489)。1489中的每个接收门均有一个阈值电平控制端。当该脚开路或接一电容C至地时,其阈值电平VT =1. 1~1. 25 V,即当Vi≤1.1 V时,V。=1;V1≥1. 25 V时,V0=0。不难看出,这种电平与TTL电平具有兼容性。因此,图1- 32中1488和1489均可用普通TTL反相器代换,从而省去了土12 V电源。但要注意的是,替换1488的反相器最好用OC门,以便扩大电平范围和增加驱动电流;而替换1489的反相器输入端应加双向二极管电平箝位。此外,这种接法传送距离不宜太长,一般应在3m以内(标准RS - 232C电平传送距离可达15 m以上),距离过长,因两端地电位不一致以及噪声干扰会导致电平范围出错。
上述做法虽然省去了士12 V电源,但只适合于使用MC1488/1489的PC机,且传送距离近。为了与标准RS - 232C电平兼容,又不用±12 V电源,可采用图1- 33所示的准RS -232C电平转换电路。图中虚线框内电路产生-7.0~-9.0 V的负电压。其工作原理是,由CMOS反相器F1和F2构成的多谐振荡器产生f=0.7 MHz的方波,经F3和F4双门驱动后,高电平时对Cl充电,低电平时,Cl反过来又对C2充电,从而在C2上产生一定的负电压。这里采用CMOS反相器,主要是为了降低其自身的功耗以及提高高电平电压。值得一提的是,如果8031的ALE脚负载不重,亦可直接利用它作为时钟源(1 MHz),这时由Fi和F2构成的多谐振荡器就可省去了;不过C1和C2要适当加大些。
产生负电源还有一种既简单,又实用的方法,如图1- 34所示。如果将RTS引出,亦可产生正电压而代替图1- 33中的+5 V,这样可进一步扩大电平范
围。但要注意的是,图1- 34中正负电压是从信号中提取的,其驱动能力差,因此不宜带过重的负载。
从图1- 33中可以看出,这种电平转换电路省去了±12 V电源,而且仅用2只廉价的三极管取代了较贵的1488/1489,因而大大降低了接口电路的成本,是一种非常实用的方法,特别是对于像前端控制机、单片机开发系统等提供土12 V电源有困难的系统。
二、波特率的选择
波特率是串行通信中的一个关键参数。通信双方波特率的一致性直接影响数据传输的正确性。当误差太大时,甚至无法进行正常的传输。通常对于11位的串行帧(1位起始位+8位数据位+1位标志位+1位停止位),所允许的最大波特率误差应不超过4.5%。
RS - 232C通信标准中,标称波特率有:50,110,150,300,600,1 200,2 400,4 800,9 600及19 200等。其中以1 200~9 600最为常用。IBM - PC的串行通信控制器采用的是In-te18250.其波特率是采用1.843 2 MHz专用时钟,由16位的除法器产生的,可以精确地定出各种标称波特率。而51单片机的波特率是采用系统时钟由定时器T,产生的。由于系统时钟一般为6.0 MHz或12.O MHz,有效位数少,而T.又是用的8位自动装入定时方式,因此,很难精确地定出各种标称波特率。当两台51单片机进行串行通信时,只要两机的系统时钟和定 时常数一致,就能保证数据正确传输。这时的波特率只是反映传送的快慢,而不是非要达到多少精度。因为两机的波特率即使有误差,也只是系统时钟(晶体)上的误差。这种误差通常是很小的,可忽略不计;但当51单片机与IBM - PC进行串行通信时,这种误差就大了。以4800波特为例:
对于PC机,除法器控制常数为:
无误差。式中,B为波特率。
对于51单片机,当系统时钟fosc=6 MHz时,定时常数为:
因n必须为整数,四舍五入后n=253(FDH);反过来,因取整得出的实际波特率为:
波特率误差:
比所允许的误差大,当然数据也就无法正确传输了。同理,不难证明,在1200-9600的标称波特率范围内,只有1 200是唯一可用的,其n=243(F3H),x-96(0060H)。显然,对于那些想用高波特率传送数据的用户来说,这无形之中提出了一个难题。那么是否有办法解决这一难题呢?办法是有的,只是不能局限于几个标称波特率上。其算法如下:
①假定51单片机上的一个定时常数n,一般n取值为F4H~FEH(波特率为1200~9600);
大n值重复上述①~④步求出下一个可用波特率。
根据上述算法,不难求出1 200~9 600的所有可用波特率(假定fosc=6.0 MHz),如表1- 16所列。注意,如果使用表1- 16中的非标称波特率来进行通信,那么PC机程序就不能调用INT14H的功能0来初始化串行口波特率了,而只能采用下述子程序(以COMi为例),即直接往除法器送控制常数。
三、数据同步
串行通信分同步和异步两种方式。尽管51单片机的串行口既可进行同步通信(方式0),又可进行异步通信(方式1~3),但IBM - PC机的串行口只有异步方式。在异步串行通信中,波特率的一致性是数据位同步的保证,而帧同步只能靠DSR/DTR和RTS/CTS等异步通信控制信号了。遗憾的是,51单片机串行口没有这些控制信号。因此,当51单片机与IBM - PC进行串行通信时,虽然波特率选择一致,能保证单个字节传输正确,但无法保证大块数据传输正确。例如,当PC机往单片机每次单独传送一字节时,51单片机都能正确接收,但连续传送一批数据时,由于单片机比PC机的指令处理速度低,PC机发送一字节后,单片机可能还没取走,PC机就发出下一字节了。这样就会导致大量数据被丢失。由此可见,在PC机与51单片机的串行通信中,数据帧(1帧-10或11位)同步也是一关键问题,下面介绍两种同步方法。
1.硬件方法
在图1- 32的基础上,借助于8031 P。口的其他位来模拟各异步通信控制信号。其连接方法如图1- 35所示。这样利用RTS/CTS和DSR/DTR就可方便地完成异步双向串行数据传输了。如果PC机程序不是通过调用INT14H,而是通过自己设计的一个子程序来完成收/发数据的,那么只要使用两组信号中任意一组,即可完成异步传输,这样又可省去两根连线。
通过8031外部扩展一个异步通信控制器8251,也是一种行之有效的方法,只是那样做以后,硬件成本提高,软件控制也变得复杂了。
2.软件方法
一种很容易想到的软件方法就是“延时法”。例如,当PC机要往单片机发送一批数据时,每发一个字节,就延时一段时间,以便单片机能及时将刚收到的字节取走并处理完。这种做法的困难在于延时常数不好确定。一种改进方法就是,一方面发送方采取一定的延时,另一方面在发送一组(可以是一字节,也以可是若干字节)数据后,接收方应回答一个数据信号(不是控制信号!)。该信号既可表示接收到的数据正确与否,又可起同步作用。