基于AD转换的单片机实验和C语言开发Word格式文档下载.docx
《基于AD转换的单片机实验和C语言开发Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于AD转换的单片机实验和C语言开发Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
2.351单片机简介
单片微型计算机(Single-ChipMicrocomputer),简称单片机。
就是将微处理器(CPU)、存储器(存放程序或数据的ROM和RAM)、总线、定时器/计数器、输入/输出接口(I/O口)和其他多种功能器件集成在一块芯片上的微型计算机。
本次课程设计选用的是MCS-51系列单片机中的89C51。
MCS-51单片机包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时器/计数器、并行I/O接口、串行I/O接口和中断系统等几大单元。
其内部结构框图如图2.2所示。
图2.251内部系统结构
2.4ADC0809简介
ADC0809是8位逐次逼近式A/D转换器。
其内部有一个8通道多路模拟开关,片内带有三态输出缓冲器,可直接与单片机的数据总线相连接。
它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
2.4.1ADC0809内部结构
ADC0809的内部结构如图2.3所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
图2.3ADC0809内部结构
各部分功能及作用:
IN0~IN7:
8路模拟通道信号输入,通过模拟开关实现8路模拟输入信号分时选通。
ADDC,ADDB和ADDA:
模拟通道选择,编码000~111分别选中IN0~IN7。
ALE:
地址锁存信号,其上升沿锁存ADDC,ADDB,ADDA信号,译码后控制模拟开关,接通8路模拟信号中相应的一路。
CLK:
输入时钟,为A/D转换器提供转换的时钟信号,典型工作频率640HZ。
START:
A/D转换启动信号,正脉冲启动ADDC~ADDA选中的一路模拟信号开始转换。
OE:
输出允许信号,高电平时打开三态输出缓存器,使转换后的数字量从D0~D7脚输出。
EOC:
转换结束信号,启动转换后,EOC变为低电平,转换完成后变为高电平。
根据读入转换结果的方式,此信号可有三种方式和单片机相连。
1)延时方式:
EOC悬空,启动转换后,延时100us后读入转换结果。
2)查询方式:
EOC接单片机端口线,查得EOC变高,读入转换结果,作为查询信号。
3)中断方式:
EOC经非门接单片机的中断请求端,转换结果作为中断请求信号向单片机提出中断申请,在中断服务中读入转换结果。
Vref(+)和Vref(-):
基准电压输入,用于决定模拟电压的范围。
允许Vref(+)和Vref(-)是差动的或不共地的电压信号,多数情况下,Vref(+)接+5V,Vref(-)接GND,此时输入量程为0~5V。
当转换精度要求不高或电源电压Vcc较稳定和准确时,Vref(+)可以接Vcc,否则应单独提供基准电源。
2.3.2ADC0809的工作过程
首先输入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信号即有效,把转换数据送上数据总线,供单片机接受。
3多路模拟信号采集模块设计
3.1功能简介
使用ADC0809型号的A/D转换器对多路模拟信号进行数据采集,同时与单片机进行通信,将测量的模拟信号量传递给89C51单片机,由单片机进行运算,输出对应的数字量,然后在数码管上显示出来。
设计中采用开关来选择输入不同通道的模拟信号。
3.2总原理图
图3.1多通道数据采集总原理图
3.2.1单片机电路
单片机最小系统如下图所示,各个引脚都已经标出。
图3.2单片机最小系统
其中,振荡电路以及复位电路均由单片机系统自带。
3.2.2ADC采样电路
图3.3ADC模数转换
3.2.3显示模块
本次设计采用数码管来显示数据。
图3.4数码管
3.3系统流程图
图3.5系统流程图
4程序代码
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/********************定义LCD1602接口信息********************************/
sbitlcdrs=P3^0;
//数据命令选择位
sbitlcden=P3^1;
//使能位
sbitlcdrw=P3^2;
//LCD1602数据线接P0口
/********************定义ADC0808接口信息********************************/
sbitADA=P2^0;
sbitADB=P2^1;
sbitADC=P2^2;
sbitEOC=P2^3;
sbitCLK=P2^4;
sbitSTART=P2^5;
sbitOE=P2^6;
/*********************定义数据********************************/
ucharstring1[]="
XuzhiqiangADSp"
;
//初始化数据
ucharstring2[]="
Chanfrom1to8"
uchartab[]="
0.00.00.00.0"
//存放AD采集数据
uchartab1[]="
ucharnum,getdata=0;
uinttemp=0;
/*延时函数*/
voiddelay(uchart)
{
ucharx,y;
for(x=t;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelayl(ucharltime)
uchari;
for(i=ltime;
i>
i--)
delay(255);
/*写命令函数*/
voidwrite_com(ucharcom)
lcdrs=0;
P0=com;
delay(10);
lcden=1;
lcden=0;
/*写数据函数*/
voidwrite_data(uchardate)
lcdrs=1;
P0=date;
voiddisp(ucharh,l,uchar*p)
write_com(0x80+h*0x40+l);
while(*p!
='
\0'
)
{
write_data(*p);
p++;
}
/*初始化函数*/
voidLcdInit()
lcdrw=0;
delay(5);
//使能位置低电平
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
disp(0,0,&
string1[0]);
disp(1,0,&
string2[0]);
delayl(20);
voidTimeInit()
{
TMOD=0x10;
//定时器1工作于方式1,16位不重装初值
TH1=(65536-200)/256;
//定时200us(5KHz)
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
voidAdTr(bitADDA,ADDB,ADDC,ucharchannel)
START=0;
OE=0;
START=1;
//A/D转换启动信号,正脉冲启动选中的模拟信号开始转换
ADA=ADDA;
ADB=ADDB;
ADC=ADDC;
while(EOC==0);
//启动转换后EOC变为L,转换结束后变为H
OE=1;
getdata=P1;
temp=getdata*1.0/255*50;
if(channel<
4)