基于51单片机和ADC0809多通道模数转换的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要 (1)
1、方案设计 (2)
2、硬件电路的设计 (2)
2.1单片机的最小系统设计 (2)
2.2 ADC0809模数转换器设计电路 (3)
2.2.1 ADC0809的结构功能 (3)
2.2.2 ADC0809的工作时序 (6)
2.2.3 ADC0809与AT89C52单片机的接口电路 (7)
2.3 LCD1602显示电路 (8)
2.4 键盘与单片机连接电路 (10)
2.5系统整体电路图 (10)
3、软件设计 (11)
4、系统仿真和测试结果 (12)
5、性能分析 (13)
6、心得与体会 (14)
7、参考文献 (14)
附录一:源程序 (14)
附录二:本科生能力拓展训练成绩评定表 (20)
摘要
本文介绍了基于单片机的数据采集的硬件设计和软件设计,数据采集系统是模拟域与数字域之间必不可少的纽带,它的存在具有非常重要的作用。
本文介绍的重点是数据采集系统,而
该系统硬件部分的重心在于单片机。
硬件部分是以单片机为核心,还包括A/D模数转换模块,LCD1602显示模块部分。
8路被测电压通过模数转换器ADC0809进行模数转换,实现对采集到的数据进行模拟量到数字量的转换,并将转换后的数据通过LCD1602显示器来显示所采集的结果,并且可以通过按键来查看任意通路的电压值,整个系统具有操作方便、线路简单、测量误
差小等优点。
关键词:单片机AT89S52、模数转换器ADC0809、数据采集、LCD1602显示器
1、方案设计
根据设计要求,采用的方案如下:硬件部分实现对
8路数据采集和显示的功能,包括
MCS-51单片机、ADC0809、LCD1602;软件部分实现单片机对8路输入数据的采集以及对
LCD1602的显示操作。
主要设计思想:单片机
P1与ADC0809相连,P0与LCD1602连接。
模拟信号通过
IN0
——IN7输入到ADC0809中转换为数字信号,P1获得此值后,经过处理得到每位的数据后,通过P0口写数据到LCD 屏上。
数据采集电路的原理框如图
1所示。
图1 数据采集电路的原理框图
2、硬件电路的设计
2.1单片机的最小系统设计
单片机最小系统是能补足单片机工作的最简单电路,
它由单片机、电源、晶体振荡器、
复位电路等构成。
它是本系统的处理单元也是控制单元,负责处理信号、外设的接口与控制,同时它也是所有软件的载体。
本系统采用AT89C52是美国Atmel 公司生产的低电压、高性能CMOS 8位单片机,片内含8KB 的可反复檫写的程序存储器和12B 的随机存取数据存储器(RAM ),器件采用Atmel 公司的高密度、非易失性存储技术生产,兼容标准
MCS-51指令系统,片内配置通用8位中
央处理器(CPU )和Flash 存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。
AT89C52单片机属于AT89C51单片机的增强型,与Intel 公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。
主要管脚有:
XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接
12MHz 晶振。
模拟输入通道 1
模拟输入通道 2
模拟输入通道8
ADC0809
MCS-51 单片机
LCD1602 显示器
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。
P0~P3 为可编程通用I/O 脚,其功能用途由软件定义。
其管脚如下图2所示:
图2 AT89C52单片机管脚图
本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接。
单片机正常工作时,都需要有一个时钟电路和一个复位电路。
本设计
中选择了内部时钟方式和按键电平复位电路,来构成单片机的最小电路。
如图3所示。
图3 单片机最小系统
2.2 ADC0809模数转换器设计电路
2.2.1 ADC0809的结构功能
本数据采集系统采用计算机作为处理器。
电子计算机所处理和传输的都是不连续的数
字信号,而实际中遇到的大都是连续变化的模拟量,模拟量经传感器转换成电信号后,需
要模/数转换将其变成数字信号才可以输入到数字系统中进行处理和控制,因此,把模拟
量转换成数字量输出的接口电路,即A/D转换器就是现实信号转换的桥梁。
目前,世界上有多种类型的A/D转换器,如并行比较型、逐次逼近型、积分型等。
本文采用逐次逼近型A/D转换器,该类A/D转换器转换精度高,速度快,价格适中,是
目前种类最多,应用最广的A/D转换器。
逐次逼近型A/D转换器一般由比较器、D/A转换器、寄存器、时钟发生器以及控制逻辑电路组成。
ADC0809就是一种CMOS单片逐次逼近式A/D转换器,其内部结构如图4所示。
该芯片由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等电路组成。
因此,ADC0809可处理8路模拟量输入,且有三态输出能力。
该器件既可与各种微处理器相连,也可单独工作。
其输入输出与TTL兼容。
图4 ADC0809内部结构
ADC0809是8路8位A/D转换器(即分辨率8位),具有转换启停控制端,转换时间为100μs采用单+5V电源供电,模拟输入电压范围为0~+5V,且不需零点和满刻度校准,工作温度范围为-40~+85℃功耗可抵达约15mW。
ADC0809芯片有28条引脚,采用双列直插式封装,图5所示是其引脚排列图。
图5 ADC0809的引脚排列图
各引脚的功能如下
IN0~IN7:8路模拟量输入端;
D0~D7:8位数字量输出端;
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路;
ALE:地址锁存允许信号,输入高电平有效;
START:A/D转换启动信号,输入高电平有效;
EOC:A/D转换结束信号,输出当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平);
OE:数据输出允许信号,输入高电平有效。
当A/D转换结束时,此端输入一个高电平才能打开输出三态门,输出为数字量;
CLK:时钟脉冲输入端。
要求时钟频率不高640kHz;
REF(+)、REF(-):基准电压;
Vcc:电源,单一+5V;
GND:地。
ADC0809的工作过程:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用
作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据
总线上。
转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。
数据传
送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
为
此可采用下述三种方式。
(1)定时传送方式
对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。
例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。
可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定
已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。
因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传
送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单
片机接受。
ADC0809工作时,首先输入3位地址,并使ALE为1,以将地址存入地址锁存器中。
此地址经译码可选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位;下降沿则启动A/D转换,之后,EOC输出信号变低,以指示转换正在进行,直到A/D转换完成,EOC变为高电平,指示A/D转换结束,并将结果数据存入锁存器,这个信号也可用作
中断申请。
当OE输入高电平时,ADC的输出三态门打开,转换结果的数字量可输出到数据
总线。
A/D转换器的位数决定着信号采集的精度和分辨率。
对于8通道的输入信号,其分辨率为0.5%。
8位A/D转换器的精度为:0.4%。
2.2.2 ADC0809的工作时序
图6所示是ADC0809的工作时序图。
从该时序图可以看出,地址锁存信号ALE在上升沿将三位通道地址锁存,相应通道的模拟量经过多路模拟开关送到A/D转换器。
启动信号START上升沿复位内部电路,START的下降沿启动转换,此时转换结束信号EOC呈低电平状态,由于逐位逼近需要一定过程,所以,在此期间,模拟输入量应维持不变,比较器要
一次次比较,直到转换结束,此时变为高电平。
若CPU发出输出允许信号OE(输出允许为高电平),则可读出数据。
另外,ADC0809具有较高的转换速度和精度,同时受温度影响也
较小。
图6 ADC0809的工作时序图
2.2.3 ADC0809与AT89C52单片机的接口电路
ADC0809与AT89C52单片机的接口电路如图7所示。
图中,P2.0、P2.1、P2.2 输出的低3位地址加到通道选择端A、B、C,可作为通道编码。
其通道基本地址为0000H~0007H。
输出数据与P0口连接,CLOCK、ALE一起与P2.4相连,START和P2.5连接,EOC与P2.3相连,OE和P2.6相连。
图7 ADC0809与AT89C52单片机接口电路
2.3 LCD1602显示电路
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用
16*1,16*2,20*2和40*2行等的模块。
LCD1602分为带背光和不带背光两种,基控制器
大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。
LCD1602
采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表1所示:
表 1 LCD1602引脚接口说明
编号符号引脚说明编号符号引脚说明
1 VSS 电源地9 D
2 数据
2 VDD 电源正极10 D
3 数据
3 VL 液晶显示偏压11 D
4 数据
4 RS 数据/命令选择12 D
5 数据
5 R/W 读/写选择13 D
6 数据
6 E 使能信号14 D
7 数据
7 D0 数据15 BLA 背光源正极
8 D1 数据16 BLK 背光源负极
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
1602液
晶模块内部的控制器共有11条控制指令,如下表2所示,其中1为高电平、0为低电平。
表 2 LCD1602控制指令
序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 清显示0 0 0 0 0 0 0 0 0 1
2 光标返回0 0 0 0 0 0 0 0 1 *
3 置输入模式0 0 0 0 0 0 0 1 I/D S
4 显示开/关控制0 0 0 0 0 0 1 D C B
5 光标或字符移位0 0 0 0 0 1 S/C R/L * *
6 置功能0 0 0 0 1 DL N F * *
7 置字符发生存贮器地址0 0 0 1 字符发生存贮器地址
8 置数据存贮器地址0 0 1 显示数据存贮器地址
9 读忙标志或地址0 1 BF 计数器地址
10 写数到CGRAM或DDRAM) 1 0 要写的数据内容
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:显示开关控制。
D:控制整体显示的开与关,高电平表示开显示,低电平表
示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是
否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
其操作时序图如下所示:
图8 读操作时序图
图9 写操作时序图
本设计中采用液晶LCD1602显示模数转换器采集到的数据,其D0~D7与单片机的P0端口连接,使能端E、RS、RW分别与单片机P3.1、P3.0、P3.2连接,此电路原理简单,
电路连接方便,如图10所示。
图10 液晶LCD1602显示电路
2.4 键盘与单片机连接电路
本设计中使用了两个独立按键来选择显示对应通道的电压,其中KEY1每按一下通道数就减1并在LCD1602上显示对应通道的电压,KEY2每按一下通道数就加1并在LCD1602上显示对应通道的电压,这样就十分方便查看不同通道的数据。
键盘与单片机的连接电路
如图11所示。
图11 键盘与单片机的连接电路
2.5系统整体电路图
根据上述各个部分的电路,将每个部分的电路在仿真软件PROTUES中连接起来,仔细检查线路后确保无误后就可以得到系统的整体电路图如12所示。
图12 系统整体电路图
3、软件设计
此次设计的多通道数据采集系统设置了8路模拟电压输入通道。
仿真中为了便于调节输入的模拟电压,在输入模拟信号时采用电阻分压,最终的采样输入电压便可根据测试需
要调节,系统总流程图如图13所示:
开始
系统初始化
A/D数模转换
N
有键按下?
Y
选择对应的通道
LCD1602显示
图13 系统流程图
4、系统仿真和测试结果
根据方案设计结果,进行了硬件电路在Proteus下的仿真。
当通过电位器调节AD转换器输入端的电压时,模拟电压值经过AD转换后,经由单片机将转换后的电压值发送至
P0口,供LCD进行显示。
仿真过程描述:通过KEIL软件对所编程序进行编译,生成.hex文件,在PROTUES软件中,用MCS51单片机调用.hex,即可进行硬件的仿真。
该仿真包括两部分:
1.对8路电压进行采集,经由AD转换器进行转化,转化后的16进制数存于单片机的内部存储器中。
2.对转换后的电压进行显示。
将内部存储器中存储的转化后的电压对应的16进制数付给P0口,由LCD进行显示。
调节电位器LCD的显示数据也会发生变化。
仿真数据如下图所示:
图14 通路1数据采集结果
图15 通路2数据采集结果
图16 通路3数据采集结果
图17 通路4数据采集结果
图18 通路5数据采集结果
图19 通路6数据采集结果
图20 通路7数据采集结果
图21 通路8数据采集结果
5、性能分析
根据上述仿真结果图14至图21可以得到:8路模拟通道电压值分别设置为0.05V、0.85V、1.50V、2.30V、3.05V、3.70V、4.25V、5.00V。
经过系统处理,LCD1602显示的采集值分别为0.05V、0.84V、1.50V、2.29V、3.05V、3.70V、4.25V、5.00V。
系统误差为小于0.01。
如果想看到某一路的数据采集值,可以通过按键KEY1、KEY2来调节,这样就方便查看。
综上所述:通过用PROTUES软件的仿真发现此次设计的系统原理图能够实现电压的正
确测量,而且电压的误差极小,LCD1602液晶屏能够正确显示出8路电压测量结果。
整个作品能较好的实现基本功能和扩展功能。
6、心得与体会
7、参考文献
附录一:源程序#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
/********************定义LCD1602接口信息********************************/ sbit lcdrs=P3^0;//数据命令选择位
sbit lcden=P3^1;//使能位
sbit lcdrw=P3^2;
/********************定义ADC0808接口信息********************************/ sbit ADA=P2^0;
sbit ADB=P2^1;
sbit ADC=P2^2;
sbit EOC=P2^3;
sbit CLK=P2^4;
sbit START=P2^5;
sbit OE=P2^6;
/*****************键盘管脚定义*************/
sbit key1=P3^3;
sbit key2=P3^7;
/*********************定义数据********************************/
uchar tab1[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};
//存放AD采集数据
uchar tab2[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};
uchar tab3[]="TONGLU:";
uchar tab4[]="DIANYA:";
uchar tab5[]="12345678";
uchar num,m=0,getdata=0;
uint temp=0;
/*延时函数*/
void delay(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
void delayl(uchar ltime)
{
uchar i;
for(i=ltime;i>0;i--)
delay(255);
}
/*写命令函数*/
void write_com(uchar com) {
lcdrs=0;
P0=com;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
/*写数据函数*/
void write_data(uchar date) {
lcdrs=1;
P0=date;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void disp(uchar h,l,uchar *p) {
write_com(0x80+h*0x40+l);
while(*p!='\0')
{
write_data(*p);
p++;
}
}
/*初始化函数*/
void LcdInit()
{
lcdrw=0;
delay(5);
lcden=0;//使能位置低电平
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delayl(20);
}
void TimeInit()
{
TMOD=0x10;//定时器1工作于方式1,16位不重装初值
TH1=(65536-200)/256; //定时200us(5KHz)
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}
void AdTr(bit ADDA,ADDB,ADDC,uchar channel)
{
START=0;
OE=0;
START=1;
START=0;//A/D转换启动信号,正脉冲启动选中的模拟信号开始转换
ADA=ADDA;
ADB=ADDB;
ADC=ADDC;
delay(5);
while(EOC==0);//启动转换后EOC变为L,转换结束后变为H
OE=1;
getdata=P1;
temp=getdata*1.0/255*500;
OE=0;
if(channel<4)
{
tab1[4*channel]=temp/100+0x30;
tab1[4*channel+2]=(temp%100)/10+0x30;
tab1[4*channel+3]=(temp%100)%10+0x30;
}
if(channel>=4)
{
channel=channel-4;
tab2[4*channel]=temp/100+0x30;
tab2[4*channel+2]=(temp%100)/10+0x30;
tab2[4*channel+3]=(temp%100)%10+0x30;
}
}
void keyscan()/* 按键2进行减1*/
{
uint k;
if(key1==0)
{
m--;
if(m<5)
{
write_com(0x80+0x07);
write_data(tab5[m-1]);
write_com(0x80+0x47);
for(k=0;k<4;k++)
write_data(tab1[4*(m-1)+k]);
}
if(m>=5&&m<9)
{
write_com(0x80+0x07);
write_data(tab5[m-1]);
write_com(0x80+0x47);
for(k=0;k<4;k++)
write_data(tab2[4*(m-5)+k]);
}
if(m==1)m=1;
}
while(key1==0); //等待按键释放 if(key2==0)
{
m++;
if(m<5)
{
write_com(0x80+0x07);
write_data(tab5[m-1]);
write_com(0x80+0x47);
for(k=0;k<4;k++)
write_data(tab1[4*(m-1)+k]);
}
if(m>=5&&m<9)
{
write_com(0x80+0x07);
write_data(tab5[m-1]);
write_com(0x80+0x47);
for(k=0;k<4;k++)
write_data(tab2[4*(m-5)+k]);
}
if(m==9)m=0;
}
while(key2==0); //等待按键释放 }
void main()
{
LcdInit();
TimeInit();
while(1)
{
AdTr(0,0,0,0);
delay(5);
AdTr(0,0,1,1);
delay(5);
AdTr(0,1,0,2);
delay(5);
AdTr(0,1,1,3);
delay(5);
AdTr(1,0,0,4);
delay(5);
AdTr(1,0,1,5);
delay(5);
AdTr(1,1,0,6);
delay(5);
AdTr(1,1,1,7);
delay(5);
disp(0,0,tab3);
disp(1,0,tab4);
keyscan();
}
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}
附录二:
本科生能力拓展训练成绩评定表
姓名性别
专业、班级
题目:基于AD转换模块的单片机仿真和C语言开发任务书
答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日。