模拟量采集实验报告-公昊

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

模拟量采集的仿真设计报告姓名:公昊学号:201000111025同组者:马振玢实现功能设计一个模拟量采集系统,将所采集的直流电压模拟量显示在LED显示器上,并设置报警上限,当电压超过或等于3V时产生报警信号,并在显示器上闪烁显示电压量大小。报警信号可以通过按键消除,再次按下时恢复报警。设计分析该设计就是采集模拟量,通过A/D转换,经过数据处理,用LED显示器显示数值。所谓模拟量,可以是温度、光亮度、声音响度、压力等量度,但经感应器转换后,这些模拟量通通能装换成电子量度,如电阻。所以,为了简单广泛起见,我们统一用电阻所分的电压大小来代表模拟量。最终的输出量,也就是显示在LED显示器上的量,可以是电压,电流,电阻,功率等,这可以根据不同的计算和转化来调整。我们采集多路模拟信号,通过扫描用数码管循环显示采集的信号值,并且显示这是第几个采集量。程序设计设计的软件部分由KeiluVision软件编程和Protues软件模拟仿真。软件编程我们用了比较熟悉的C语言。以下介绍我们的编程:程序流程图启动0808进行模拟量采集采集量转换成电压显示格式判断是否报警(电压大于等于3V时报警)外部键盘产生中断,停止报警初始化中断T0while(1)采集四路信号for(i=0;i=3;i++)选择采集通道IN0~IN3打开0808输出使能,P2口读入存入数组判断转换是否结束(EOC标志)显示四路信号for(i=0;i=3;i++)采集结束结束闪烁显示约1秒持续显示约1秒大于3V未结束#includereg52.h#includeintrins.h#includestdio.h#defineucharunsignedchar#defineuintunsignedint#defineaddo(5.0/255.0)ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//字符码ucharad[4];uinti,j,flag,k;bitflag1;uintge[4],shif[4],baif[4],qianf[4],ad1[4];sbitstart=P3^6;//ADC0808工作触发sbitoe=P1^1;//ADC0808输出使能sbiteoc=P3^0;//ADC0808转换结束信号sbitadda=P1^5;//采集信号地址选择sbitaddb=P1^6;sbitaddc=P1^7;sbitale=P1^4;//0808地址锁存sbitabc=P3^4;//字符码锁存器锁存控制端sbitled1=P3^5;//led片选码锁存器锁存控制端sbitoe1=P1^2;//led片选码锁存器使能sbitspeak=P3^3;//蜂鸣器控制sbitoe2=P3^1;//字符码锁存器使能//延时1微秒程序voiddelay(intt1){unsignedinti;for(i=0;it1;i++){;}}//初始中断voidinitT0(){EA=1;EX0=1;IT0=1;flag1=1;flag=0;}//中断程序voidtemp()interrupt0{speak=0;flag1=!flag1;}//信号采集程序voidsignalacq()//四路信号采集{oe1=1;//led显示器使能关闭oe2=1;for(i=0;i=3;i++){ale=0;start=0;//ADC0808地址锁存关闭switch(i)//选择采集信号的地址{case0:{adda=0;addb=0;addc=0;break;}case1:{adda=1;addb=0;addc=0;break;}case2:{adda=0;addb=1;addc=0;break;}case3:{adda=1;addb=1;addc=0;break;}}ale=1;start=1;//ADC0808在START下降沿触发启动start=0;while(!eoc);//等待转换结束信号oe=1;//ADC0808允许输出ad[i]=P2;//保存采集的模拟量oe=0;//ADC0808允许输出关闭}}//采集信号量转换成显示数字voidbd(){for(i=0;i=3;i++){ad1[i]=(uint)(ad[i]*addo*10000);//将采集信号转化为电压值(乘以1000)ge[i]=(uint)(ad1[i]/10000);//个位和小数点shif[i]=(uint)(ad1[i]/1000%10);//十分位baif[i]=(uint)(ad1[i]/100%10);//百分位qianf[i]=(uint)(ad1[i]/10%10);//千分位}}//报警程序,flag为报警标志,为1时报警voidwarning(){flag=0;for(i=0;i=3;i++)//判断是否报警{if(ge[i]=3)flag=1;}if(flag==0)speak=0;elseif(flag1==1)speak=1;}//显示程序voiddisp1(intk){abc=0;oe1=0;//oe低电平有效led1=1;//led显示器锁存透明P0=0x01;//送入片选码led1=0;oe2=0;//led显示器锁存片选码abc=1;//字符码锁存器透明P0=(table[ge[k]])-128;//显示个位和小数点abc=0;//字符码锁存delay(30);oe2=1;//以下程序内容类似led1=1;P0=0x02;led1=0;oe2=0;abc=1;P0=table[(uint)(shif[k])];//显示十分位abc=0;delay(30);oe2=1;led1=1;P0=0x04;led1=0;oe2=0;abc=1;P0=table[(uint)(baif[k])];//显示百分位abc=0;delay(30);oe2=1;led1=1;P0=0x08;led1=0;oe2=0;abc=1;P0=table[(uint)(qianf[k])];//显示千分位abc=0;delay(30);oe2=1;led1=1;P0=0x20;led1=0;oe2=0;abc=1;P0=table[k];//显示第几路abc=0;delay(30);oe2=1;oe1=1;}voidmain()//主程序{initT0();while(1){signalacq();//信号采集bd();//采集信号量转换成显示数字warning();//电压高于或等于3V时产生报警for(i=0;i=3;i++){for(k=0;k=5;k++){for(j=0;j=50;j++)//重复显示以实现滞留disp1(i);if(ge[i]=3){oe2=1;delay(10000);k=k+1;oe2=0;}}}}}程序介绍:我们的程序主要包括端口定义、延时、中断、信号采集、采集信号转换、报警、显示等模块组成。端口定义模块注释比较清楚不再赘述,中断初始化、延时和中断程序比较简单,这里详细介绍一下信号采集和转换、报警以及显示模块。为实现信号采集,我们先将锁存器的输出使能关闭,使之停止输出,然后进入循环采集,使输出使能关闭。直至等到采集结束才允许输出,并把数据通过P2口赋到ad[i]数组中,用以信号数据转化。ADC0808芯片工作参考电压我们选择的是+5V。我们能采集的数据是0到255的数,每一单位代表5.0/255.0V。要转化成电压值需要计算,乘以ad[i]就得到电压值。我们要用显示器循环显示采集信号,则需要将信号转化为显示数据,所以我们先得到数据的每一位的值。计算个位、十分位、百分位和千分位,为显示做准备。显示时我们需要循环显示4路信号,并且扫描显示。这样我们就进入循环,先允许锁存器输出的信号进入。先送片选后送段选,显示个位和小数点,然后锁存一次。再允许进入,送片选和段选,显示十分位,再锁存,如此循环显示百分位、千分位和第几路。报警程序也比较简单,flag1为报警总开关。初始化中断时,也将flag1置一。通过判断那一路信号电压高于或等于3V将报警次开关flag置一,使之产生报警信号。当要使报警关闭报警关闭,按下按键产生中断执行中断程序,将flag1取反,并使报警关闭,再次按下按键时,报警状态再次打开。以上是我们的几个程序模块,主程序是这样运行的:先初始化中断,然后进入无限循环,采集信号,信号数据转换,判断是否报警,在进入显示循环扫描显示4路信号。其中判断哪一路信号大于或等于3V并使这一路电压量显示闪烁。然后循环显示。这就是我们程序的大体介绍。仿真设计该设计主要由以下几个部分组成:A/D转换(ADC0808)、单片机89C52、锁存器74HC573和数码管显示器。我们的设计思路是先利用ADC0808转换,将四路模拟信号通过单片机的P2口存入,在单片机中经过程序计算,得到显示所用的电压数据量。电压量由P0输出显示信号输入到两个锁存器中。两个锁存器分别锁存位码和段码。经过锁存和扫描输出,在显示器上显示出电压值和第几路信号。同时在单片机上接入报警装置,当电阻增大到一定值时,自动报警,按下停止报警开关,报警停止。下面详细介绍一下电路的各个部分:A/D转换(ADC0808)将滑动变阻器的电压信号输入到IN0~IN3口,数字信号从OUT口输出,用ADDA、ADDB、ADDC控制采集那路信号。A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。START端口在输出下降沿脉冲时,ADC0808触发开始进行AD转换,当转换完成时EOC变成高电平,检测EOC变高后拉高OE,使转换后的8位二进制数从P2口读入储存。将存储的8位二进制数进行转化得到实际电压量的个位,十分位,百分位,千分位。A/D转换(ADC0808)ADC0808的OUT口输出的数字信号,输入到单片机89C52的P2口,通过把P2口得到的数据进行计算后得到需要显示的电压量。处理后的数据信号通过P0口显示在数码管上。单片机89C5274HC573介绍:OE为使能端。LE为锁存控制端:当LE为高时,这些器件的锁存对于数据是透明的。当变低时,数据会被锁存。我们通过扫描显示输出四路信号。显示的基本思路是:首先关闭输出段选码的锁存器(ABCLATCH),打开输出位选码的锁存器(LED1LATCH)给P0口赋值选择输出位,然后LE变低使位选保持。然后打开ABCLATCH,送入段选码。循环扫描显示。可以通过重复循环来实现显示滞留。锁存器74HC573(段选)锁存器74HC573(片选)上面是P1口的上拉电阻。下面是显示器,前四位显示数据,和最后一位显示第几路。从两个锁存器中先后输出到片选和段选,扫描显示四路信号的电压值。在显示时,我们还加入了提示功能,就是当有哪路信号高于或等于3V时,进行闪烁显示用以提示。上拉电阻和数码管显示器全图运行结果在仿真时点击运行,会观察到显示器循环显示四路的电压值,显示器的前四位是电压值,其中第一位后有小数点,所以是X.XXX,然后最后一位显示的是第几路信号。显示结果如下图:还有如果上面哪路显示超过3,显示此数时会闪烁显示。用于提示报警的是哪路超值。除数码管的显示外,运行结果中还有报警环节。当调节电阻时,如果两电阻其中一个的阻值大于3,那么报警装置就会自动报警。若手动按下控制报警的按钮,可以关闭报警。设计中遇到的问题及解决办法1.我开始进行仿真时发现无法进行正常信号采集,发现ADC0808的输出端是高的(显示为红色)。进行反复调试也不能正常,偶然间将采集电压所需的滑动变阻器上的并联电阻去掉后发现信号采集变得正常。原因分析:刚开始在加入滑动变阻器时无意中并联两个电阻而没有在意,结果影响了信号采集,两个电阻的命名上存在重复,使仿真出现问题。得到的教训是进行仿真时要做到布线明确,并且把多余的线去掉,使线路图明了便于分析。2.一开始我们想通过利用8255芯片进行并口

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功