当前位置:文档之家› 模拟量采集实验报告 公昊

模拟量采集实验报告 公昊

模拟量采集的仿真设计报告姓名:公昊学号:201000111025同组者:马振玢实现功能设计一个模拟量采集系统,将所采集的直流电压模拟量显示在LED显示器上,并设置报警上限,当电压超过或等于3V时产生报警信号,并在显示器上闪烁显示电压量大小。

报警信号可以通过按键消除,再次按下时恢复报警。

设计分析该设计就是采集模拟量,通过A/D转换,经过数据处理,用LED 显示器显示数值。

所谓模拟量,可以是温度、光亮度、声音响度、压力等量度,但经感应器转换后,这些模拟量通通能装换成电子量度,如电阻。

所以,为了简单广泛起见,我们统一用电阻所分的电压大小来代表模拟量。

最终的输出量,也就是显示在LED显示器上的量,可以是电压,电流,电阻,功率等,这可以根据不同的计算和转化来调整。

我们采集多路模拟信号,通过扫描用数码管循环显示采集的信号值,并且显示这是第几个采集量。

程序设计设计的软件部分由Keil uVision软件编程和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未结束#include<reg52.h>#include<intrins.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define addo (5.0/255.0)uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//字符码uchar ad[4];uint i,j,flag,k;bit flag1;uint ge[4],shif[4],baif[4],qianf[4],ad1[4];sbit start=P3^6; //ADC0808工作触发sbit oe=P1^1; //ADC0808输出使能sbit eoc=P3^0; //ADC0808转换结束信号sbit adda=P1^5; //采集信号地址选择sbit addb=P1^6;sbit addc=P1^7;sbit ale=P1^4; //0808地址锁存sbit abc=P3^4; //字符码锁存器锁存控制端sbit led1=P3^5; //led片选码锁存器锁存控制端sbit oe1=P1^2; //led片选码锁存器使能sbit speak=P3^3; //蜂鸣器控制sbit oe2=P3^1; //字符码锁存器使能//延时1微秒程序void delay(int t1){unsigned int i;for(i=0;i<t1;i++){;}}//初始中断void initT0(){EA=1;EX0=1;IT0=1;flag1=1;flag=0;}//中断程序void temp() interrupt 0{speak=0;flag1=!flag1;}//信号采集程序void signalacq() //四路信号采集{oe1=1; //led显示器使能关闭oe2=1;for(i=0;i<=3;i++){ale=0;start=0; //ADC0808地址锁存关闭switch(i) //选择采集信号的地址{case 0:{adda=0;addb=0;addc=0;break;}case 1:{adda=1;addb=0;addc=0;break;}case 2:{adda=0;addb=1;addc=0;break;}case 3:{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允许输出关闭}}//采集信号量转换成显示数字void bd(){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时报警void warning(){flag=0;for(i=0;i<=3;i++) //判断是否报警{if(ge[i]>=3)flag=1;}if(flag==0)speak=0;else if(flag1==1)speak=1;}//显示程序void disp1(int k){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;}void main() //主程序{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为高时,这些器件的锁存对于数据是透明的。

相关主题