2023年数据采集系统实验报告报告.doc
任务要求14路模拟量输入,输入电压范围05V,分辨率8位,转换时间100us,具有显示(数码管)测量结果(用10进制显示直流电压值或交流电压峰值)的功能;21路模拟量输出,用来分别重现4路被采信号的波形(供示波器观测)摘 要本数据采集系统是基于单片机AT89C51来完成的,4路的模拟电压通过通用的8位A/D转换器ADC0809转换成数字信号后,由单片机进行数据处理,并将处理后的数据送LED显示器显示。再经过常用的8位D/A转换器DAC0832将数字数据转换成模拟量,供示波器观测。一、系统的方案选择和论证根据题目基本要求,可将其划为如下几个部分:l 4路模拟信号A/D转换l 单片机数据处理l LED显示测量结果l D/A转换模拟量输出系统框图如图1所示:图 1 单片机数据采集系统框图1、4路模拟信号A/D转换由于被测电压范围为05V,分辨率为8位,转换时间为100us,所以A/D转换部分,本系统选择常用的8路8位逐次逼近式A/D转换器ADC0809。ADC0809芯片有28条引脚,采用双列直插式封装。下面说明各引脚功能。 IN0IN7:8路模拟量输入端。2-12-8:8位数字量输出端。ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。ALE:地址锁存允许信号,输入,高电平有效。 START: AD转换启动信号,输入,高电平有效。 EOC: AD转换结束信号,输出,当AD转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE:数据输出允许信号,输入,高电平有效。当AD转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一5V。 GND:地。 ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 AD转换,之后EOC输出信号变低,指示转换正在进行。直到AD转换完成,EOC变为高电平,指示AD转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。2、单片机数据处理选择美国ATMEL公司的CMOS8位单片机AT89C51,其工作电压为2.76V,具有低电压低功耗性能和高性价比,兼容标准MCS-51指令系统,4Kbytes的PEROM和128bytes的RAM,片内置通用的8位中央处理器(CPU)和Flash存储单元。AT89C51是一种带有4 KB闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,可为很多嵌入式控制系统提供灵活且价廉的方案。所以,本设计采用ATMEL公司的AT89C51作为程序的主控芯片。 AT89C51数据总线是由P0口提供的,P0口本身能以多种方式提供数据总线和地址总线。当ALE输出信号为高电平时,P0将输出的数据锁入总线驱动器中作为地址的低8位,然后和P2送出来的高8位地址一起组成一个完整的16位地址,以寻址到外部的64KB的地址空间。AT89C51的地址总线比较简单(只有3个:RD、WR、PSEN),其中RD是用来读取外部数据内存的控制线,WR是用来写数据到外部数据内存的控制线,PSEN是用来存取外部程序内存的读取控制线。3、LED显示测量结果 这里选择的是广州周立功单片机发展有限公司自行设计的数码管显示驱动及键盘扫描管理芯片ZLG7289B,它可直接驱动 8 位共阴式数码管(或 64 只独立 LED) ,同时还可以扫描管理多达64 只按键。ZLG7289B 内部含有显示译码器,可直接接受 BCD 码或 16 进制码,并同时具有 2 种译码方式。此外,还具有多种控制指令,如消隐闪烁左移右移段寻址等。ZLG7289B采用 SPI 串行总线与微控制器接口,仅占用少数几根 I/O口线。利用片选信号,多片 ZLG7289B 还可以并接在一起使用,能够方便地实现多于 8 位的显示或多于 64只按键的应用。4、D/A转换模拟量输出 在本设计中D/A转换的作用是使得采集处理过的数据通过D/A转换电路后送示波器进行观察。这里选择了DAC0832这一D/A转换器。它是一个8位D/A转换芯片,唯一电源供电,从+5V+15V均可正常工作,其引脚功能说明如下:DI0DI7:数据输入线,TLL电平。 ILE:数据锁存允许控制信号输入线,高电平有效。 CS:片选信号输入线,低电平有效。 WR1:为输入寄存器的写选通信号。 XFER:数据传送控制信号输入线,低电平有效。 WR2:为DAC寄存器写选通输入线。 Iout1:电流输出线。当输入全为1时Iout1最大。 Iout2:电流输出线。其值与Iout1之和为一常数。 RFb:反馈信号输入线,芯片内部有反馈电阻. Vcc:电源输入线 (+5v+15v) Vref:基准电压输入线 (-10v+10v) AGND:模拟地,摸拟信号和基准电源的参考地. DGND:数字地,两种地线在基准电源处共地比较好二、系统的硬件设计本系统硬件电路包括以下几个部分:l AT89C51外围电路(如时钟电路、复位电路等)l AT89C51和ADC0809接口电路l AT89C51和DAC0832接口电路l LED显示电路1、 AT89C51外围电路(如时钟电路、复位电路等)AT89C2051中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAl1和XTAL2分别是该放大器的输入端和输出端,这个放大器与作为反馈元件的片外石英晶体一起构成自己振荡器,外接石英晶体和电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容没有太严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器的稳定性等,这里选用12MHz的石英晶体,电容选用33pF,如图2所示。复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。本设计的时钟电路如图3所示。 图 2 时钟电路 图 3 复位电路2、 AT89C51和ADC0809接口电路AT89C51和ADC0809接口电路如图4所示,START和ALE互连可使ADC0809在接收模拟量路数地址时候启动工作。START的启动信号由89C51的和P2.7经或门U7A产生。平时,START因P2.7高电平而被封锁。ALE的正脉冲使得ADDA、ADDB和ADDC上的地址锁存,选中IN0-IN3路模拟电压送入比较器,这里ADDA、ADDB和ADDC分别和P0.0,P0.1,P0.2连接。EOC线经过反相器和AT89C51的INT1线相连,这里采用中断方式来和ADC0809传送A/D转换后的数字量。为了给OE线分配一个地址,把AT89C51的和P2.7经或门U7B和OE相连。平时,因P2.7为高电平,从而使得OE处于低电平封锁状态。在响应中断时候,单片机执行中断服务程序使得OE变为高电平,从而打开三态输出锁存器,让CPU提取A/D转换后的数字量。ADC0809的时钟CLK由两个D触发器把AT89C51的ALE信号4分频后来得到,如图5所示,如果使用单片机时钟电路选择12MHz的晶振,那么ALE信号的频率为2MHz(12/6),经两个串联D触发器四分频之后,CLK端的频率为500KHz,能够满足ADC0809要求。图 4 AT89C51和ADC0809接口电路图 5 时钟分频电路3、 AT89C51和DAC0832接口电路图 6 AT89C51和DAC0832接口电路AT89C51和DAC0832接口时,可以有三种方式:直通方式、单缓冲方式和双缓冲方式。本系统选择单缓冲方式,电路如图6所示。ILE直接接到VCC,允许数字量输入,和由译码器的输出端F7控制,从而控制DAC0832的8位输入寄存器。AT89C51的和DAC0832的连接,直接接地,这样 和之间的延迟可以满足不小于500ns。参考电压直接选择VCC。Rbf作为运算放大器反馈线,接到uA741输出端,Iout1和Iout2接到其输入端。4、LED显示电路LED显示电路如图7所示。图中,VCC和GND之间接入100uF的电容,使得电源更加稳定,通过拉低引脚的方法复位ZLG7289B,四个数码管是共阴式的,至是限流电阻,至是下拉电阻。KC0/DIG0 KC3/DIG3来作为位选信号来选择LED数码管的显示。在这里使用键盘功能,真正实现人机交互,四个按键开关分别控制四路模拟信号的输入。晶振这里选择和单片机同样的晶振,即12MHz。数码管0显示选择通道,数码管1、2、3显示电压峰值。ZLG7289B的CS、CLK和DIO引脚分别接在单片机P1.0、P1.1和P1.2引脚,ZLG7289B的INT接单片机的P3.3,也即中断1,实现模拟信号输入通道的选择。图 7 LED显示电路部分(1)图 8 LED显示电路部分(2)三、系统的软件实现本系统软件包括系统初始化、数据采集与处理,AD转换、DA转换和数据显示几个部分。其中主程序流程图如图8所示,AD转换程序流程图如图9所示,DA转换程序如图10所示。实验源程序见附录2.图 9主程序流程图图 10 A/D转换流程图图 11 键盘控制程序流程图四、电路和程序调试 对电路的调试氛围对硬件的调试和对软件的调试。所以在调试的时候,先检查硬件电路各接线是否正确,有误短路现象,如果有那就要及时改正。软件的调试,首先要在Keil C51上面编译运行通过,由于有中断的缘故,所以中断部分要结合硬件电路进行调试,在这里可以借用实验用Monitor-51仿真器来进行调试,而不是一次次把程序写进单片机进行调试,那样不仅麻烦,而且还有可能写坏单片机。在软件硬件结合起来调试的过程中,要分模块进行调试,比如本实验中,有键盘中断、LED显示、AD转换和DA转换四个大的模块,根据程序流程图,应该依次对上面四个模块分别进行调试检查。调试过程中,要熟悉使用示波器、万用表等工具,硬件部分,上电以后,要用示波器测试晶振是否正常工作,单片机和其他芯片个引脚电位是否正常。软件部分,可以通过Keil C51来观察各特殊寄存器和某些变量的值来验证程序和电路的准确性,也可以设置断点来查看程序的运行路线,比如要查看中断是否执行,就可以在中断服务程序里面设置断点。下面结合本人在调试中遇到的部分问题加以说明。1、LED不显示原因:画原理图时候由于粗心所致,漏画一结点,如图12所示。从而导致SG/KRi(i=07)全部为低电平(示波器测得),而ZLG7289驱动的是共阴式数码管,所以数码管不显示。解决方法:按照图13接通VCC. 图 12 漏结点 图 13原图(节点VCC)2、测试P0口达不到高电平原因:经过查询P0口内部结构,发现P0口是接在两个三极管VT1和VT2之间的,而P1P3口的上部是接一个电阻的。P0口的上面VT1是在进扩展存储器或扩展总线时由指令控制的、平时都是截止的。一般象P00=0P00=1这些语句时控制的都是下面那个三极管的。 P0口接负载P00,VT2导通,P0点电位为0,当P01,VT2截止,而VT1始终是截止的,这样P0点就等于悬空了,P0是高阻抗输入,容易受外界电路干扰 。3、分频信号没有出现原因:这里是采用D触发器实现四分频电路,结果测试分频器输出引脚根本没有出现分频信号,但是单片机ALE输入信号是正常的,问题就出现在D触发器这块,原因如图14所示。由于看到D触发器示意图PR和CLR端有个圆圈,所以就误认为那是接低电平的,所以就不假思索的和地连接起来了,这种毛病得彻底改正啊。于是我重新查看了一下D触发器资料,发现其真值表如下:图 14 D触发器真值表很明显,只有PR和CLR同时为高电平时,D触发器才能正常工作,所以以后在使用某一芯片之前,一定要认真查看其技术资料才行。解决方法:D触发器PR和CLR接VCC,如图15所示。 图 15 D触发器PR和CLR接地 图 16 D触发器PR和CLR接VCC4、EOC始终是高电平原因:EOC始终是高电平,那就说明ADC0809根本就没有启动,而ADC0809是在START和ALE接收模拟量路数地址时候启动工作的。那么问题就出现在这里,原来是地址写错了,经过改正,启动正常,转换结果也正常了。五、实验结果及结论1、AD转换及LED显示结果及结论实验中,通道0,通道1和通道2分别接地、VCC和信号发生器出来的信号,通道0和通道1结果如下:按键通道实际值LED显示值000V(地)0.030115V(VCC)5.001注:LED显示值最后一位表示选择通道。下面表格是通道2结果,该表格适用于频率的范围为5HZ2KHZ,这里选取了100Hz。频率(Hz)100100100100100100100100幅值(V)2.53.03.23.54.04.24.55.0LED2.5023.0323.2123.4723.9624.2924.5324.982注:LED显示值最后一位表示选择通道。2、DA转换及示波器显示结果如图17所示,下面一路是输入信号,上面一路是DA转换输出信号,有图可见,输出波形基本重现了原始输入波形,通过将两者重合,可以发现,相位也比较吻合。图 17 DA转换结果结论:本系统符合任务要求,能够很好的实现AD转换、DA转换以及键盘控制和LED显示。六、实验心得体会从对实验题目的认真分析,到实验方案的设计和论证,从源程序的编写到面包板电路的搭建,还有就是最后实验电路的调试,这一系列过程走下来,可谓是艰辛啊。由于本科期间做的电路实验大部分都是验证性实验,所以就少了设计、制作和调试电路中的所有能遇到的问题,而作为研究生,这些问题在以后的学习研究中必定会经常遇到,正是因为这次训练,才真正提高了自己的发现问题、分析问题和解决问题的能力,这势必给我以后的学习研究带来极大的帮助。 经过这次实验,我发现,电子技术方面的实验或者研究,必须自始至终的细心细心在细心,调试之前一定要一遍一遍又一遍的检查电路,确保电路连线准确无误之后再接电源,否则就可能某些芯片就会被迅速烧坏,从而造成很多麻烦。在调试的时候,要分模块调试,就拿本实验来说,先调试7289按键中断是否起效,数码管显示是否准确,再调AD是否启动,转换是否准确,最后再调DA部分。在这几部分电路模块调试的时候,要学会用示波器或者万用表测各个芯片的各个引脚电平是否正常,时钟电路是否正常,引脚之间会不会有短路现象出现等等,软件部分的调试,要学会单步调试和断点调试,弄清楚程序是否按正常步骤运行,观察各个寄存器和变量的值是否正确,中断是否成功等。还有就是关于电路的设计和调试,切忌眼高手低,一定要多动手,遇到问题要沉着冷静。七、感谢 首先感谢杨栓科老师从始至终的指导和最后调试阶段补开实验室给我,其次感谢师兄师姐们在我调试阶段的指导和帮助,还要感谢实验室徐峥宇和赵同学,在期末考试即将来临的时候,他们还耐心的帮我解决调试中的各种问题。八、参考资料1 胡汉才. 单片机原理及其接口技术. 清华大学出版社,2004.22 孙肖子等. 电子设计指南. 高等教育出版社,2006.13 张齐,杜群贵. 单片机应用系统设计技术基于C语言编程. 电子工业出版社,2004.84 王建校、杨建国、宁改娣、危建国. 51系列单片机及C51程序设计. 科学出版社,2002.45 全国大学生电子设计竞赛组委会. 第五届全国大学生电子设计竞赛获奖作品选编. 北京理工大学出版社,2003.附录1:元件清单器件名称个数器件名称个数AT89C511LED4ADC08091270欧姆电阻8DAC0832110k欧姆电阻2ZLG7289B.11k欧姆电阻1DM74LS74AN2100K欧姆电阻8SN74LS138N1按键开关512MHz晶振233pF电容2DM74LS14N110pF电容374LS022100nF电容1UA741ID1100uF电解电容1导线若干10uF电解电容1备注:调试过程中,本人对部分细节电路进行了更改,额外增加74LS373芯片,而取消使用原来的74LS138,当然也增加了一些电阻。7289电路部分,由于没有100uF电解电容和100nF电容,所以分别用220uF电解电容和220nF电容代替,实验结果证明对电路无大的影响,由于面包板面积有限,而布线相对较多,尤其是7289部分,所以没有用到反相器DM74LS14N,而是使用或非门实现将ADC08509EOC信号的反相。由于7289具有按键防抖功能,按键开关则是使用线头快速接触来实现。由于仿真器上有111.0592M晶振,所以12MHz晶振只用了一个,那就是7289时钟电路。附录2:实验程序#define _SHUJU_C_#include "reg52.h"#include "zlg7289.h"#include "stdio.h"#include "absacc.h"/#define IN0 XBYTE0X7FF8 /通道0#define IN1 XBYTE0X7FF9 /通道1#define IN2 XBYTE0X7FFA /通道2#define IN3 XBYTE0X7FFB /通道3#define dac0832Addr 0XBFFF /DAC0832地址#define uchar unsigned char#define uint unsigned int/ uint ADCFlag; /ADC处理标志 uchar DigitalDataTemp; /转换结果uint KeyValue; /按键键值uint Key; /按键键值uchar MaxResult; /峰值uchar xdata *nCurrentAddr; /当前ADC通道的地址uchar LEDDisplayData; /LED显示的峰值数据uint display100; /显示最高位 uint display10; /显示中间位uint display1; /显示最低位uint i;/sbit ad_busy=P13;static uchar xdata result512; /存贮AD转换结果void Delay(uint i);main() IT0=0;IT1=0;EX0=1; /外部中断0开启EX1=1; /开启外部中断1PX1=1;EA=1; /开启总中断ZLG7289_Init(20); /ZLG7289初始化 KeyValue=0xFF; /设置按键初值,0xFF表示没有按下 Key=0; /按键中断标志位,0:无键按下,1:有键按下 ADCFlag=0; /AD转换结束标志,1:转换结束,0:转换没结束 display100=0; display10=0; display1=0; / while(Key=0) /等待键盘中断,启动ADC0809 while(1)MaxResult=0; for(i=0;i<512;i+)*nCurrentAddr=KeyValue;Delay(8);resulti=*nCurrentAddr; /读取转换结果 *(uchar xdata *) dac0832Addr)=resulti;/进行DA转换if(MaxResult<=resulti) /判断最大值函数 MaxResult=resulti; LEDDisplayData=(MaxResult*100)/51; /数值转换 display100=LEDDisplayData/100; display10=(LEDDisplayData%100)/10; display1=(LEDDisplayData%100)%10;ZLG7289_Download(1,3,1,display100); /高位 ZLG7289_Download(1,2,0,display10); /中间位ZLG7289_Download(1,1,0,display1); /低位 ZLG7289_Download(1,0,0,KeyValue); /通道显示/下面为各子程序/void int0() interrupt 0 /外部中断0,中断向量为0003H/ZLG7289键盘中断,读取键盘的值void int1() interrupt 2 /外部中断1,中断向量为0013H Key=1;KeyValue=ZLG7289_Key(); /读取键值 switch(KeyValue) case 0: nCurrentAddr=&IN0; /0809通道0地址 break; case 1: nCurrentAddr=&IN1; /0809通道1地址 break; case 2: nCurrentAddr=&IN2; /0809通道2地址 break; case 3: nCurrentAddr=&IN3; /0809通道3地址 break; default: Key=0; break;/void Delay(uint j) uint i; for(i=0;i<j;i+);/