基于AT89C51的数据采集系统设计新方法摘要:结合ADC0809、MAX232等器件的性能特点,同时运用单片机外围电路仿真工具(Proteus)、虚拟串口工具(VSPDXP)和串口调试软件(ComMonitorV2.0),给出了一种基于AT89C51单片机的数据采集系统的软硬件设计过程。关键词:单片机;数据采集;proleus仿真;虚拟串口工具0引言近年来,随着制造技术的发展,单片机的价格越来越低,性能却不断提升,因而其应用范围也越来越广。然而在开发基于单片机的应用系统时,传统方法一般都需要大量的硬件设备,这些设备极易损坏而且携带不方便。为此,本文基于AT89C51数据采集系统详细说明了如何利用Proteus和两款串口仿真软件来进行单片机程序及外围电路的仿真设计。采用该方法可以大大简化硬件电路测试和系统调试过程,对单片机系统开发具有指导意义。本文介绍的基于AT89C51单片机的数据采集系统能实现16路信号输入,每一路都是0~10mV的信号,每秒钟采集一遍,从而将数据传给上位PC计算机。1硬件设计1.1主控芯片AT89C51是一种带有4KB闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,可为很多嵌入式控制系统提供灵活且价廉的方案。所以,本设计采用ATMEL公司AT89C51作为程序的主控芯片。AT89C51数据总线是由P0口提供的,P0口本身能以多种方式提供数据总线和地址总线。当ALE输出信号为高电平时,P0将输出的数据锁入总线驱动器中作为地址的低8位,然后和P2送出来的高8位地址一起组成一个完整的16位地址,以寻址到外部的64KB的地址空间。AT89C51的地址总线比较简单(只有3个:RD、WR、PSEN),其中RD是用来读取外部数据内存的控制线,WR是用来写数据到外部数据内存的控制线,PSEN是用来存取外部程序内存的读取控制线。由于P0口是数据和地址分时复用口,故要进行地址锁存,本设计使用74HC573作为锁存器。1.2系统硬件电路本系统的硬件电路原理如图1所示。因为ADC0809的地址选择端A、B、C都接地,所以ADC0809的数据采集通道只有IN0被选通。16路模拟信号连接到多路选择模拟开关HCC4067后,即可通过地址选择端A、B、C、D进行选择,每一次选通一路,选通的通道经IOCOMX和ADC0809的IN0相连,以进行A/D转换。P2.7(地址总线最高位A15)可作为A/D转换的启动开关,P2.7为低电平有效。在启动A/D转换时,可由写信号WR和P2.7控制ADC0809的地址锁存和转换启动。而在读取转换结果时,则由读信号RD和P2.7控制ADC0809的OE信号。若令P2.7为0,74HC573的A、B、C、D即可给出被选择的模拟通道的地址,此时若ABCD=0000,则16路信号的IO0被选通,并将其数据送到ADC0809的IN0中,地址是7FF0H;若ABCD=1111,地址为7FFFH,则指向IO15。所以,16路信号依次对应的地址为7FF0H~7FFFH。转换完成后,数据将保存到一数组中,直到当上位PC机通过串行口发信号时,AT89C51通过检测地址是否和本机地址相符来作出动作。如果地址相符,则发送A/D转换结果,如不相符,则继续等待。1.3信号选通与调理本系统要求有16路模拟信号输入,而且必须将这些信号互相隔离,然后才能对这些信号逐一选通后进入A/D转换。为此,本系统选用了16选1多路模拟开关HCC4067。一般传感器的输出信号都比较微弱,要将该微弱信号转换成有用的信号以便于后期使用,就要加入信号调理电路,其作用是进行信号放大和去除干扰等。本设计中的信号输入每路都是0~10mV,但ADC0809的输入要求是0~5V,因此选用运算放大器OP07来进行信号放大。OP07是一种精密运算放大器,它使用双极性电源供电,精度较高,放大倍数为500,可把0~10mV信号放大到0~5V。使用OP07的信号调理电路如图2所示。1.4A/D采样电路ADC0809是美国NS公司生产的CMOS组件,是一种8路输入单片模数转换器件,采用逐位逼近式A/D转换原理,它的输出输入接口全部为TTL电平,数据输出口线为三态,可以直接接到微机系统总线上,而无需另加I/O接口芯片。由于本设计中使用16选1模拟开关来进行信号的选择,因此,ADC0809的信号选择功能就不使用了,设计时把ADC0809的地址选择端A、B、C都接地,即ABC=000,这样,选通通道始终是IN0。将EOC通过非门连接到AT89C51的INT0脚,可通过查询方式来检测转换是否完成。由于ADC0809的典型工作频率640kHz不太容易得到,所以通常使用相近频率且容易获得的信号进行替代。本设计中,单片机的晶振频率12MHz,ALE信号输出为晶振频率的六分之一(即2MHz),可将该2MHz经过74HC74四分频后得到500kHz信号来给ADC0809使用。1.5串行口控制AT89C51内部有一个可编程的全双工串行通信接口,该口能同时进行串行发送和接收,以便通过RXD引脚(串行数据接收端)和TXD引脚(串行数据发送端)与外界进行通信。AT89C51串行口有四种工作方式,本设计中,AT89C51串行口工作于方式3。串口方式3的波特率是可变的,它可由定时器T1的溢出率来控制。通过计算可以得到T1的装载初值为0xfd,波特率为9600bps。RS232是用正负电压来表示逻辑状态的,它与TTL以高低电平来表示逻辑状态的规定不同。因此,为了能够同计算机接口或与终端的TTL器件连接,必须在RS232与TTL电路之间进行电平和逻辑关系的变换。目前广泛使用的集成电路转换器件是MAX232芯片,它可完成TTL到EIA的双向电平转换。MAX232是一种双组驱动器/接收器,片内含有一个电容性电压发生器,可在单5V电源供电时提供EIA/TIA-232-E电平。每个接收器均可将EIA/TIA-232-E电平转换为5VTTL/CMOS电平。这些接收器具有1.3V的门限值及0.5V的典型迟滞,而且可以接收±30V的输入。利用MAX232芯片连接单片机和PC的具体电路如图3所示。由以上器件分析可知该系统所用到的电源电压总共有两种,其中运放OP07使用±12V,其它芯片使用+5V电压。2实验仿真2.1KeilC51软件的使用KeilC51软件是众多单片机应用开发的优秀软件之一。本设计就是在KeilC51环境中编译数据采集程序的。本采集系统的程序主要分成三部分:主程序、A/D转换程序和串行通信程序。图4所示是其软件流程图。其中主程序是总的控制程序,主要实现各单元初始化、控制采样和中断等;A/D转换程序主要完成采样启动、数据保存等功能;串行通信程序则用来在有上位PC通过串行口发送数据到单片机时引发中断响应,也可通过PC机通信地址和本单片机地址是否相符来判断PC机是否和本单片机通信,如果地址相符,则发送A/D采样的结果给上位机,如果不相符,则跳出中断。串行中断和A/D转换部分的程序代码如下:(1)串行中断程序voidserial_io(void)interrupt4using3{uchara;ES=0;a=SBUF;P1=a;//接收到的数据显示到P1口if(a==0x50){TB8=1;//发送的第9位数据send();//发送数据}}(2)A/D转换程序:voidadc0809(void)//把结果放到ad[i]中{uchari;ucharxdata*ad_adr;ad_adr=&IN0;//取得通道0的地址,也为P0口上的地址for(i=0;i8;i++)//处理8个通道,实际系统需处理16路{*ad_adr=0;//启动转换i=i;//等待i=i;i=i;while(ad_busy==1);//查询等待转换结束ad[i]=*ad_adr;//把P0口上的内容赋给ad[i]ad_adr++;//下一通道;IN1、IN2}}程序编写完成后,为了便于和proteus联合仿真,还应当在工程目录下生成一个.hex文件。2.2proteus仿真一般情况下,个人配备单片机实验开发系统的成本较高,很多人无法承受。而且一般单片机的实验箱都是成品,学习者很难参与到其中的细节设计中去,动手能力也难以得到训练与提高。Proteus的出现恰好解决了这个矛盾。利用proteus可以随时搭建一个单片机应用系统,并对其进行仿真。proteus仿真软件包含两个应用程序,其中proteus_isis主要用于电路原理图的仿真,另外一个就是proteus_ares,用于直接将proteus_isis的仿真原理图生成pcb。本任务只涉及仿真,所以只用到proteus_isis。操作时,首先应建立一个新的工程文件,然后按照硬件原理图绘制仿真电路。Proteus的仿真电路设计如图7所示。2.3串口通信仿真本设计仿真可在一个PC机上完成,但要用到串口仿真软件。虚拟串口工具VSPDXP就是一个虚拟串口软件,可模拟物理串口,而且使用比较简单。通信时,只要COM3发送数据,COM4就会收到,而COM4发送数据,COM3也会收到。串口调试软件有很多种,还有串口调试助手等。本设计选用ComMonitorV2.0作为串口调试软件。虚拟串口工具VSPDXP中COM3和COM4是一对虚拟串口,可以互相通信。本设计把proteus设置为COM3,把ComMonitor设置为COM4,然后在两者之间进行数据传输。对ComMonitor设置的方法如下:(1)在左上角设置串口号和波特率,并打开串口;(2)接收数据控制区设置的是十六进制显示,自动清空;(3)发送区有三个,都选择为十六进制显示,分别写入“50”,“12”和“45”,其中“50”是本设计中单片机系统的地址,“12”和“45”是随意的两个数据(做测试用)。2.4仿真结果分析在proteus中点击界面左下角的仿真运行按钮使系统开始工作,然后在ComMonitor中依次发送三个发送区的预设数值,之后便可以看到运行结果:(1)发送“50”时,由于和单片机地址相符合,根据程序设定,把A/D采样结果通过串行口发送给了主机,即COM4端。(2)发送“12”和“45”时,单片机接收也同上面一样,并分别显示。(3)三次发送数据,COM分别收到不同的数据。实际上,在发送“12”和“45”时,单片机应该不送回数据,但为了仿真结果清晰,本程序中设置了收到除“50”以外的数据回送功能,以便把收到的数据再发回去,这样,COM4就会依次收到“12”和“45”。3结束语本文从工程角度出发,详细介绍了基于AT89C51单片机的数据采集系统所需的硬件电路配置以及相关的程序设计,同时用基于Proteus和Keil接口的单片机外围硬件电路构成了一个实用的数据采集系统。所得出的仿真结果完整地展示了一个单片机系统新的开发思路。参考文献[1]李晓风,等.基于AT89C51单片机总线扩展技术[J].光电子技术与信息,2004,(01).[2]边春远,王志强.MCS-51单片机应用开发实用子程序[M].北京:人民邮电出版社,2005.[3]范风强,兰婵丽.单片机语言C51应用实战集锦[M].北京:电子工业出版社,2005.[4]张鑫.单片机原理及应用[M].北京:电子工业出版社,2005.[5]李光飞,李良儿,等.单片机C程序设计实例指导[M].北京:北京航空航天大学出版社,2005.