当前位置:   article > 正文

ADC0809模数转换与显示

adc0809

ADC0809模数转换与显示


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。

二、代码及详细注释

代码如下(示例):

  1. #include <REGX52.H>
  2. sbit ADDA=P2^0;
  3. sbit ADDB=P2^1;
  4. sbit ADDC=P2^2;
  5. sbit START=P2^5;
  6. sbit EOC=P2^4;
  7. sbit OE=P2^3;
  8. sbit CLOCK=P2^6;
  9. unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,
  10. 0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码表
  11. void Delay10ms() //@12.000MHz延时10ms
  12. {
  13. unsigned char i, j;
  14. i = 20;
  15. j = 113;
  16. do
  17. {
  18. while (--j);
  19. } while (--i);
  20. }
  21. timer0() interrupt 1 // 500KHz
  22. {
  23. CLOCK=!CLOCK;
  24. }
  25. void ADC0809convert()
  26. {
  27. ADDA=1;ADDB=1;ADDC=0;//选通IN3
  28. START=0;
  29. START=1;//上升沿清空ADC0809内部寄存器
  30. Delay10ms();
  31. START=0;//下降沿开始A/D转换
  32. while(EOC==0);//等待转换结束
  33. OE=1;//提供使能信号,锁存转换数据
  34. }
  35. void led_display(unsigned char x)
  36. {
  37. P3=0xf7;//选中个位数码管
  38. P1=led_mod[x%10];//显示个位
  39. Delay10ms();
  40. P3=0xfb;//选中十位数码管
  41. P1=led_mod[(x%100)/10];//显示十位
  42. Delay10ms();
  43. P3=0xfd;//选中百位
  44. P1=led_mod[x/100];//显示百位
  45. Delay10ms();
  46. }
  47. void main()
  48. {
  49. TMOD=0x02;//设置T1定时器为模式二
  50. TL0=0xE8;//设置定时初始值
  51. TH0=0xE8;//设置定时重载值
  52. ET0=1;//允许定时器中断
  53. EA=1;//开总中断
  54. TR0=1;//定时器0开始计时
  55. while(1)
  56. {
  57. ADC0809convert();//模数转换
  58. led_display(P0);//显示转换数据
  59. OE=0;//锁存信号使能端置零,为下次锁存做准备
  60. }
  61. }


总结

在本次实例中,我们学习了ADC0809这款经典的模数转换芯片以及基本使用方法。以此类推,以后,对于某种特殊的模数转换芯片,我们首先要了解该芯片的管脚功能,然后通过分析时序图确定芯片的工作时序,通过工作时序进行硬件连接并且进行软件编程,通过这种思路,我们可以做到触类旁通,以后再遇到类似的芯片,我们都可以正常的使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/754015
推荐阅读
相关标签
  

闽ICP备14008679号