单路电压表c语言编程,用AT89C51单片机制作的数字电压表

此数字电压表,利用A/D转换原理将被测模拟量转换成数字量,并通过控制系统用数字方式显示测量结果。本设计采用AT89C51单片机,ADC0809进行模/数转换,能够测量8路0~5V的输入电压值,可用四位LED数码管轮流或单路显示测量结果。其最小分辨率约为0.019V,测量误差小于0.02V。

一、系统简介

本系统分为主控电路、显示电路、A/D转换电路、键盘控制电路、电源电路及复位电路等,系统框图如右图所示。

二、硬件电路设计

本系统采用AT89C51单片机作为控制核心,对8路模拟电压信号经8位A/D转换芯片ADC0809转换成数字信号后,送单片机进行处理,然后通过数码管显示其电压值。电路原理见上图。

859c0aa28fee16a77e8918de251af659.gif

ADC0809有8路模拟输入口IN0~IN7,通过地址线(23)~(25)脚选择其中一路进行A/D转换。

(22)脚为地址锁存控制,高电平有效。⑥脚为测试控制,当输入一个2μs正脉冲时,启动A/D转换。⑦脚为A/D转换结束标志,当A/D转换结束时,⑦脚输出高电平。⑨脚为A/D转换数据输出允许控制端,当⑨脚为高电平时,A/D转换数据从MSB2-1~MSB2-8输出。⑩脚为时钟输入端,利用单片机ALE脚的六分频再通过74LS74构成的四分频得到500kHz时钟。

AT89C51的P2、P0.4~P0.7口作为数码管显示控制,采用动态显示方式显示测量的数字电压值和通道号。P0.0口用作单路显示/循环显示转换按钮,P0.1口用作单路显示时通道选择按钮。

P1口作A/D转换数据输入,P3.0-P3.6口用作ADC0809的控制。

三、系统软件设计

本系统软件由显示控制子程序、显示数据处理子程序、8路电压采集子程序、键盘处理子程序等组成,采用汇编语言编程。

1.主程序流程如左图所示。

77758b0393eb1202d647294f10c59335.gif

2.显示控制子程序

测量的A/D转换数据放在RAM70H~77H中,测量数据转换成的BCD码放在7AH~7DH中。

20H.0为显示方式标志位,21H存放通道标志数。R4用作8路循环控制,R0用作显示通道原始数据地址指针,R1为处理后的四位显示数据地址指针。程序通过测试20H.0来确定采用8路循环显示还是单通道显示。循环显示时每通道显示约2s。数字电压值是通过查表方式采用动态扫描法实现的。其程序流程如中图所示。

3.键盘处理子程序

本设计采用2个功能键和1个硬复位键。2个功能键接在P0.0与P0.1口上。对功能键的处理采用测试端口并设置标志的方法,使用了延时去抖处理。键盘按下时,还可以显示通道号码,松开后才显示测量电压值。循环显示时,通道号显示为“0”;单通道显示号码为0~8。

4.八路电压采集子程序

单片机为ADC0809提供所需的控制时序,采集到的八路电压数据分别存放在单片机RAM70H~77H中。程序流程如下图。

5.显示数据处理子程序

放在AT89C5170H~77H中的对应电压值数据必须转换成相应的BCD码后才能送数码管显示。由于本系统中ADC0809的参考电压VREF=VCC,所以最大测量电压5V所对应的二进制数就是FFH,而每伏电压对应的二进制数为33H。其处理方法是,用转换后的数据除以33H,得到的商即为电压值的个位数。余数×5后再除以33H得到的商×2即为电压值的十分位数。所余之数×2后再进行一次×5÷33H得到的商×2即为电压值的百分位数。同理可得到千分位数。最后进行四舍五入处理,若千分位处理后的余数大于19H即千分位加1。四舍五入处理后需要对各位进行进位调整。调整后的个位、十分位、百分位、千分位分别存入7AH~7DH中。

7d999fc148577a287dd7e8603d1e21b5.png

64d1fc2da8567d98ce4f38f881092a8c.gif

5e0742dfadfa0a84160272f95682009e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZK的实际应用:MVVM –加载和渲染数据

先前的文章简要介绍了RIA框架ZK,以及它CSS Selector启发式控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担。 然后,我们在上一篇文章中探讨了ZK中的MVVM模式如何允许单个ViewModel提供不同的视图。 这篇文章…

搭建一个简单的mybatis框架

一、Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Pla…

定时操作范例

1 package timetask.demo;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 import java.util.Timer;6 import java.util.TimerTask;7 8 /*9 * time类 是一个线程实施,可以用来实现在某一个时间或者某一个时间段后安排某一个任务执行一次或者定期…

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思:都是转义字符,空格就是单纯的空格,输入时可以输入空格\t 跳格 \r 回车 \n 换行\\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。转义字符串(Escap…

如何在运行时更改日志记录级别

在运行时中更改日志记录级别很重要,这主要在生产环境中非常重要,在生产环境中,您可能希望在有限的时间内进行调试日志记录。 好了,更改根记录器非常简单–假设您有一个具有所需记录级别的输入参数,只需获取根记录器并…

扩展中国剩余定理

转自:http://blog.csdn.net/clove_unique/article/details/54571216 对于两个方程$x\equiv c_1\pmod {m_1}$$x\equiv c_2\pmod {m_2}$将其合并为一个方程,有解条件为$(m1,m2)|(c2-c1)$$m\frac{m1m2}{(m1,m2)}$$c(inv(\frac{m1}{(m1,m2)},\frac{m2}{(m1,m…

易语言添加ctrl c键,易语言操作快捷键汇总

以下是关于易语言的快捷键内容:预览被设计窗口 CtrlEnter运行 F5终止运行 CtrlF5编译 F7菜单编辑器 CtrlE即时帮助 F1在编辑窗口之间跳转。按下 Ctrl 键后不放,然后反复按 Tab 键可以在目前所有的编辑窗口之间跳转;按下 Ctrl 键后同时按下 Ta…

在代理类中引用动态代理

在Stackoverflow中有一个有趣的问题 ,关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务,Spring AOP,缓存,异步流等。需要对代理的引用,因为如果存在对自身的调用通过代理bean,此调用将完全…

Array的用法总结-swift

Araay是有序的数据集,在OC中分为不可变数组NSArray和可变数组NSMutableArray,在swift中只有常量和变量两种类型,声明成变量那就可以说明是可变的了! 学习时的具体的用法总结成如下的代码: //数组var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 转载于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文…

handsontable 方法汇总

核心方法1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如:hot.addHook(beforeInit, myCallback); addHookOnce(key,callback):添加只使用一次的方法,用完后自动删除 例如:hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("张三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题:Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场!前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图,觉得这个就是一个slidingpanel&#…

Java EE 7中包含哪些JSR?

我开始填写所有应该加入Java EE 7的Java规范请求的表。 由于平台版本仍在确定中,因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API: 名称 版 描述 JSR 网页 轮廓 批处理 1.0 批量处理 352 Bean验证 1.1 Bean验证框…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

释放双眼,带上耳机,听听看~!在Android开发中,当程序发生异常时会抛出异常信息,先说下三种常见类型:列表内容KeyDispatchTimeout(谷歌default 5s,MTK平台上是8s) –主要类型按键或触摸事件在特定…

修改httpd默认端口号

Tomcat: vim /etc/httpd/conf/httpd.conf//别忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 转载于:https://www.cnblogs.com/bincoding/p/6067054.html

整合弹簧,速度和瓷砖

我喜欢 Tiles, 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途,并且据说很容易结合在一起,所以我决定试一试,并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时,并且是一次真正的过山车&…

Android 软键盘自动弹出和关闭

在我们写修改信息或者搜索,修改密码等界面的时候,用户进入这个界面的主要目的就是输入修改/查找 某些信息,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出。 1.软键盘的自动弹出 private void showKeyboard(){InputMethodM…