基于单片机的多路电压采集系统
- 格式:doc
- 大小:695.00 KB
- 文档页数:13
基于Proteus的数字电压表设计与仿真
专业:0811电子信息工程 学号: 08128041 姓名:唐浩
摘要:在现代检测技术中,常用高精度数字电压表进行检测,将检测到的数据送入微型计算机系统,完成计算、存储、控制等功能。本文中数字电压表的控制系统采用AT89C51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单,所用的元件较少,成本低,调节工作可实现自动化,还可以方便地进行8路A/D转换的测量,远程测量结果传送等功能。数字电压表可以测量0~5V的电压值,并在四位LED数码管上轮流显示, 并且应用Proteus的ISIS软件进行单片机系统设计与仿真.
关键词:单片机;数字电压表;A/D转换ADC0809;Proteus
Design and Simulation of digital Voltmeter Based on Proteus
Abstract:In modern measuring technology, it is often required to conduct site measuring with a
digital voltmeter. The data measured will then be input into the micro-computer system to execute
such functions like calculating, storing, controlling, and displaying. The digital voltmeter control
system described in this paper makes use of AT89C51 SC computer and ADC0809 A/D converter
to fulfill the designing of the software as well as the electrical circuit. The voltmeter features in
simple electrical circuit, lower use of elements, low cost and automatic regulation, while it
can
also easily carry out the duties of measuring A/D converted values from 8 routes and
remote
transfer of measuring data. The meter is capable of measuring voltage from 0 to 5 volt,
and
displaying the measurements in turn or only that from a selected route,and use software ISIS of
Proteus to realize the circuit design and simulation.。
Keywords: Single chip microcomputer;digital Voltmeter;A/D switch ADC0809;Proteus
1 绪论
随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。同时随着微电子技术的迅速发展和超大规模集成电路的出现,特别是单片机的出现,正在引起测量控制仪表领域的新的技术革命 [1]。
由于使用的是高效单片机作为核心的测量系统,以及灵敏度和精度较高的A/D转换器,使本直流电压表具有精度高、灵敏度强、性能可靠、电路简单、成本低的特点,加上经过优化的程序,使其有很高的智能化水平[2]。 数字电压表相对于指针表而言读数直观准确,电压表的数字化是将连续的模拟量转换成不连续的离散的数字形式并加以显示。这有别于传统的以指针与刻度盘进行读数的方法,避免了读数的视差和视觉疲劳[3]。
2 系统方案设计
利用MCS-51系列单片机设计简易数字电压表测量0~5v的8路输入电压值,并在四位LED数码管上轮流显示或单路选择显示。测量误差约为±0.02V。系统设计方框图如图1所示。
单片机AT89C51时钟电路复位电路数据采集显示电路模拟信号
图1系统设计方框图
3 硬件电路设计
3.1时钟电路
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路如图2所示[2]。
图2时钟电路图 3.2复位电路
复位电路如下图3所示,按键没有按下时,RST端接电容下极板是低电平,按键按下时,RST端接在电阻上端变为高电平,达到复位的目的[2]。
图3复位电路图
3.3数据采集模块
通过ADC0809采集数据,输入到单片机内,如图4所示:
图4数据采集模块电路图
3.4显示电路
通过4位数码管来显示,如图5所示:
图5显示电路图 4 软件设计
4.1主程序流程图
主程序流程图如图6所示:
初始化开始调用A/D转化程序调用数据处理程序调用显示程序
图6主程序流程图
4.2显示子程序流程图
显示子程序流程图如图7所示:
开始初始化,P0置高,P2置低P0到A输出显示P2=P2+1置位P0.7点亮小数点结束P0到A输出显示P2=P2+1P0到A输出显示P2=P2+1P0到A输出显示
图7显示子程序流程图 4.3 A/D转换子程序流程图
A/D转换子程序流程图,如图8所示:
开始初始化启动A/D转化 P3.1=1?P3.0置位,允许输出。将转化的数据保存结束YN
图8 A/D转换子程序流程图
4.4数据处理子程序流程图
数据处理子程序流程图,如图98所示:
开始从34H中取数据,乘以19.5mv,得到的数据BCD麻化,将数据存入A转化双字节十六进制整数BCD码带进位自身相加,十进制调整 R2=0?数据输入显示器结束NY
图9数据处理子程序流程图 5 源代码
LED1 EQU 30H ;初始化定义
LED2 EQU 31H
LED3 EQU 32H ;存放三个数码管的段码
ADC EQU 35H ;存放转换后的数据
ST BIT P3.2
OE BIT P3.0
EOC BIT P3.1 ;定义ADC0809的功能控制引脚
ORG 0000H
LJMP MAIN ;跳转到主程序执行
ORG 0030H
MAIN: MOV LED1,#00H
MOV LED2,#00H
MOV LED3,#00H ;寄存器初始化
CLR P3.4
SETB P3.5
CLR P3.6 ;选择ADC0809的通道2
WAIT: CLR ST
SETB ST
CLR ST ;在脉冲下降沿启动转换
JNB EOC,$ ;等待转换结束
SETB OE ;允许输出信号
MOV ADC,P1 ;暂存A/D转换结果
CLR OE ;关闭输出
MOV A,ADC ;将转换结果放入A中,准备个位数据转换
MOV B,#50 ;变换个位调整值50送B
DIV AB
MOV LED1,A ;将变换后的个位值送显示缓冲区LED1
MOV A,B ;将变换结果的余数放入A中,准备十分位变换
MOV B,#5 ;变换十分位调整值5送B
DIV AB
MOV LED2,A ;将变换后的十分位值送LED2
MOV LED3,B ;最后的余数作百分位值送LED3
LCALL DISP ;调用显示程序
AJMP WAIT
DISP:MOV R1,#LED1 ; 显示子程序
CJNE @R1,#5,GO ;@R1=5V?是往下执行,否,则到GO
MOV LED2,#0H ;是5V,即最高值,将小数的十分位清零
MOV LED3,#0H ;将小数的百分位清零
GO:MOV R2,#3 ;显示位数赋初值,用到3位数码管
MOV R3,#0FDH ;扫描初值送R3
DISP1:MOV P2,#0FFH ;关闭显示,目的防止乱码
MOV A,@R1 ;显示值送A
MOV DPTR,#TAB ;送表首地址给DPTR MOVC A,@A+DPTR ;查表取段码
CJNE R2,#3,GO1 ;判断是否个位数码管?否则跳到GO1
ORL A,#80H ;将整数的数码管显示小数点
GO1:MOV P0,A ;送段码给P0口
MOV A,R3
MOV P2,A ;送位码给P2口
LCALL DELAY ;调用延时
MOV R3,A
RL A ;改变位码
MOV R3,A
INC R1 ;改变段码
DJNZ R2,DISP1 ;三位是否显示完?否则调到DISP1
RET
DELAY:MOV R6,#10 ;延时5S程序:
D1:MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
TAB: DB 3FH, 06H,5BH,4FH,66H;共阴极数码管显示0-4 ;显示数据表:
DB 6DH,7DH,07H,7FH,6FH;显示5-9
END
6.C源代码
7.#include"reg51.h"
8.#include"absacc.h"
9.#include "intrins.h"
10.#define uchar unsigned char
11.#define uint unsigned int
12.#define SEG_OUT P2 //段码输入端口
13.#define BIT_OUT P1//扫描口
14.sbit RED_LED=P3^6;
15.sbit YED_LED=P3^5;
16.sbit SPER=P3^7;
17.sbit dot=P2^7;
18.sbit ST=P3^0;
19.sbit OE=P3^1;
20.sbit EOC=P3^2;
21.sbit CLE=P3^4;
22.uint data getdata;
23.uint temp;
24.uint num;
25.uchar ts50ms=0;
26.uchar data dis_buff[4]={0,0,0,0};
27.unsigned char code
diaput[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xb