ADC0809模数转换与显示
目录
ADC0809介绍
一、硬件原理图(proteus仿真)
编辑
二、代码及详细注释
代码如下(示例):
总结
ADC0809介绍
ADC0809是CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。该芯片为经典的模数转换芯片,适合初学者学习,认真学习此芯片可以为以后使用其他模数转换芯片打下坚实基础。
其内部结构如图所示
ADC0809内部由8路模拟量开关、通道地址锁存器、8位A/D转换器和三态数据输出锁存器组成。其中IN0~IN7为8路模拟量输入端,可以分别连接8路单端模拟电压信号。ADDA,ADDB,ADDC为通道选择端,ALE为选通控制信号。当ALE有效时,三个选通信号的不同点平组合可选择不同组合。其中ADDC为最高位,ADDA为最低位,例如,当ADDA=0,ADDB=1,ADDC=1时,IN6选通。
ADC0809的时序图如图所示
由时序图可得ADC0809的设计步骤如下
1.设置模拟通道输入端
引脚——ADDA,ADDB,ADDC选择(模拟通道选择地址信号).
2、设置START——启动A/D转换(要求不严格时,我们可以让ALE和START共用一个时钟信号)a.置0——提供上升沿
b.置1——上升沿清空ADC0809内部寄存器
c.置0——下降沿启动A/D转换
3.判断EOC——判断A/D转换是否结束
A/D转换启动后,EOC自动从高电平转化为低电平。A/D转换期间,EOC始终保持低电平。转换结束后,EOC自动从低变成高。
因此我们可以通过判断EOC的值来判断A/D 转换是否结束。
4.OE(输入允许信号)
OE=1时,输出转换得到的数据.
5.D0~D7(A/D转换后的数据输出端)
这样我们就完成了一次A/D转换。
转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。有两种不错的方法供大家参考。
查询方式
A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
一、硬件原理图(proteus仿真)
由于proteus中没有ADC0809,因此我们在此用与其功能完全相同的ADC0808所代替。
由仿真图可得,ADC0808的控制端与P2^0——P2^6相连接,通过软件来控制ADC0808。ADC0808的输出端与单片机的P0口相连接,因此,我们可以通过读取模数转换后P0的值,来获得模数转换所得到的数据。在此需要注意的是,ADC0808的OUT1为数据的最高位,OUT8为数据的最低位!!!
本实例中,我们选通IN3作为模拟信号的输入端,通过一个可变电阻来模拟模拟信号的输入。
仿真结果如图所示
模拟信号输入为0时
模拟信号输入最大时
ADC0809为8位的模数转换芯片,因此,计数的最大量为2^8=256。文章来源:https://www.toymoban.com/news/detail-751549.html
二、代码及详细注释
代码如下(示例):
#include <REGX52.H>
sbit ADDA=P2^0;
sbit ADDB=P2^1;
sbit ADDC=P2^2;
sbit START=P2^5;
sbit EOC=P2^4;
sbit OE=P2^3;
sbit CLOCK=P2^6;
unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码表
void Delay10ms() //@12.000MHz延时10ms
{
unsigned char i, j;
i = 20;
j = 113;
do
{
while (--j);
} while (--i);
}
timer0() interrupt 1 // 500KHz
{
CLOCK=!CLOCK;
}
void ADC0809convert()
{
ADDA=1;ADDB=1;ADDC=0;//选通IN3
START=0;
START=1;//上升沿清空ADC0809内部寄存器
Delay10ms();
START=0;//下降沿开始A/D转换
while(EOC==0);//等待转换结束
OE=1;//提供使能信号,锁存转换数据
}
void led_display(unsigned char x)
{
P3=0xf7;//选中个位数码管
P1=led_mod[x%10];//显示个位
Delay10ms();
P3=0xfb;//选中十位数码管
P1=led_mod[(x%100)/10];//显示十位
Delay10ms();
P3=0xfd;//选中百位
P1=led_mod[x/100];//显示百位
Delay10ms();
}
void main()
{
TMOD=0x02;//设置T1定时器为模式二
TL0=0xE8;//设置定时初始值
TH0=0xE8;//设置定时重载值
ET0=1;//允许定时器中断
EA=1;//开总中断
TR0=1;//定时器0开始计时
while(1)
{
ADC0809convert();//模数转换
led_display(P0);//显示转换数据
OE=0;//锁存信号使能端置零,为下次锁存做准备
}
}
总结
在本次实例中,我们学习了ADC0809这款经典的模数转换芯片以及基本使用方法。以此类推,以后,对于某种特殊的模数转换芯片,我们首先要了解该芯片的管脚功能,然后通过分析时序图确定芯片的工作时序,通过工作时序进行硬件连接并且进行软件编程,通过这种思路,我们可以做到触类旁通,以后再遇到类似的芯片,我们都可以正常的使用。文章来源地址https://www.toymoban.com/news/detail-751549.html
到了这里,关于ADC0809模数转换与显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!