4路模拟信号采集系统

  • 格式:doc
  • 大小:421.00 KB
  • 文档页数:17

单片机开发与设计工程师考试文档学校:湖南人文科技学院题目:4路模拟信号采集系统学生姓名: 陈自斌易颂文起止日期:2010-6-15~2010-6-25摘要本次设计是建立一个四路模拟信号采集系统,能处理模拟信号(0~5V),同时对信号进行循环采样并通过键盘控制输出。

它主要由A/D转换模块、单片机、显示模块、控制器模块组成。

其中最主要的部分是单片机和A/D转换器,首先被测模拟信号通过A/D转换器转换成数字信号,然后通过单片机的处理,在数码管上不停的显示4路的采样数据,通过的给一个控制信号,可以选择的任意一路信号在数码管上面输出显示。

关键词:A/D转换模块;单片机;控制模块目录设计要求 (1)1、方案 (1)2、单元电路设计 (2)2.1A/D转换模块 (2)2.2单片机 (3)2.3显示模块 (3)2.4控制模块设计 (4)3、系统软件设计 (5)3.1系统工作流程 (5)4、总原理图 (5)5、调试结果及分析 (6)7、详细仪器清单 (7)参考文献 (8)附录 (9)4路模拟信号采集系统设计要求1.4路模拟量输入,范围0-5V;2.对4个通道的模拟量进行巡回采样,再将采集的数据进行工程量转换;3.能通过按键切换所选通道;4.数据在LED显示器上显示,并能够通过键盘操作切换显示不同通道的采样值。

1、方案此方案以单片机STC89C52为核心,对四路模拟信号进行循环采样输出。

首先,信号通过一个A/D转换模块把模拟信号转换成数据信号,在通过STC89C52和8255的控制,由按键控制选择一路信号在LED数码管上显示。

4路模拟信号采集系统原理框图如图1所示:图1 系统方框图2、单元电路设计2.1 A/D转换模块A/D转换模块我们采用的ADC0809芯片,设有一路信号巧(0V~5V)从ADC0809的INo通道输入,地址输人端A、B、C均接地,这时1No的通道地址为OOH。

0809W、RD共同组成是8位ADC,对0V~,5V的信号,其转换精度为20mV/级。

P27和RADC0809的口地址和启动转换控制信号。

当P27=0时,指定ADC0809的口地址为W来到时,0809的ALE在脉冲的上升沿锁存地址信号,START 0EFFFH;当STC89C52的R在脉冲的高电平启动A/D转换。

在转换结束后EOC输出高电平,转换后的数字量锁存在0809内部的三态输出锁存器中。

当输出允许信号OE为高电平时,转换结果经数据线D7`~D0输出[2]。

如图2所示:图2 A/D0809芯片2.2单片机这个设计的核心我们采用的是STC89C52芯片,P0口作为数据总线和地址总线,首先,当模拟信号输入时,P0口作为数据总线对数据进行输入,其后在把数据传给8255时此时P0口作为一个地址总线。

P2作为ADC0809的控制端口。

P1作为流水灯控制口[1]。

如图3 所示。

图3主控芯片2.3显示模块它主要由8255和LED数码管组成,通过8255上的PA口和PB口控制数码管,数码管由8段组成,分别为A,B,C,D,E,F,G,H,PA口作为一个位选信号,而PB口作为一个段选信号。

当PA口为低电平时就选择这一位。

如图4所示:图4 LED数码管2.4 控制模块设计利用STC89C52的外部中断0对信号进行切换,INTO为一个下降沿触发。

每按一次键,就产生一次中断,因为此时P10,P11口连接ADC0809的A,B口,按键一次对P1口进行加1赋值,所以我们可以通过观测二极管的亮灭判断我们选择哪路信号。

如图5所示:图5 控制和复位3、系统软件设计3.1 系统工作流程程序开始运行时,我们先将它进行初始化,当数据输入后对4个通道的模拟量进行巡回采样,再将采集的数据进行工程量转换,在数码管管上显示出来,通过外部的中断实现信号的切换。

图6系统工作流程4、总原理图U1为单片机STC89C52,U2为芯片8255,复位按键与开始按键分别接到单片机的P3.2、P3.3脚,单片机的P0.0-P0.7脚接8255芯片D0-D7脚,8255的PA0-PA5分别接6个数码管的位选,PB0接数码管引脚11, PB1接数码管引脚10, PB2接数码管引脚7, PB3接数码管引脚1, PB4接数码管引脚2, PB5接数码管引脚3,PB6接数码管引脚4, PB7接数码管引脚5。

P2.2 与ADC0809的ALE连接,P2.3连接OE,P3.4连接EOC[3]。

如图7所示:图7 总原理图5、调试结果及分析本设计主要是在编写的程序编译通过后[4],用下载软件将编写的程序下载到实验开发板上,验证结果是否满足设计要求。

主要通过按键部分进行控制,通过数码管和LED灯部分进行观察。

当把程序下载到开发板以后,接通电源,单片机开始工作,输入模拟信号,此时我们可以看到在数码管上数据进行循环采集,当我们按下外部中断0的时候停止对数据的采集,数码管显示当前的数据。

再次按下后,则对第2路信号进行循环采集。

依此可以对4路数据进行采集。

7、详细仪器清单表1元器件及仪器设备明细表参考文献[1] 孙育才. 新型AT89S52系列单片机及其应用.北京:清华大学出版社,2005[2] 张鑫 .单片机原理及应用.北京:电子工业出版社,2005[3] 万福君潘松峰.单片微机原理系统设计与应用. 合肥:中国科学技术大学出版社,2001[4] 陈家骏郑滔程序设计教程北京:机械工业出版社,2004[5] 余文俊.8051 C语言实习北京:中国水利水电出版社,2002.附录#include <reg52.h>#include<ABSACC.H>#define a8255_PA XBYTE[0xD9FF] /*PA口地址*/#define a8255_PB XBYTE[0xDAFF] /*PB口地址*/#define a8255_PC XBYTE[0xDDFF] /*PC口地址*/#define a8255_CON XBYTE[0xDFFF] /*控制字地址[5]*/ #define uchar unsigned charsbit ST = P2 ^ 7;sbit EOC = P3 ^ 4;sbit OE = P2 ^ 3;sbit CLK = P2 ^ 0;void display(void) ;unsigned char x0,x1, x2, x3;unsigned char choice =0x00;unsigned char dispdata[10] ={0xA0, /*0*/0xBB, /*1*/0x62, /*2*/0x2A, /*3*/0x39, /*4*/0x2C, /*5*/0x24, /*6*/0xBA, /*7*/0x20, /*8*/0x28 /*9*/};unsigned char const dis_table[16]={0xA0, /*0*/0xBB, /*1*/0x62, /*2*/0x2A, /*3 */0x39, /*4*/0x2C, /*5 */0x24, /*6*/0xBA, /*7*/0x20, /*8*/0x28, /*9 */0x30, /*A*/0x25, /*B*/0xE4, /*C*/0x23, /*D */0x64, /*E*/0x74, /*F */};void delay(unsigned int num){unsigned int i = 0;for(i = 0; i<num;i++);}void display_F(unsigned char place,unsigned char num) {unsigned char i = 0,display_num = 0;unsigned int test = 0;a8255_CON=0x89;a8255_PB=0xff;a8255_PA=0xff;delay(100);test =~(0x01<<(place-1));a8255_PA=test;display_num = dis_table[num];a8255_PB=display_num;delay(100);}//0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0}; uchar AD_DATA; //保存void delay1(unsigned int i){while(i--);}/*********系统初始化***********/void init(){EA = 1; //开总中断TMOD = 0x02; //设定定时器T0工作方式TH0 = (65535-65485)/256; //利用T0中断产生CLK信号TL0 = (65535-65485)%256;TR0 = 1; //启动定时器T0ET0 = 1;ST = 0;OE = 0;IT0=1;EX0=1;}/***********T0中断外断0服务程序************/ void t0(void)interrupt 1 using 0{CLK = ~CLK;}int0() interrupt 0{inturpt++;if((intrupt-1)==0xff )intrupt=0xfc;flag=1;delay(100);}else}/***********AD转换函数**********/void AD(){ST = 0;P1=choice; //选择通道delay(2);ST = 1; //启动AD转换delay(2);ST = 0;while (0 == EOC)// display();//delay(20);OE = 1;AD_DATA = P0;OE = 0;}/*****************主函数**************/ void main(){unsigned int cout=0;float c;unsigned int b=0;init();while (1){P1=choice;cout++;if(cout==100){ cout=0;AD();c = (float)AD_DATA ;c = c*5000.0/256.0;b =(unsigned int)c ;x0 = b % 10;x1 = b /10 % 10;x2 = b / 100 % 10;x3 = b / 1000;}display_F(3,x3);display_F(4,x2);display_F(5,x1);display_F(6,x0); }}。