多参数实时采集与处理系统的模拟设计Word文档格式.docx
《多参数实时采集与处理系统的模拟设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《多参数实时采集与处理系统的模拟设计Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
ADC0809的内部结构框图见图2。
由图2可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;
下跳沿时,开始进行A/D转换;
在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;
否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;
OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
2.251单片机介绍
51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
51单片机即是基础入门的一个单片机,还是应用最广泛的一种。
·
8位CPU·
4kbytes程序存储器(ROM)(52为8K)
·
256bytes的数据存储器(RAM)(52有384bytes的RAM)
32条I/O口线·
111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器·
5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·
双列直插40PinDIP封装
单一+5V电源供电
CPU:
由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:
用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:
用以存放程序、一些原始数据和表格;
I/O口:
四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:
两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
最高振荡频率为12M。
2.3ADC0809与51单片机的接口电路
2.4ZLG7290介绍
ZLG7290的核心是一块ZLG7290B芯片,它采用I2C接口,能直接驱动8位式数码管,同时可扫描管理多达64只按键,实现人机对话的功能资源十分丰富。
除具有自动消除抖动功能外,它还具有段闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能,并可提供10种数字和21种字母的译码显示功能,用户可以直接向显示缓存写入显示数据,而且无需外接元件即可直接驱动数码管,还可扩展驱动电压和电流。
此外,ZLG7290B的电路简单,使用也很方便。
用户按下某个键时,ZLG7290的INT引脚会产生一个低电平的中断请求信号,读取键值后,中断信号就会自动撤销。
正常情况下,微控制器只需要判断INT引脚就可以得到键盘输入的信息。
微控制器可通过两种方式得到用户的键盘输入信息。
其一是中断方式,该方式的优点是抗干扰能力强,缺点是要占用微控制器的一个外部中断源。
其二是查询方式,即通过不断查询INT引脚来判断是否有键按下,该方式可以节省微控制器的一根I/O口线,但是代价是I2C总线处于频繁的活动状态,消耗电流多并且不利于抗干扰。
ZLG7290能够直接驱动8位共阴式数码管(或64只独立的LED),同时还可以扫描管理多达64只按键。
其中有8只按键还可以作为功能键使用,就像电脑键盘上的Ctrl、Shift、Alt键一样。
另外ZLG7290B内部还设置有连击计数器,能够使某键按下后不松手而连续有效。
采用I2C总线方式,与微控制器的接口仅需两根信号线。
可控扫描位数,可控任一数码管闪烁。
3系统软件设计
3.1系统软件框图:
3.2程序:
#include<
reg51.h>
ZLG7290.h>
sbitCLK=P1^3;
sbitEOC=P1^2;
sbitOE=P1^1;
sbitST=P1^0;
sbitALE=P1^4;
sbitADDA=P1^5;
sbitADDB=P1^6;
sbitADDC=P1^7;
unsignedintAD_DATA0[100]
unsignedchardelay_1s,delay_5s;
//flag为显示标志位,0为显示通道0,1为显示通道1
/*初始化*/
voidinit()
{
CLK=0;
EA=1;
//开中断
TMOD=0x11;
//设置定时/计数器1和定时/计数器0为方式1
TH0=(65535-199)/256;
//利用T0产生CLK信号
TL0=(65535-199)%256;
TH1=(65535-49999)/256;
//利用T1产生50ms中断
TH0=(65536-49999)%256;
ET1=1;
ET0=1;
TR1=1;
//启动定时器T1
TR0=1;
//启动定时器T0
ST=0;
OE=0;
//关闭输出三态门
}
/*T0中断*/
voidt0(void)interrupt1
{
CLK=~CLK;
/*T1中断*/
voidt1(void)interrupt2
delay_1s--;
//初值为20,定时器T150ms中断一次
delay_5s--;
//delay--;
/*主函数*/
voidmain()
unsignedchara,b,c,d;
unsignedchari,j,flag;
unsignedintAD_DATA1[20],DATA;
delay_1s=20;
delay_5s=100;
//delay=100;
flag=0;
i=0;
j=0;
//保存最新采集的100次数据
init();
//51初始化
SystemInit();
//ZLG7290初始化
while
(1);
if(delay_1s==0)//通道0采集数据
ADDA=0;
ADDB=0;
ADDC=0;
ALE=1;
ST=1;
ST=0;
while(EOC==0);
OE=1;
//打开三态门
AD_DATA0[i]=P2;
//P2口接D0—D7(数据输入口)
i++;
if(i==100)
{
i=0;
}
delay_1s=20;
if(delay_5s==0)//通道1采集数据
ADDA=1;
AD_DATA1[j]=P2;
j++;
if(j==20)
j=0;
delay_5s=100;
/*传送给7290显示*/
if(flag==0&
&
delay_5s==0)
{DATA=AD_DATA0[i]*16*20/10;
a=DATA/1000;
b=DATA/100%10;
c=DATA/10%10;
d=DATA%10;
ZLG7290_SegOnOff(0x60,a);
ZLG7290_SegOnOff(0x61,b);
ZLG7290_SegOnOff(0x62,c);
ZLG7290_SegOnOff(0x63,d);
//将通道0数据给7290
flag=1;
if(flag==1&
DATA=AD_DATA1[j]*16*20/10;
//将通道1数据给7290
flag=0;
}
4参考资料
《计算机控制技术》于海生
《单片机原理及接口技术》段晨东
《ADC0809手册》
5课程设计总结