基于DELPHI的PC机和AT89C51单片机的串行通信实现
2011-08-30田淑娟韩琛晔
刘 荣,田淑娟,燕 苗,韩琛晔
石家庄计算机职业学院,河北石家庄 050061
在工业生产实践中,经常要对某些仪器仪表进行监测或是发送某些参数,串口编程就显得相当重要。PC机以其高的性价比、较强的数据处理能力、较快处理速度、以及单片机体积小、低功耗、低成本、高性能、使用灵活的特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业控制领域中被广泛采用。
1 下位机设计
1.1 单片机与PC机的RS-232标准接口通信电路的设计
RS-232C是目前最常用的串行接口标准,RS-232C提供了单片机与单片机、单片机与PC机之间串行数据通信的标准接口。但RS一232C规定的逻辑电平与单片机的逻辑电平是不一致的。因此,在应用中必须把单片机的TTL电平和RS-232C电平进行相互转换,这里选用专用电平转换集成芯片MAX232来实现的。
1.2 MCS51单片机与PC机串行通信接口的硬件电路设计
用MAX232芯片实现PC机与AT89C51单片机串行通信的典型电路如图1所示。图中外接电解电容C1、C2、C3、C4用于电源电压变换,可提高抗干扰能力,它们可取相同容量的电容,一般取1.0μF/16V。电容C5的作用是对+5V电源的噪声干扰进行滤波,一般取0.1μF。选用两组中的任意一组电平转换电路实现串行通信,中选Tlin、Rlout分别与AT89C51的TXD、RXD相连,Tlout、Rlin分别与PC机中R232接口的RXD、TXD相连。这种发送与接收的对应关系不能接错,否则将不能正常工作。
图1 MAX232芯片实现PC机与AT89C51单片机串行通信的典型电路
1.3 MCS51单片机与PC机串口通信协议设计
1.3.1 通信方式选择
通信方式上,采用异步方式,微处理器对PC机的通信采用串口中断方式。
AT89C51有一个标准的串行口,有4种工作方式,其中方式1是标准的10位异步通信方式,1O位数据和PC机的标准串口相对应,由串口控制寄存器SCON设置状态,设置SCON=0X50H。
1.3.2 89C51通信波特率设置
在串行通信中,一个重要的指标是波特率,它反映了串行通信的速率,也反映了对传输通道的要求。波特率越高,要求传输通道的频带越宽。由于异步通信双方各自用自己的时钟源,要保证捕捉到的信号正确,最好采用较高的时钟。一般选择时钟频率比波特率高16倍或64倍。如果时钟频率等于波特率,则频率稍有偏差便会产生接收错误。这里选用l1.059MHz晶振。
89c51的串行通信的波特率由定时器T1的溢出率获得,当串口工作于方式1时,波特率为:波特率=(2SMOD*TD)/32,其中SMOD为波特率加倍。取值为0或1。定时器工作于方式2时,波特率为 9 600bit/s,令 SMOD=0, THl=TL1=0Xfd。
传送方式:PC机采用查询方式接收数据,单片机采用中断方式接收、发送;校验方式:奇偶校验。
1.4 下位机通信软件的设计
单片机通信程序分为接收中断处理程序、发送中断处理程序和通信处理程序3部分,构成整个单片机的通信程序。
接收中断处理程序主要负责接收微机发送到单片机接收缓冲区的数据,接收数据时,串行数据的接收受到串行控制器SCON中的允许接收位REN控制。当REN为1时,接收控制器开始工作,对接收数据进行采样。当接收到规定的字符数之后,置接收中断位RI为1,以表明接收缓冲区中有待处理的数据并请求通信处理程序对其进行处理。
发送中断处理程序主要负责向微机发送数据,发送数据时,通信处理程序将需要发送的数据写入单片机的发送缓冲区SBUF,启动了发送工作,并将缓冲区数据逐一发送给微机。当发送完指定长度的数据后(发送缓冲区为空),发送中断处理程序将发送中断标志位TI置位为1,直到通信处理程序再一次发送数据。
只有在接收到上位机送来的一串数据,且接收完毕标志为“1”时,才能真正进行处理。首先对接收缓冲区SBUF中的内容进行校验,完全无误后再根据通信要求对缓冲区的内容进行相应处理,同时判断是否还需将发送缓冲区SBUF中的数据发送到微机,最后退出通信处理程序,执行其它程序。当接收中断程序再次接收到数据并将接收完标志置为“1”后,可再次进入通信处理程序进行相应的处理。
2 上位机设计
Borland公司推出的Delphi以其强大的功能并且友好的、有可视化用户界面,特别适合Windows平台下的图形界面和用户程序的编制从而得到广大用户的认可;同时采用第三方控件Spcomm的属性和方法及事件来实现系统监测控制和信息处理是工业企业通常采用的实现方法。
2.1 Spcomm控件的属性、方法和事件
1)属性
CommName:计算机串口端口号的名字,COM1、COM2;Parity:校验位的设置。BaudRate:串口通信波特率;ByteSize:一个字节中,收发数据数据位数;StopBits:一个字节中,使用停止位的位数;SendDataEmpty:发送缓冲区是否为空。
2)方法
StartComm方法:用来打开通信串口,开始通信。
StopComm方法:用来停止通信串行口的所有进程,关闭串口。
WriteCommData(pDataToWriteChar;dwSizeofDataToWrite:Word)方法是带有布尔型返回值的函数,其中pDataToWrite是要写入串行口的字符串,DwSizeaofDataToWrite是要写入的字符串的长度。该函数通过一个写线程向串行口输出缓冲区发送数据。
3)事件
ata(Buffer:inter;BufferLength:Word),其中Buffer是指向输入缓冲区的指针。BufferLength是从缓冲区收到的数据长度。当输入缓冲区收到数据时,该事件被触发。当输入缓存有数据时将触发该事件,对从串口收到的数据进行处理。
2.2 Spcomm控件串口通信的实现
Spcomm串口通信的实现
实现PC机与单片机之间的数据发送及接收需要以下步骤:
1)串口初始化,通过设置如下属性完成。即分别设置属性 Comm1.CommName:=com1;Comm1.BaudRate:=9600;Comm1.Parity:=None;Comm1.ByteSize:=8; Comm1.StopBits:=1; Comm1.StartComm。
要实现PC机与单片机之间的通信,首先要建立它们之间的握手信号,握手信号为约定的特定字符, 当PC发出一帧数据后,如果在接收事件能收到单片机返回的规定字符来判断表示握手成功,系统通信正常。
2)发送数据。在编写基于串口的监测控制程序时,需要由PC机向单片机发送控制指令从而控制下位机的行为,同时向下位机发送相应数据,调用相应的发送程序。
3)接收数据。在控制中,常常需要实时接收下位机传上来的数据,但用SPCOMM时会出现必需缓存满或者每帧之间的间隔大于ReadIntervalTimeout时才会触发OnReceivedata,ReadIntervalTimeout属性默认值是100ms,即在100ms内,属于同一帧数据。编写串口的监控程序时,通常需要由下位机向PC机发送数据以使PC机了解系统的测试数据或下位机的运行状态,并进而控制下位机的行为。
4)关闭串口。在系统开发中,应注意在不使用串口时应及时关闭串口,释放系统资源,否则可能会影响系统的其它应用。即调用comml.StopComm。
3 结论
在采用以PC机为控制中心的数据采集自动化控制系统中,通常需要单片机采集数据,然后用异步串行通讯方式传给PC机,在PC机上进行数据处理再传送到单片机,是很有应用价值的。
[1]求是科技.elphi串口通信工程开发实例导航[M].人民邮电出版社,2003.
[2]张晓乡.89C51单片机实用教程[M].电子工业出版社,2010.
[3]黄军,熊勇,刘艳,刘晓梅.delphi串口通信编程[M].人民邮电出版社,2010.
[4]李朝青.PC机及单片机通讯技术[M].北京航空航天大学出版社,2000.