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


控制显示段码

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

实现代码:

 1 #include <reg52.h>
 2 typedef unsigned char uchar;
 3 typedef unsigned int uint;
 4 uchar code table[] =
 5 {
 6     0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e
 7 };
 8 sbit start = P3 ^ 0; //控制start引脚
 9 sbit eoc = P3 ^ 1; //查询eoc引脚情况
10 sbit oe = P3 ^ 2; //输出允许控制端
11 sbit dot = P1 ^ 0; //数码管小数点
12 void Delay(uchar m)
13 {
14     while(m--);
15 }
16 void main()
17 {
18     uint temp;
19     start = 0;
20     oe = 0; //oe为高阻状态
21     start = 1; //start下降沿开始转换
22     start = 0;
23     while(1)
24     {
25         if (eoc == 1) //当eoc为1时转换结束
26         {
27             /*读入状态*/
28             oe = 1; //打开oe,数据读入引脚
29             temp = P0;
30             temp = temp * 1.0 / 255 * 500; //读入的数值转换成模拟电压对应的电压值
31             oe = 1; //oe呈高阻
32             /*数码管显示*/
33             P2 = 0xfe; //数码管选择最后一位
34             P1 = table[temp % 10];
35             Delay(500);
36             P2 = 0xfd; //数码管选择十位
37             P1 = table[temp / 10 % 10];
38             Delay(500);
39             P2 = 0xfb; //数码管选择百位
40             P1 = table[temp / 100 % 10];
41             dot = 1; //显示小数点
42             Delay(500);
43             /*启动下一次转换*/
44             start = 1;
45             start = 0;
46         }
47     }
48 }

时间: 2024-08-28 21:19:33

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

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

-------------------------------------------- LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1602的意思是每行显示16个字符,一共可以显示两行.如果是12232液晶(图形型液晶)则表示由1

51单片机实现四相步进电机控制实例

-------------------------------------------- 工作原理见书<51单片机应用及原理--基于KeilC和Proteus,陈海宴>P178-180 -------------------------------------------- 步进电机控制应用实例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

51单片机300个proteus仿真实例下载

51单片机300个proteus仿真实例下载,不仅有230个51单片机的proteus仿真实例,还有59个经典案例,50个经典电路制作实例,下面只是部分截图和资料,还有更多的proteus仿真/程序在闯客网可以找到,并且免费下载,有需要的朋友可以下载学习,还有技术交流群:613377058 下载链接:https://bbs.usoftchina.com/thread-201293-1-1.html 100000秒以内的计时程序.DSN 10秒的秒表 (2).DSN 10秒的秒表.DSN 1286

实例源码2---基于51单片机的摇摇棒制作

最近整理资料,看见这个之前做的摇摇棒,是基于51单片机的,下面把源程序贴出来,有任何问题欢迎留言! #include #define uchar unsigned char #define uint unsigned int sbit key = P3^0;//定义切换画面开关 uchar Key_num;//定义按键次数 uchar Int0_num=0;//定义中断次数 uchar Direction;//定义摇动方向(从左到右) uchar code Embed[]={ 0x40,0x00

工业自控 西门子S7-200PLC教程 51单片机视频教程 Proteus视频教程 Protel DXP 教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

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

一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几天,算起来基本弄了3个多星期吧.不多说,总结总结. 二.开发数据准备 应用中主要的数据是单片机的汇编指令,我主要用XML文件来储存数据,没有使用SQLLite数据库,数据格式如下图: xml文件的数据是我手输入的,所以这是比较烦的.(可能有更简洁的办法获取数据). 而xml文件每个每个节点对应实例,

51单片机入门(三)

数码管显示,定时器中断:键盘检测: 1.数码管:分共阳极和共阴极数码管.我的实验板是共阴极,多位数码管的公共端叫做"位选线",连接在一起的段线叫做"段选线".位选是独立控制的,而段选是连接在一起的.段选数据由P0口发送,位选由P2口的2.3.4控制.(消影用P0=0x00) 2.中断:为使单片机具有对外部或内部随机事件发生的时间实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力.51单片机内部共有5个中断源,外部中断0.1:定时器中断0

工业自控西门子S7-200PLC教程 51单片机视频教程 Proteus视频教程 Protel DXP 教程 更多&gt;

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码实现触摸屏(串口屏)与单片机的通讯,主要是解决通讯协议的问题.本文使用开放的Modbus通讯协议,以广州易显的HMImaker触摸屏作主机(Master),单片机作从机(Slaver).HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了.触摸屏与单片机之间采用RS-485标准接口直接连接,与多台51单片机MODBUS RTU多机串口通信一.包括如下实例:二