51单片机 | A/D转换器实现数字电压表实例
————————————————————————————————————————————
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转换器实现数字电压表实例的更多相关文章
- 51单片机I/O口直接输入输出实例(附调试及分析过程)
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...
- 51单片机 | I/O口直接输入输出实例
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...
- 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)
并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...
- 51单片机 | 实现SMC1602液晶屏显示实例
———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...
- Windows 通用应用尝试开发 “51单片机汇编”总结
一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...
- 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯
关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...
- 51单片机——My-Clock项目
技术:51单片机.光敏传感器.PCF8591.DHT11.DS1302.OLED显示屏 概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块 ...
- C/51单片机
1. 串口也可以有多根线的,但是各线之间没有协调同步发送,而是各自是独自发送的.并口是同步发送,同步一次8位同时成功同时失败,类比事务. 2. ASCII码的前32位是通讯预留的编码即使现 ...
- 【零基础】入门51单片机图文教程(Proteus+Keil)
参考资料: https://www.jianshu.com/p/88dfc09e7403 https://blog.csdn.net/feit2417/article/details/80890218 ...
随机推荐
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective[nil]c-runtime(4)[nil]-cheng-yuan-bian-lian ...
- (七)insmod/rmmod
insmod: insmod命令用于将给定的模块加载到内核中.Linux有许多功能是通过模块的方式,在需要时才载入kernel.如此可使kernel较为精简,进而提高效率,以及保有较大的弹性.这类可载 ...
- js中立即执行函数写法理解
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数, 并后面加个括号立即调 ...
- JavaScript 开发者的 10 款必备工具
JavaScript,一种所有主流浏览器都支持的语言,是开发基于浏览器的 Web 应用程序的主力,几乎每年都会受到来自众多开发人员的关注.自然地,框架和库的生态系统自然而然地围绕着 JavaScrip ...
- HDU 1541.Stars-一维树状数组(详解)
树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...
- 51nod 1007 正整数分组【01背包变形】
1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...
- HDU 6270 Marriage (2017 CCPC 杭州赛区 G题,生成函数 + 容斥 + 分治NTT)
题目链接 2017 CCPC Hangzhou Problem G 题意描述很清晰. 考虑每个家庭有且仅有$k$对近亲的方案数: $C(a, k) * C(b, k) * k!$ 那么如果在第$1$ ...
- luogu P1075 质因数分解
题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入输出格式 输入格式: 输入只有一行,包含一个正整数n. 输出格式: 输出只有一行,包含一个正整数p,即较大的那个质数. ...
- 【数学】【HAOI2008】【BZOJ1045糖果传递】【BZOJ3293分金币】论数学的重要性
BZOJ1045和BZOJ3293一模一样两道题,在这里我用1045来讲. 1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB ...
- Orchard EventBus 事件总线及 IEventHandler作用
事件总线接口定义: public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDiction ...