论文部分内容阅读
摘要:提出基于AT89S52单片机的下位机数据采集系统与Delphi环境下PC机的串行通讯的软硬件实现方法。简要介绍系统的工作流程和通讯控制原理,详细介绍单片机与PC 机通讯的硬件控制电路、通讯协议以及上下位机软件实现过程,重点介绍Delphi语言中SPComm控件的使用方法。采用软硬件相结合的方法进行仿真和调试,成功实现了功能要求。实际应用表明,这种通讯方案稳定可靠且控制简单,具有很强的工程实用性和广泛的应用前景。
关键词:AT89S52单片机;RS 232;串行通讯;Delphi
中图分类号:TP338文献标识码:A文章编号:1009-3044(2008)36-2779-03
Serial Communication between PCand AVRSingle Chip under Environment of Delphi
LI Jun-heng, GU Ai-yu
(Guangdong Province Institute of Techmology Automation College, Guangzhou 510006, China)
Abstract: under environment of Delphi and the data collecting system based on AVR single chip processor. Simply introduces the workflow of the system and the control principle of communication. Detailedly introduces the hardware circuit chart ,communication agreement and actualization method of software of serial communication between computer and single chip. It specially places emphasis on the Operation of SPComm component in the programme language of Delphi ,adoptes combining software and hardware to carry out emulation and debugging and succeeded to realize the required function. Physically application indicates that this proposal of communication got powerful stability and credibility and simple control ,possess of strong engineering practica bility and extensive market foreground.
Key words: AT89S52 singlechip; RS232; serialcommunication; Delphi; SPComm
1 引言
随着现代计算机技术和电子技术的发展,采用价格低廉、现场控制能力强的单片机作为下位机直接对控制对象进行驱动控制和实时数据的采集、处理,并通过串口与上位PC机进行串行通讯,在现代工业测控领域中得到了广泛的应用。近些年,在监测与控制软件系统的开发设计中,由于Delphi具有可视化开发环境,强大的数据库开发功能。包含功能丰富的VCL库,而且封装了大量的Windows API函数等特点,使得Delphi在处理大量数据和实现PC机与单片机的串行通讯等方面应用十分方便。本文即介绍了报警控制系统中上下位机的串行通讯。下位机采用AT89S52进行数据集,前置电路对3路检测信号进行光电转换和放大处理后送入到AT89S52单片机自带的10位A/D转换器中进行A/D转换,单片机再将三路转换值以16进制通过串行通讯发往PC机;上位机中采用Delphi编写软件,利用Delphi的强大数据库功能管理下位机发送的数据,供图表显示和产量、成品计算等;并在Delphi中利用SPComm控件实现与下位机的串行通讯。
2 硬件电路图
串口是微机上的标准设备,在进行串行通讯时不需要给微机增加额外的硬件,电路简单且技术可靠。在PC机与单片机构成的上下位机系统中,若采用软件实现握手协议,则利用基本3线制(TXD,RXD,GND)的连接即可实单片机与PC机的通讯,硬件电路如图1所示。由于单片机信号电平(TTL电平)与PC机配置的串行接口电平(RS 232电平)两者电气规范不一致,故采用MAX232电平转换芯片进行电平转换。
3 下位机软件设计
ATMEL单片机AT89S52的UART是一个高度灵活的串行通讯设备,能进行全双工操作,可工作在异步方式或同步方式下,并具有多处理器通讯模式。倍速异步通讯模式等增强型,通信功能,下位机的软件设计主要是通讯协议的设定和相关程序的设计。
3.1 通讯协议
给上下位机设置适当的通讯协议是保证上下位机能正常通讯的基础。系统采用全双工异步通讯模式,通讯协议设置如下:
波特率采用9 600帧格式,数据格式采用8位数据位,1位起始位,1位停止位,为使通讯更可靠使用了奇偶校验功能,采用奇校验。但如果上位机检测出所接收的数据错误,则丢弃不用,不再给下位机发信号请求重新发送数据,以保证单片机稳定的采样频率。
握手协议采用软件实现上下位机的握手,下位机要往上位机发送数据时,先发送一个握手信号:aa;上位机收到后回发一个信号:bb,表示已经做好数据接收准备。
3.2 程序设计
下位机通讯的程序采用C语言编写,主要任务是完成UART的初始化、采集数据的A/D转换、握手的实现和数据的发送。这里主要介绍串口的初始化程序以及通讯程序的流程图。
串口的初始化程序:主要设置相关的通信协议。
#include
#define uint unsigned int
#define uchar unsigned char
void init()
{
SCON=0x40;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd; //波特率设置为9600
EA=0;
REN=1;
TR1=1;
}
uchar ReceiveData(void)//自定义接收函数
{
uchar c;
while(RI==0);
RI=0;
c=SBUF;
return c;
}
void main()
{
init();
RI=0;
while(1)
{
P1=ReceiveData();
}
while(1);
}
通訊流程简介:在完成相关的初始化工作后,启动A/D转换,当3路信号都转换完成后单片机往上位机发握手信号,等待上位机的应答。串口发送采用查询方式,即CPU不停地查询数据寄存器是否为空,若为空则装载新的数据开始发送;而接收则采用中断方式,在数据接收结束后进入中断服务程序,为使程序尽量少地在中断中停留,中断服务程序中仅完成对握手信号的判别和发送标志的置位。当握手成功后,单片机把转换的数据往上位机发送,数据全部发送完成后即进入下一轮的采样、转换和发送。串行通讯流程如图2所示。
图2 串口通信流程
4 上位机软件设计
Delphi是一种采用事件驱动方式、面向对象的可视化高级编程语言,本系统的通讯软件设计采用Delphi7.0。在Delphi可以利用的众多串行通信控件中,SPComm控件是最简单,功能比较强大的一种。该控件具有丰富的与串口通信密切相关的属性及事件,提供对串口的各种操作。
4.1 SPComm 的主要属性、方法和事件
4.1.1 属性
Commonage:串口名,填写COM1,COM2 等串口的名字,字符型变量;
Baud Rate:设定波特率。如9 600 ,19 200 等,在串口 打开后也可更改波特率;
ParityCheck 是否使能奇偶校验;
ByteSize:字节长度。根据实际情况可设定为5,6,7或8 位;
Parity:奇偶校验位;StopBit s:停止位的位数;
SendDataEmpty:这是一个布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False 时表示发送缓存不为空,或者发送队列里有信息。
4.1.2 方法Startcomm:用于打开串口,若打开失败通常会报错;
StopComm:用于关闭串口,没有返回值。
4.1.3 函数
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word):boolean:用于发送一个字符串到写线程,发送成功返回True,失败则返回False,执行此函数将立即得到返回值,发送操作随后执行。函数有2个参数,其中pDataToWrite是需要发送的字符串,dwSizeofDataToWrite是发送的字符串的长度。
4.1.4事件
OnReceiveData:procedure(Sender:TObject;Buffer:Pointer;Bufferlength:Word)of object:当输入缓存有数据时触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,Bufferlength是收到的数据长度。
OnReceiveError:procedure(Sender:TObject;EventMask:DW() RD):当接收数据时出现错误将触发该事件。
4.2 程序关键部分的实现
Delphi中用于串口通讯的程序较少,集中在简单的串口打开和关闭、握手信号的测试和下位机采集数据的接收这几大板块,以下仅做简单介绍。
4.2.1打开串口并初始化
Procedure T Form 1.opencomm(Sender:T object);
Begin
Comm1.CommName:=comm.;//选择串口
Comm1.BaudRage:=9600;//设定波特率为9600
Comm1Parity:=odd;//奇偶校验
Comm1.StopBits:=_1; //1位停止位
Comm1.ByteSize:=_8; //8位数据位
Comm1.StartComm; //打开串口
End;
4.2.2 测试握手信号
Procedure T Form1.Button Click(Sender:T 0bject);
Var
I:byte;
Comm. Flg:Boolean; //变量定义
Begin
Sbuf[1]:=byte(aa);
Comm. Flg:=true; //若信号正确设定为true
If not T Form1.comm1.write commdata(@ sbuf[1],1)then
Begin
Comm. Flg:=false;//若接收错误标志为false
End;End;
4.2.3 数据接收事件
Procedure T Form1.comm ReceiveData(Sender:T 0bject;Buffer;Pointer;Bufferlength;Word);
Var
I,j:integer;
Comm. Revstr:shortstring;
RevP:RecData[1…1024]of byte; //变量定义
begin
setLengrh(commRevStr,BufferLength);//设置字符串长度与缓冲区大小相等;
move(buffer,pchar(@ rbuf),bufferlength);//将缓冲区内容拷贝到字符串地址上;
for i:=1tobufferlengrh do
begin
view string:=view string inttohex(rbuf[i],2) ””;//接收到的数据在窗体中显示
RecData[i]:=integer(S[i]);//存储接收到的数据
……
End;
End;
4.2.4 关闭串口
Procedure T Form1.Button 3Click(Sender:T 0bject);
Begin;
Comm1.StopComm;//关闭Comm1
End;
5 结束语
本文对实现上位机与单片机之间穿行通信的方法进行了详细的讨论,在实际报警控制系统应用中,这种串口通信方法表现了很强的工程实用性,通讯可靠稳定且成本低廉同时由于上下位机都是用高级语言编写,稍加修改便可方便的移植到其他类似的工程系统中故在测控工程领域有着广泛的前景。
参考文献:
[1] 黄军,熊勇.Delphi串口通信编程[M].北京:人民邮电出版社,2002.
[2] 范逸之,陈立元.Delphi与RS232串行通信[M].北京:清华大学出版社,2004.
[3] 孙滨,宋健.用Delphi实现上位机与PIC单片机的串行通訊[J].现代电子技术,2004,27(16):92-93.
[4] 桑开勇,陈铁军.Delphi环境下利用SPComm控件进行单片机串口通信[J].现代电子技术,2006,24(15):26-28.
[5] 徐新华,任晓,吕涛.基于Delphi的PC机与PIC单片机的串行通信[J].电子工程师,2006(3):59-59.
[6] 倪倩,程勇,高绘玲.Delphi环境下油泵测控系统PC机与单片机通讯的实现[J].福建电脑,2005(12):120-121.
[7] 丁易新.PC机与AVR单片机之间穿行通信的实现[J].现代电子技术,2005,28(12).
关键词:AT89S52单片机;RS 232;串行通讯;Delphi
中图分类号:TP338文献标识码:A文章编号:1009-3044(2008)36-2779-03
Serial Communication between PCand AVRSingle Chip under Environment of Delphi
LI Jun-heng, GU Ai-yu
(Guangdong Province Institute of Techmology Automation College, Guangzhou 510006, China)
Abstract: under environment of Delphi and the data collecting system based on AVR single chip processor. Simply introduces the workflow of the system and the control principle of communication. Detailedly introduces the hardware circuit chart ,communication agreement and actualization method of software of serial communication between computer and single chip. It specially places emphasis on the Operation of SPComm component in the programme language of Delphi ,adoptes combining software and hardware to carry out emulation and debugging and succeeded to realize the required function. Physically application indicates that this proposal of communication got powerful stability and credibility and simple control ,possess of strong engineering practica bility and extensive market foreground.
Key words: AT89S52 singlechip; RS232; serialcommunication; Delphi; SPComm
1 引言
随着现代计算机技术和电子技术的发展,采用价格低廉、现场控制能力强的单片机作为下位机直接对控制对象进行驱动控制和实时数据的采集、处理,并通过串口与上位PC机进行串行通讯,在现代工业测控领域中得到了广泛的应用。近些年,在监测与控制软件系统的开发设计中,由于Delphi具有可视化开发环境,强大的数据库开发功能。包含功能丰富的VCL库,而且封装了大量的Windows API函数等特点,使得Delphi在处理大量数据和实现PC机与单片机的串行通讯等方面应用十分方便。本文即介绍了报警控制系统中上下位机的串行通讯。下位机采用AT89S52进行数据集,前置电路对3路检测信号进行光电转换和放大处理后送入到AT89S52单片机自带的10位A/D转换器中进行A/D转换,单片机再将三路转换值以16进制通过串行通讯发往PC机;上位机中采用Delphi编写软件,利用Delphi的强大数据库功能管理下位机发送的数据,供图表显示和产量、成品计算等;并在Delphi中利用SPComm控件实现与下位机的串行通讯。
2 硬件电路图
串口是微机上的标准设备,在进行串行通讯时不需要给微机增加额外的硬件,电路简单且技术可靠。在PC机与单片机构成的上下位机系统中,若采用软件实现握手协议,则利用基本3线制(TXD,RXD,GND)的连接即可实单片机与PC机的通讯,硬件电路如图1所示。由于单片机信号电平(TTL电平)与PC机配置的串行接口电平(RS 232电平)两者电气规范不一致,故采用MAX232电平转换芯片进行电平转换。
3 下位机软件设计
ATMEL单片机AT89S52的UART是一个高度灵活的串行通讯设备,能进行全双工操作,可工作在异步方式或同步方式下,并具有多处理器通讯模式。倍速异步通讯模式等增强型,通信功能,下位机的软件设计主要是通讯协议的设定和相关程序的设计。
3.1 通讯协议
给上下位机设置适当的通讯协议是保证上下位机能正常通讯的基础。系统采用全双工异步通讯模式,通讯协议设置如下:
波特率采用9 600帧格式,数据格式采用8位数据位,1位起始位,1位停止位,为使通讯更可靠使用了奇偶校验功能,采用奇校验。但如果上位机检测出所接收的数据错误,则丢弃不用,不再给下位机发信号请求重新发送数据,以保证单片机稳定的采样频率。
握手协议采用软件实现上下位机的握手,下位机要往上位机发送数据时,先发送一个握手信号:aa;上位机收到后回发一个信号:bb,表示已经做好数据接收准备。
3.2 程序设计
下位机通讯的程序采用C语言编写,主要任务是完成UART的初始化、采集数据的A/D转换、握手的实现和数据的发送。这里主要介绍串口的初始化程序以及通讯程序的流程图。
串口的初始化程序:主要设置相关的通信协议。
#include
#define uint unsigned int
#define uchar unsigned char
void init()
{
SCON=0x40;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd; //波特率设置为9600
EA=0;
REN=1;
TR1=1;
}
uchar ReceiveData(void)//自定义接收函数
{
uchar c;
while(RI==0);
RI=0;
c=SBUF;
return c;
}
void main()
{
init();
RI=0;
while(1)
{
P1=ReceiveData();
}
while(1);
}
通訊流程简介:在完成相关的初始化工作后,启动A/D转换,当3路信号都转换完成后单片机往上位机发握手信号,等待上位机的应答。串口发送采用查询方式,即CPU不停地查询数据寄存器是否为空,若为空则装载新的数据开始发送;而接收则采用中断方式,在数据接收结束后进入中断服务程序,为使程序尽量少地在中断中停留,中断服务程序中仅完成对握手信号的判别和发送标志的置位。当握手成功后,单片机把转换的数据往上位机发送,数据全部发送完成后即进入下一轮的采样、转换和发送。串行通讯流程如图2所示。
图2 串口通信流程
4 上位机软件设计
Delphi是一种采用事件驱动方式、面向对象的可视化高级编程语言,本系统的通讯软件设计采用Delphi7.0。在Delphi可以利用的众多串行通信控件中,SPComm控件是最简单,功能比较强大的一种。该控件具有丰富的与串口通信密切相关的属性及事件,提供对串口的各种操作。
4.1 SPComm 的主要属性、方法和事件
4.1.1 属性
Commonage:串口名,填写COM1,COM2 等串口的名字,字符型变量;
Baud Rate:设定波特率。如9 600 ,19 200 等,在串口 打开后也可更改波特率;
ParityCheck 是否使能奇偶校验;
ByteSize:字节长度。根据实际情况可设定为5,6,7或8 位;
Parity:奇偶校验位;StopBit s:停止位的位数;
SendDataEmpty:这是一个布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False 时表示发送缓存不为空,或者发送队列里有信息。
4.1.2 方法Startcomm:用于打开串口,若打开失败通常会报错;
StopComm:用于关闭串口,没有返回值。
4.1.3 函数
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word):boolean:用于发送一个字符串到写线程,发送成功返回True,失败则返回False,执行此函数将立即得到返回值,发送操作随后执行。函数有2个参数,其中pDataToWrite是需要发送的字符串,dwSizeofDataToWrite是发送的字符串的长度。
4.1.4事件
OnReceiveData:procedure(Sender:TObject;Buffer:Pointer;Bufferlength:Word)of object:当输入缓存有数据时触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,Bufferlength是收到的数据长度。
OnReceiveError:procedure(Sender:TObject;EventMask:DW() RD):当接收数据时出现错误将触发该事件。
4.2 程序关键部分的实现
Delphi中用于串口通讯的程序较少,集中在简单的串口打开和关闭、握手信号的测试和下位机采集数据的接收这几大板块,以下仅做简单介绍。
4.2.1打开串口并初始化
Procedure T Form 1.opencomm(Sender:T object);
Begin
Comm1.CommName:=comm.;//选择串口
Comm1.BaudRage:=9600;//设定波特率为9600
Comm1Parity:=odd;//奇偶校验
Comm1.StopBits:=_1; //1位停止位
Comm1.ByteSize:=_8; //8位数据位
Comm1.StartComm; //打开串口
End;
4.2.2 测试握手信号
Procedure T Form1.Button Click(Sender:T 0bject);
Var
I:byte;
Comm. Flg:Boolean; //变量定义
Begin
Sbuf[1]:=byte(aa);
Comm. Flg:=true; //若信号正确设定为true
If not T Form1.comm1.write commdata(@ sbuf[1],1)then
Begin
Comm. Flg:=false;//若接收错误标志为false
End;End;
4.2.3 数据接收事件
Procedure T Form1.comm ReceiveData(Sender:T 0bject;Buffer;Pointer;Bufferlength;Word);
Var
I,j:integer;
Comm. Revstr:shortstring;
RevP:RecData[1…1024]of byte; //变量定义
begin
setLengrh(commRevStr,BufferLength);//设置字符串长度与缓冲区大小相等;
move(buffer,pchar(@ rbuf),bufferlength);//将缓冲区内容拷贝到字符串地址上;
for i:=1tobufferlengrh do
begin
view string:=view string inttohex(rbuf[i],2) ””;//接收到的数据在窗体中显示
RecData[i]:=integer(S[i]);//存储接收到的数据
……
End;
End;
4.2.4 关闭串口
Procedure T Form1.Button 3Click(Sender:T 0bject);
Begin;
Comm1.StopComm;//关闭Comm1
End;
5 结束语
本文对实现上位机与单片机之间穿行通信的方法进行了详细的讨论,在实际报警控制系统应用中,这种串口通信方法表现了很强的工程实用性,通讯可靠稳定且成本低廉同时由于上下位机都是用高级语言编写,稍加修改便可方便的移植到其他类似的工程系统中故在测控工程领域有着广泛的前景。
参考文献:
[1] 黄军,熊勇.Delphi串口通信编程[M].北京:人民邮电出版社,2002.
[2] 范逸之,陈立元.Delphi与RS232串行通信[M].北京:清华大学出版社,2004.
[3] 孙滨,宋健.用Delphi实现上位机与PIC单片机的串行通訊[J].现代电子技术,2004,27(16):92-93.
[4] 桑开勇,陈铁军.Delphi环境下利用SPComm控件进行单片机串口通信[J].现代电子技术,2006,24(15):26-28.
[5] 徐新华,任晓,吕涛.基于Delphi的PC机与PIC单片机的串行通信[J].电子工程师,2006(3):59-59.
[6] 倪倩,程勇,高绘玲.Delphi环境下油泵测控系统PC机与单片机通讯的实现[J].福建电脑,2005(12):120-121.
[7] 丁易新.PC机与AVR单片机之间穿行通信的实现[J].现代电子技术,2005,28(12).