ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(+),VREF(-)为参考电压输入。 2. ADC0809应用说明
(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。 (2). 初始化时,使ST和OE信号全为低电平。 (3). 送要转换的哪一通道的地址到A,B,C端口上。 (4). 在ST端给出一个至少有100ns宽的正脉冲信号。 (5). 是否转换完毕,我们根据EOC信号来判断。
(6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
2.2 AT89C51单片机
ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式,本题中选用中断接口方式。
由于ADC0809无片内时钟,时钟信号可由单片机的ALE信号经D触发器二分频后获得。该题目中单片机时钟频率采用12MHz,则ALE输出的频率是2MHz,四分频后为500KHz,符合ADC0809对频率的要求。
由于ADC0809内部设有地址锁存器,所以通道地址由P0口的低3位直接与ADC0809的A、B、C相连。通道基本地址为0000H~0007H。其对应关系上面已做介绍。
控制信号:将P2.7作为片选信号,在启动A/D转换时,由单片机的写信号和P2.7控制ADC的地址锁存和启动转换。由于ALE和START连在一起,因此ADC0809在锁存通道地址的同时也启动转换。
在读取转换结果时,用单片机的P3.0产生正脉冲作为OE信号,用来打开三态输出锁存器。
其接口电路如图2-2所示。
图2-2 ADC0809与AT89C51的接口
当8051通过对0000H~0007H(基本地址)中的某个口地址进行一次写操作,即可启动相应通道的A/D转换;当转换结束后,ADC0809的EOC端向8051发出中断申请信号;8051通过对0000H~0007H中的某个口地址进行一次读操作,即可得到转换结果。
2.3 4个共阳7段数码管显示器
共阳极7段LED数码管和共阴极LED数码管结构类似,其引脚配置,如图所示。从图中可以看出7段LED数码管同样由8个发光二极管组成,其中7个发光二极管构成字形“8”,另一个发光二极管构成小数点。
共阳极7段LED数码管的内部结构,如图所示。其中所有发光二极管的阳极为公共端,接+5v电压。如果发光二极管的阴极为低电平的时候,发光二极管导通,该字段发光;反之,如果发光二极管的阴极为高电平的时候,发光二极管截止,该字段不发光。
共阳极7段LED引脚配置 共阳极7段LED结构图
2.4 系统整体工作原理 1 硬件设计 (1)系统构成
该系统主要包括几大模块:数据采集模块、A/D转换模块、控制模块、显示模块、按键模块等。采用AT89C51作为控制模块,ADC0809作为A/D转换模块的核心,ADC0809本身具有8路模拟量输入端口,通过C、B、A,3位地址输入端,能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管的显示采用软件译码动态显示,通过按键模块的操作可以选择8路循环显示,也可以选择某条单路显示。 (2)数据采集电路
数据采集电路是系统的主要组成部分,ADC0809具有8路模拟量输入通道IN0~IN7,通过3位地址输入端C、B、A(引脚23~25)进行选择。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存于ADC0809内部锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2 US宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为A/D转换器,当开始转换时,EOC信号为低电平,经过一段时间,换结束,转换结束信号EOC输出高电平,转换结果存放干ADC0809内部的输出数据寄存器中。引脚9脚为A/D转换数据输出允许控制端OE,当0E为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线DO~D7输出。引脚10为ADC0809的时钟信号输人端CLOCK。在连接时,ADC0809的数据线D0~D7与AT89C51的P1口相连接,ADC0809的地址引脚、地址锁存端ALE、启动信号START、数据输出允许控制端OE分别与AT89C51的P3口相连接,转换结束信号EOC与AT89C52的P3.1相连接。
2 软件设计 (1)主程序
主程序包含初始化部分,调用A/D转换子程序和调用显示子程序。
(2)数据处理子程序
ADC0809转换之后输出的结果是8位二进制数。由公式(1)可知,当ADC0809输出 为(1l1l11111)时,输入电压值V =5.00V{当ADC0809输出为(00000000)时,输入电压值为0.0O0V;当ADC0809输出为(10000000)时,输入电压值V =2.50V。由于单片机进行数学运算时结果只取整数部分,因此当输出为(10000000)时计算出的电压值V =2.OOV,很不准确。为了提高精确度,必须把小数部分保留,具体运算方式如公式(2)。个位:Dout*196/10000 十分位:(Dout*196/1000) 百分位:(Dout*196/100) 千分位:(Dout*196/10) 由此得到较为精确的数值。对上面的硬件部分,按照软件流程框图进行软件设计。用C语言进行程序的编写。
(下面的是C语言程序,最后面几页还有汇编程序及其算法说明,可自己选择)
#include
#define uchar unsigned char sbit P2_0=P2^0;
sbit P2_1=P2^1; //定义数码管位码端口 sbit P2_2=P2^2; sbit P2_3=P2^3;
sbit OE=P3^0; //定义ADC0808端口 sbit EOC=P3^1; sbit ST=P3^2; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6;
uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12};//带小数点的0~5六个 uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0~9十个段码/段码 uchar volt_data; void init();
uchar i; //********************************* //延时子程序
//********************************* void delay(uchar z) {
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
//********************************* //将AD转换输出的数据转换成相应的 //电压值并且显示出来
//********************************* void convert(uchar volt_data) {
P0=table1[volt_data*196/10000]; //AD转换的个位的电压值 P2_0=1; delay(2); P2_0=0;
P0=tab[volt_data*196/1000];
P2_1=1; //显示小数点的后的第一位 delay(2); P2_1=0;
P0=tab[volt_data*196/100]; P2_2=1; //显示小数点的后的第二位 delay(2); P2_2=0;
P0=tab[volt_data*196/10];
P2_3=1; //显示小数点的后的第二位 delay(2); P2_3=0; }
void main() {
uchar volt_data;
init();//初始化子程序 while(1) {
if(i==5) { i=0; ST=0; _nop_();
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库单片机电压采集与显示(2)在线全文阅读。
相关推荐: