找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9844|回复: 7
收起左侧

51单片机驱动ADC0809 A/D转换器实现数字电压表实例

  [复制链接]
ID:138707 发表于 2018-6-10 10:52 | 显示全部楼层 |阅读模式
图片1.jpg
ADC0809工作原理:
ADDA/ADDB/ADDC 输入3位地址,并使ALE=1,将地址存入地址锁存器中
ALE:地址锁存允许信号接入端,高电平时允许改变CBA的值,低电平时锁死,防止在A/D转换过程中切换通道
地址经译码选通8路模拟输入IN0~IN7之一到比较器,输入与被选通道关系
图片2.png
· START端上升沿将逐次逼近寄存器复位,下降沿启动A/D转换
· EOC输出信号变低电平,表示正在转换;当A/D转换完成,EOC变为高电平,结果数据已存入锁存器。
·
· OE输入高电平,输出三态门打开,转换结果的数字量输出到数据总线上。
·
· OE=1时,D0-D7引脚上为转换后的数据,当OE=0时,D0-D7为对外呈现高阻状态
其他引脚:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps1AD1.tmp.jpg
IN0~IN7:8路模拟量输入引脚
CLK:时钟信号输入端
V_(REF(+)):参考电压正端
V_(REF(-)):参考电压负端

实现思路:
A/D转换
初始化时启动A/D转换,转换结束后OE自动置位
检查OE状态,为高电平时读取数据口数据并转换成对应的电压值
显示结束后启动下一次A/D转换数码管显示读入数据并转换成电压值后,通过数码管显示,百位数值后显示小数点。
序如下:
  1. #include <reg52.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. typedef unsigned long ulong;
  5. uchar code table[] =
  6. {
  7.            0xfc, 0x60, 0xda, 0xf2,
  8. 0x66, 0xb6, 0xbe, 0xe0,
  9. 0xfe, 0xf6, 0xee, 0x3e,
  10. 0x9c, 0x7a, 0x9e, 0x8e 8 };
  11. sbit start = P3 ^ 0; //控制start引脚
  12. sbit eoc = P3 ^ 1; //查询eoc引脚情况
  13. sbit oe = P3 ^ 2; //输出允许控制端
  14. sbit dot = P1 ^ 0; //数码管小数点
  15. void Delay(uint m)   {
  16.      while(m--);
  17. }
  18. //主函数
  19. void main()  {
  20.      ulong temp, temp_data;
  21.      // uint temp;
  22.      start = 0;
  23.      oe = 0; //oe为高阻状态
  24.      start = 1; //start下降沿开始转换
  25.      start = 0;
  26.      while(1)
  27.      {
  28.          if (eoc == 1) //当eoc为1时转换结束
  29.          {
  30.              /*读入状态*/
  31.              oe = 1; //打开oe,数据读入引脚
  32.              temp = P0;
  33.              /*读入的数值转换成模拟电压对应的电压值,由于ADC0809将0-5V平分为255份,每一份为5/255v,
  34. 电压=1.0v时,temp=1.0*(5/255),为了方便显示小数,则扩大一百倍,得到公式temp=temp*1.0/255*500
  35.              但是在此处存在个问题,temp转换成为flout类型后运算量过大,影响后数码管显示速度,在一定范围内数码管显示错误  temp = temp * 1.0 / 255 * 500; → temp = temp * 500 / 255;
  36.              p.s. 修改后的temp要改成unsigned long, FF*500溢出int范围
  37.              */
  38.              temp = temp * 500 / 255;
  39.              oe = 0; //oe呈高阻
  40.              /*数码管显示*/
  41.              temp_data = temp % 10;
  42.              P2 = 0xfe; //数码管选择最后一位
  43.              P1 = table[temp_data];
  44.              Delay(500);
  45.              temp_data = temp / 10 % 10;
  46.              P2 = 0xfd; //数码管选择十位
  47.              P1 = table[temp_data];
  48.              Delay(500);
  49.              temp_data = temp / 100 % 10;
  50.              P2 = 0xfb; //数码管选择百位
  51.              P1 = table[temp_data];
  52.              dot = 1; //显示小数点
  53.              Delay(500);
  54.              /*启动下一次转换*/
  55.              start = 1;
  56.              start = 0;
  57.          }
  58.      }
  59. }
复制代码


完整的Word格式文档51黑下载地址:
51单片机AD转换器实现数字电压表实例.docx (238.71 KB, 下载次数: 102)

评分

参与人数 2黑币 +54 收起 理由
扫福11 + 4 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:313328 发表于 2018-6-10 20:58 | 显示全部楼层
必学的呀!
回复

使用道具 举报

ID:359165 发表于 2018-6-27 11:10 | 显示全部楼层
大佬会这个吗,看一看附件
回复

使用道具 举报

ID:341813 发表于 2018-6-29 10:33 | 显示全部楼层
我做了,有问题,运行不出来结果
回复

使用道具 举报

ID:395167 发表于 2018-10-4 23:05 | 显示全部楼层
为什么要1分多种数码管哪儿才显示电压?
回复

使用道具 举报

ID:408280 发表于 2018-10-13 15:37 | 显示全部楼层
只要把转换输出换了就能将0808改成0809了吧
回复

使用道具 举报

ID:538496 发表于 2020-3-9 18:40 | 显示全部楼层
好像有点问题
回复

使用道具 举报

ID:801226 发表于 2020-7-10 21:11 | 显示全部楼层
怎么运行结果不对啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表