————————————————————————————————————————————

ADC0809

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工作原理:

  • ADDA/ADDB/ADDC 输入3位地址,并使ALE=1,将地址存入地址锁存器中

    ALE:地址锁存允许信号接入端,高电平时允许改变CBA的值,低电平时锁死,防止在A/D转换过程中切换通道

  • 地址经译码选通8路模拟输入IN0~IN7之一到比较器,输入与被选通道关系

通道

C

B

A

IN0

0

0

0

IN1

0

0

1

IN2

0

1

0

IN3

0

1

1

IN4

1

0

0

IN5

1

0

1

IN6

1

1

0

IN7

1

1

1

  • START端上升沿将逐次逼近寄存器复位,下降沿启动A/D转换
  • EOC输出信号变低电平,表示正在转换;当A/D转换完成,EOC变为高电平,结果数据已存入锁存器。
  • OE输入高电平,输出三态门打开,转换结果的数字量输出到数据总线上。

    OE=1时,D0-D7引脚上为转换后的数据,当OE=0时,D0-D7为对外呈现高阻状态

p.s.

其他引脚:

IN0~IN7:8路模拟量输入引脚

CLK:时钟信号输入端

V_(REF(+)):参考电压正端

V_(REF(-)):参考电压负端

————————————————————————————————————————————

数字电压表实验

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现效果:

  • 检测外部模拟电压,并用数字量将其电压值表示出来

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现思路:

  • A/D转换
    • 初始化时启动A/D转换,转换结束后OE自动置位
    • 检查OE状态,为高电平时读取数据口数据并转换成对应的电压值
    • 显示结束后启动下一次A/D转换
  • 数码管显示
    • 读入数据并转换成电压值后,通过数码管显示,百位数值后显示小数点

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

连接说明:

ADC0808

OUT1-OUT8

89C51

P0.0-0.7

转换后数据输出到单片机

START

P3.0

EOC

P3.1

OE

P3.2

IN0

POT-HG

+

输入模拟信号

ADDA/ADDB/ADDC/VREF(-)

GND

0 0 0 选择通路IN0

ALE/VREF(+)

POWER

将地址存入地址锁存器中

数码管

1/2/3/4/5/6/7

89C51

P2

控制数码管显示位数

A/B/C/D/E/F/G/DP

P1

控制显示段码

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:

 #include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
uchar code table[] =
{
0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e
};
sbit start = P3 ^ ; //控制start引脚
sbit eoc = P3 ^ ; //查询eoc引脚情况
sbit oe = P3 ^ ; //输出允许控制端
sbit dot = P1 ^ ; //数码管小数点
void Delay(uint m)
{
while(m--);
}
void main()
{
ulong temp, temp_data;
// uint temp;
start = ;
oe = ; //oe为高阻状态
start = ; //start下降沿开始转换
start = ;
while()
{
if (eoc == ) //当eoc为1时转换结束
{
/*读入状态*/
oe = ; //打开oe,数据读入引脚
temp = P0;
/*
读入的数值转换成模拟电压对应的电压值,由于ADC0809将0-5V平分为255份,每一份为5/255v,电压=1.0v时,temp=1.0*(5/255),为了方便显示小数,则扩大一百倍,得到公式temp=temp*1.0/255*500
但是在此处存在个问题,temp转换成为flout类型后运算量过大,影响后数码管显示速度,在一定范围内数码管显示错误
temp = temp * 1.0 / 255 * 500; → temp = temp * 500 / 255;
p.s. 修改后的temp要改成unsigned long, FF*500溢出int范围
*/
temp = temp * / ;
oe = ; //oe呈高阻
/*数码管显示*/
temp_data = temp % ;
P2 = 0xfe; //数码管选择最后一位
P1 = table[temp_data];
Delay();
temp_data = temp / % ;
P2 = 0xfd; //数码管选择十位
P1 = table[temp_data];
Delay();
temp_data = temp / % ;
P2 = 0xfb; //数码管选择百位
P1 = table[temp_data];
dot = ; //显示小数点
Delay();
/*启动下一次转换*/
start = ;
start = ;
}
}
}

51单片机 | A/D转换器实现数字电压表实例的更多相关文章

  1. 51单片机I/O口直接输入输出实例(附调试及分析过程)

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  2. 51单片机 | I/O口直接输入输出实例

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  3. 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)

    并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...

  4. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  5. Windows 通用应用尝试开发 “51单片机汇编”总结

    一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...

  6. 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯

    关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...

  7. 51单片机——My-Clock项目

    技术:51单片机.光敏传感器.PCF8591.DHT11.DS1302.OLED显示屏   概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块 ...

  8. C/51单片机

    1.    串口也可以有多根线的,但是各线之间没有协调同步发送,而是各自是独自发送的.并口是同步发送,同步一次8位同时成功同时失败,类比事务. 2.    ASCII码的前32位是通讯预留的编码即使现 ...

  9. 【零基础】入门51单片机图文教程(Proteus+Keil)

    参考资料: https://www.jianshu.com/p/88dfc09e7403 https://blog.csdn.net/feit2417/article/details/80890218 ...

随机推荐

  1. EVERYTHING 1.3.4参数

    命令行参数 操作符:     space    与 (AND)     |    或 (OR)     !    非 (NOT)     < >    分组     " &quo ...

  2. 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断

    CPU上处理的中断可以分成“硬件中断”和“软件中断”两类,比如网卡产生的中断称为硬件中断,而如果是软件使用诸如"int 0x10"(X86平台上)这样的指令产生中断称为软件中断,硬 ...

  3. postgres 基本使用

    postgres=# help 您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面 键入: \copyright 显示发行条款 \h 显示 SQL 命令的说明 \? 显示 pgsq ...

  4. hdu 5084(矩阵操作)

    HeHe Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  5. LINUX学习资源

    鸟哥:http://vbird.dic.ksu.edu.tw/linux_basic/0430cron.php#cron 五分钟教程:http://roclinux.cn/?page_id=3759

  6. Python的并发并行[4] -> 并发[1] -> concurrent.future 模块

    concurrent.future 模块 1 thread模块 / thread Module 1.1 常量 / Constants Pass 1.2 函数 / Function Pass 1.3 类 ...

  7. ACM的奇计淫巧系列

    突然想写个系列,算是总结总结集训中遇到的各种黑科技吧,这是目录 ACM的奇计淫巧_输入挂 ACM的奇计淫巧_扩栈C++/G++ ACM的奇计淫巧_bitset优化

  8. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  9. [POI2008]Mirror Trap

    题目大意: 一个$n(n\le10^5)$个顶点的格点多边形,每条边平行于网格线,每个角度数均为$90^\circ$或$270^\circ$,周长小于$3\times10^5$,每个顶点可以安装激光发 ...

  10. 使用gtest自动化测试并给出性能测试结果(windows 版本,版本平台也可以使用,但并没有做完整的测试)

    /************************************************************* *使用gtest自动化测试 * ********************* ...