4路模拟信号采集系统.docx
《4路模拟信号采集系统.docx》由会员分享,可在线阅读,更多相关《4路模拟信号采集系统.docx(12页珍藏版)》请在冰豆网上搜索。
![4路模拟信号采集系统.docx](https://file1.bdocx.com/fileroot1/2023-1/6/b6c445b3-b0c6-4f82-8a23-a033b23aa54d/b6c445b3-b0c6-4f82-8a23-a033b23aa54d1.gif)
4路模拟信号采集系统
单片机开发与设计工程师
考试文档
学校:
湖南人文科技学院
题目:
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.1A/D转换模块
A/D转换模块我们采用的ADC0809芯片,设有一路信号巧(0V~5V)从ADC0809的INo通道输入,地址输人端A、B、C均接地,这时1No的通道地址为OOH。
0809是8位ADC,对0V~,5V的信号,其转换精度为20mV/级。
P27和
、
共同组成ADC0809的口地址和启动转换控制信号。
当P27=0时,指定ADC0809的口地址为0EFFFH;当STC89C52的
来到时,0809的ALE在脉冲的上升沿锁存地址信号,START在脉冲的高电平启动A/D转换。
在转换结束后EOC输出高电平,转换后的数字量锁存在0809内部的三态输出锁存器中。
当输出允许信号
为高电平时,转换结果经数据线D7`~D0输出[2]。
如图2所示:
图2A/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所示:
图4LED数码管
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元器件及仪器设备明细表
名称
型号
数量
单片机
STC89C52
1块
扩展芯片
8255
1块
A/D转换芯片
ADC0809
1块
数码管
LED数码管
2个
电阻
1K
若干
三极管
9015
若干
导线
若干
电池
1.5V
3个
参考文献
[1]孙育才. 新型AT89S52系列单片机及其应用.北京:
清华大学出版社,2005
[2]张鑫.单片机原理及应用.北京:
电子工业出版社,2005
[3]万福君潘松峰.单片微机原理系统设计与应用.合肥:
中国科学技术大学出版社,2001
[4]陈家骏郑滔程序设计教程北京:
机械工业出版社,2004
[5]余文俊.8051C语言实习北京:
中国水利水电出版社,2002.
附录
#include
#include
#definea8255_PAXBYTE[0xD9FF]/*PA口地址*/
#definea8255_PBXBYTE[0xDAFF]/*PB口地址*/
#definea8255_PCXBYTE[0xDDFF]/*PC口地址*/
#definea8255_CONXBYTE[0xDFFF]/*控制字地址[5]*/
#defineucharunsignedchar
sbitST=P2^7;
sbitEOC=P3^4;
sbitOE=P2^3;
sbitCLK=P2^0;
voiddisplay(void);
unsignedcharx0,x1,x2,x3;
unsignedcharchoice=0x00;
unsignedchardispdata[10]=
{
0xA0,/*0*/
0xBB,/*1*/
0x62,/*2*/
0x2A,/*3*/
0x39,/*4*/
0x2C,/*5*/
0x24,/*6*/
0xBA,/*7*/
0x20,/*8*/
0x28/*9*/
};
unsignedcharconstdis_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*/
};
voiddelay(unsignedintnum)
{
unsignedinti=0;
for(i=0;i}
voiddisplay_F(unsignedcharplace,unsignedcharnum)
{
unsignedchari=0,display_num=0;
unsignedinttest=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};
ucharAD_DATA;//保存
voiddelay1(unsignedinti)
{
while(i--);
}
/*********系统初始化***********/
voidinit()
{
EA=1;//开总中断
TMOD=0x02;//设定定时器T0工作方式
TH0=(65535-65485)/256;//利用T0中断产生CLK信号
TL0=(65535-65485)%256;
TR0=1;//启动定时器T0
ET0=1;
ST=0;
OE=0;
IT0=1;
EX0=1;
}
/***********T0中断外断0服务程序************/
voidt0(void)interrupt1using0
{
CLK=~CLK;
}
int0()interrupt0
{
inturpt++;
if((intrupt-1)==0xff)
intrupt=0xfc;
flag=1;
delay(100);
}
else
}
/***********AD转换函数**********/
voidAD()
{
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;
}
/*****************主函数**************/
voidmain()
{
unsignedintcout=0;
floatc;
unsignedintb=0;
init();
while
(1)
{
P1=choice;
cout++;
if(cout==100)
{cout=0;
AD();
c=(float)AD_DATA;
c=c*5000.0/256.0;
b=(unsignedint)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);
}
}