4路模拟信号采集系统Word文件下载.docx
《4路模拟信号采集系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《4路模拟信号采集系统Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
![4路模拟信号采集系统Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/6/b6c445b3-b0c6-4f82-8a23-a033b23aa54d/b6c445b3-b0c6-4f82-8a23-a033b23aa54d1.gif)
2.4控制模块设计4
3、系统软件设计5
3.1系统工作流程5
4、总原理图5
5、调试结果及分析6
7、详细仪器清单7
参考文献8
附录9
设计要求
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
A/D转换芯片
ADC0809
数码管
LED数码管
2个
电阻
1K
若干
三极管
9015
导线
电池
1.5V
3个
参考文献
[1]孙育才.
新型AT89S52系列单片机及其应用.北京:
清华大学出版社,2005
[2]张鑫.单片机原理及应用.北京:
电子工业出版社,2005
[3]万福君潘松峰.单片微机原理系统设计与应用.合肥:
中国科学技术大学出版社,2001
[4]陈家骏郑滔程序设计教程北京:
机械工业出版社,2004
[5]余文俊.8051C语言实习北京:
中国水利水电出版社,2002.
附录
#include<
reg52.h>
#include<
ABSACC.H>
#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<
num;
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转换
while(0==EOC)
//display();
//delay(20);
OE=1;
AD_DATA=P0;
OE=0;
}
/*****************主函数**************/
voidmain()
unsignedintcout=0;
floatc;
unsignedintb=0;
init();
while
(1)
{
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);