对于ADC0809这种基础的模拟转数字的芯片,在现实生活中是很常用的,所以本人再此讲一讲自己做的心得体会。
首先我们的框架图如下:
接下来我们需要了解ADC0809,其引脚图如下:
其中
1.IN(0~7):代表的是模拟输号输入通道,可以选择(0~7脚)进行采集;
2.ADD(A~C):这3个脚是用来选择模拟通道输入口的,其真值表如下:
3.START:这个引脚是启动ADC0809的当有一个脉冲输入时,ADC0809会开始转换;
4.ALE:这个引脚是用来装载地址的,当有一个正脉冲输入时,所选的ADD(A~C)会装载在芯片里;
5.EOC:这个引脚是输出脚,当ADC0809处如转换期,或者没有工作时处于低电平状态,当芯片转换成功时会变成高电平;
6.2^(-1~-8):这8个脚是输出脚,从MSB到LSB分别对应的是(128,64......1),在程序中只需将其加起来再除以256*(V_REF+)即得所转换的电压;
7.OUTPUT ENABLE:这个引脚是控制输出的引脚,当为低电平时,输出呈高阻态,数据不输出,当为高电平时,数据输出;
8.CLOCK:时钟信号输入脚其范围为(10KHz到640KHz,根据厂家的不同,其最大输入时钟信号也会有所不同);
9.V_REF+:正基准电压,这里我选择5V;
10.V_REF-:负基准电压,这里我们将其接地;
11.VCC:这里我们接+5V;
12.GND:接地。
写程序时,我们需要了解其时序图,时序图如下:
从时序图中可以看出,我们在程序中先写地址,然后装载地址,再启动START,当EOC为高时,启动OUTPUT ENABLE,数据输出,单片机读数据。
从表中可以看出,每个电平的持续时间都是ns级的,51单片机(以12MHz晶振为例),这里我们的机器周期为1us,us<ns,所以在写程序时就不需要进行延时。
其单片机与ADC0809的连接图如下:
其程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit ADDA=P1^0; // 地址A
sbit ADDB=P1^1; // 地址B
sbit ADDC=P1^2; // 地址C
sbit START_ALE=P1^4; // 地址装载,转换启动脚
sbit OE=P1^5; // 输出使能
sbit EOC=P1^6; // 转换标志位
sbit key_start=P3^2; // 开始转换按键
sbit key_end=P3^3; // 停止转换按键
uchar ADC_Date=0;
uint i;
void ADC_START() //ADC转换开始函数
{
START_ALE=1; //一个正脉冲
START_ALE=0;
while(!EOC);
OE=1;
}
void usart_timer_init() //串口初始化,定时器初始化
{
TMOD=0x22; //定时器1,定时器0都设为方式2
TH1=253;
TL1=253;
TH0=131;
TL0=131;
TR1=1; //开定时器1
REN=0; //不开起串口接收
SM0=0; //波特率不加倍,且为方式 1
SM1=1;
EA=1; //开总中断
}
void key_scan() //按键扫描函数
{
if(key_start==0)
{
ET0=1;
TR0=1;
while(1)
{
if(key_end==0)
{
ET0=0;
TR0=0;
break;
}
}
}
}
void main()
{
ADDA=0;
ADDB=0;
ADDC=0;
START_ALE=0;
usart_timer_init();
while(1)
{
key_scan();
}
}
void pick() interrupt 1 //定时器0中断服务函数
{
ADC_START();
ADC_Date=P0;
SBUF=ADC_Date;
while(!TI);
TI=0;
OE=0;
}