电压表设计
福建农林大学
毕业论文
成人教育学院
年级专业 电气工程及其自动化 学 号 081222627 学生姓名 郑 树 元
论文题目 基于52单片机的多路数字电压表设计 指导教师
时间: 2010 年 7 月 20 日
基于52单片机的多路数字电压表设计
摘要: 本次设计了一个多路数字电压表,该电压表测量范围的0—5V之间。它主要利用A/D转换器。对多路电压值进行采样,得到相应的数字量,然后按照数字量与模拟量的比例关系得到对应的模拟电压值,通过显示设备显示出来。系统过程就是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示。由于采用高性能的单片机芯片为核心,同时利用LED数码管为显示设备,这样就使显示清晰直观、读书准确,大大地减少了因人为因素所造成的测量误差事件,大大的提高了测量的精确度。
关键词: 单片机 数字电压表 ADC0809
目录
第一章 前言......................... ........... ............ 1 第二章 基于单片机的多路数字电压表的基本理论............. ......2 第三章 方案设计........................... ....................3 第四章 硬件电路的工作原理.......................................4 4.1单片机电路模块..............................................4 4.2A/D转换器电路模块...........................................5 4.3数码管显示电路模块......................................... 6 4.4按键处理电路模块............................................6 第五章 软件编程.................................................7 5.1 主程序............................... ...................... 7 5.2 A/D 转换主程序................................................7 5.3 显示子程序.................................................. 8 第六章 系统调试和结果富分析................... ..................10 第七章 结束语................... ................................11 参考文献............................. ............................12 附录............................. ................................13
第一章 引 言
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算、逻辑运算、数据传送、中断处理)的微处理器(CPU)。随着单片机技术的飞速发展,各种单片机蜂拥而至,单片机技术已成为一个国家现代化科技水平的重要标志。
单片机可单独地完成现代工业控制所要求的智能化控制功能,这是单片机最大的特征。单片机控制系统能够取代以前利用复杂电子线路或数字电路构成的控制系统,可以软件控制来实现,并能够实现智能化。现在单片机控制范畴无所不在,例如通信产品、家用电器、智能仪器仪表、过程控制和专用控制装置等等,单片机的应用领域越来越广泛。本次课程设计的课题是“基于单片机的多路数字电压表的设计”。主要考核我们对单片机技术,编程能力等方面的情况。观察独立分析、设计单片机的能力,以及实际编程技能。
传统的指针式电压表功能第一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。通过单片机,采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表,使测得的结果更为精准。
本课题主要解决A/D转换、数据处理及显示控制等三个模块。控制系统采用AT89C52单片机,A/D转换采用ADC0809。
第一章 基于单片机的多路数字电压表的基本理论
基于单片机的多路数字电压表的主要原理是利用A/D转换器实现其功能,其过程为如下:先用A/D转换器对各路电压值进行采样,得到相应的数字亮,再按数字量与模拟量成比例关系运算得到相应的模拟电压值,然后把模拟值通过数码管显示出来。设计时假设待测的输入电压为8路,电压值的范围为0—5V,要求能在4位LED数码上轮流显示或单路显示。测量的最小分辨率为0.019V。
根据系统的功能要求,控制系统采用AT89C52,A/D转换器。当输入电压为5V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196V(5/255)。ADC0809具有8路模拟量输入端口,通过三位地址输入端能从8路中选择一路进行转换。如每隔一段时间一次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管显示采用软件译码动态显示。通过按键选择可8路循环显示,也可以单路循环。单路显示可通过按键选择所要显示的通道数。
第二章 方案设计
基于单片机的多路数字电压表电路的基本组成如图1所示。
根据设计要求,采用的方案如下。硬件部分实现数据的采集、编译,A/D转换以及显示的功能,包括单片机电路模块、A/D转换器模块、数码管显示电路模块、按键处理电路模块;软件部分实现控制芯片,使各部件能够正常的运行,同时实现仿真的功能,主要设计思想是利用Proteus软件进行仿真,通过仿真得到实验的结果。
第三章 硬件电路的工作原理
3.1 单片机电路模块
本次课设单片机采用高性能98C52系列芯片,如图2所示,
其具体管脚说明如下:
P0口:P0口为一个8位漏极开路双向I/O口,每脚可吸收8TTL门电流。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL们电流。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0 /RXD(串行输入口);P3.1 /TXD(串行输出口);P3.2/ INT0(外部中断0);P3.3 /INT1(外部中断1);P3.4/ T0(计时器0外部输入);P3.5/ T1(计时器1外部输入);P3.6 /WR(外部数据存储器写选通);P3.7 /RD(外部数据存储器读选通);P3口同时为闪烁编程和编程校验接收一些控制信号。
RST;复位输入。当振荡器复位器件时,要保持RST脚两个及其的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程器件,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作为对外部输出的脉冲或用于定时目的。
PSEN:外部程序存储器的选通信号。
EA/VPP:当EA为高电平时,单片机读取内部存贮器,有扩展外部存贮器时,先读内部再读外部存贮器,当EA保持低电平时,单片机读取外部存贮器。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。
3.2 A/D转换器电路模块
ADC0809具有8路模拟量输入通道IN0---IN7,通过3位地址输入端C、B、A(引脚23---25)进行选择,如图3所示。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存于ADC0809内部是锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2us 宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为A/D转换器,当开始转换时,EOC信号为低电平,经过一段时间,转换结束,转换结束信号EOC输出高电平,转换结果存放于ADC0809内部的输出数据寄存器中。引脚9脚位A/D转换数据输出允许控制端OE,当OE为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线D0—D7输出。引脚10为ADC0809的时钟信号输入端CLOCK。在连接时,ADC0809的数据线D0—D7与AT89V52的P0口相连接,ADC0809的地址引脚、地址段ALE、启动信号START、数据输出允许控制端OE分别与AT89C52的P2口相连接,转换结束信号EOC与AT89C52的P3.7相连接。时钟信号输入端CLOCK信号,由单片机的地址锁存信号ALE得到。
3.3 数码管显示电路模块
LED数码管采用动态扫描方式连接,通过AT89C52的P1口和P3.0—P3.3口控制。 P1口为LED数码管的字段码输出端,P3.0—P3.3口为LED数码管的选输出端,通过三极管驱动并反相。如图4所示。
3.4 按键处理电路模块
S1和S2是两个按键开关,如图5所示,分别与单片机的P3.5和P3.6相连接。S1用于单路显示或多路循环显示转换控制,S2用于单路显示时的同代选择。
第四章 软件编程
多路数字电压表的系统软件程序有主程序、A/D转换子程序和显示子程序组成。 4.1 主程序
主程序包含初始化部分、调用A/D转换子程序和调用显示程序,如图6所示。初始化部分包含存放通道数据缓冲区初始化和显示缓冲区初始化。另外,对于单路显示和循环显示,系统设置了一个标志位00H控制。初始化时00H位设置为0,默认为循环显示,当它为1时改变单路显示。00H位通过单路/循环按键控制。
源程序参考附录。 4.2 A/D转换子程序
A/D转换子程序用于对ADC0809的8路输入模拟电压进行A/D转换,并将转换数值存入8 个相应的存储单元中,如图7所示。A/D转换子程序每隔一定的时间调用一次,退出隔一段时间对输入电压采样一次。
4.3 显示子程序
LED数码管采用软件译码动态扫描方式。显示子程序中包含多路循环显示和单路显示程序。多路循环显示把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示1秒。单路显示程序只对当前选中的一路数据进行显示。每路数据显示需经过转换变成十进制BCD码,放于4个数码管的显示缓冲区中。单路显示或多路循环显示通过标志位00H控制。在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。
程序如下: Keytest() { }
If(flag==1) {
If(KEY1==0) {
Flag=!flag; While(key1==0);
If(key2==0) {
} }
Number++; If(number==8) {number=0;} While(key2==0);
}
第五章 系统调试和结果分析
采用KEIL uVision2编译器进行源程序编译及仿真调试,同时进行硬件电路板的设计制作,完成好程序后进行软硬件联调,最后进行端口电压的对比测试,要求测试对比中标准电压值采用数字万用表测得。测试对比表如表1所列。表中标准电压值采用数字万用表测得。
表1 基于单片机的多路数字电压表与数字电压表对比测试表
基于单片机的多路数字数字电压表与“标准”数字电压表测得的绝对误差应在0.02V以内,满足设计要求,达到了设计的目的。
第六章 结论及进一步设想
通过实验仿真,比较标准电压值与设计的数字电压表测得的电压值,发现它们的绝对误差均在0.02V以内,这与采用8为A/D转换器所能达到的理论误差精度相一致,在一般的应用场合完全可以满足要求。
但是由于存在着单片机为8位处理器,当输入电压为5.00V时,ADC0809输出数据值为255(FFH),单片机最高的数字分辨率只能为0.0196V的原因,还存在着不能满足高精度测量的缺陷,可以用过采用更高位的A/D转换器来进一步改善,得到更加精确地数据。
此外,从表1中可以看出,简易数字电压表测得的值基本上均比标准电压值偏大0.01-0.01V。这可以通过校正ADC0809的基准电压来解决。因为该电压表设计时直接用
参考文献:
1. 周 平《单片机应用技术》电子科技大学出版社 2004.6
2. 郭天祥 《51单片机C语言教程》 电子商务工业出版社 2009.12 3. 李荣正 《PIC单片机实验教程》北京航空航天大出版社 2005. 4. 王有绪 《单片机接口技术及应用系统设计》北京航空航天大出版社2000
5. 周润景 《基于PROTEUS的电路及单片机系统设计与仿真》 北京航空航天大出版社2000
附录:
多路数字电压表设计源程序:
#define #define #define
#define ad_con P2 //0809控制口 #define addata P0 //0809数据入口 #define disdata P1
#define uchar unsigned char #define uint unsigned int uchar number=0x00;
sbit ALE=P2^3; //0809地址所存信号 sbit START=P2^4; //启动信号 sbit OE=P2^5; //输出允许通道 sbit KEY1=P3^5; //循环或单路选择按钮 sbit KEY2=P3^6; //通道选择按钮 sbit EOC=P3^7; //转换结束信号 sbit DISX=disdata^7; //小数点位 sbit FLAG=PSW^0; //循环或单路显示标志位 uchar code dis_7[11]={0x3F,
0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7E,0X6F,0X00};//数码管的字段码 uchar code scan_con[4]={0xF1,0XF2,0XF4,0XF8}; //4个LED数码管的位选 uchar data ad_data[8]= {0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00}; //0809的8个通道转换数据缓冲区
uchar data dis[5]={0x00,0x00,0x00,0x00,0x00}; //显示缓冲区void delay(uint xms) void delay xms(uint xms)//延时子程序 { }
void main() {
uint i,j;
for(i=0;i
for(j=0;j
P0=0Xff;
}
//检测键盘子程序 keytest() { }
//显示扫描子程序 scan() { {
P1=0Xff; P3=0Xff; while(1) { }
test(); //测量转换数据 scan(); //显示数据
if(KEY1==0) //检测循环或单路选择按键是否按下 {
FLAG=!FLAG; //标志位取反,循环,单路显示却换 while(KEY1==0); }
if(FLAG==1) //单路循环时,检测通道选择按键是否按下 { }
if(KEY2==0) { }
number++; if(number==8) {number=0;} while(KEY2==0);
uchar k,n; int h;
if(FLAG==0) //循环显示子程序
dis[3]=0x00; //通道值清零
}
if(FLAG==1) //单路显示子程序 { {
{
dis[2]=ad_data[n]/51; //转换成BCD码 dis[4]=ad_data[n]%51; dis[4]=dis[4]*10; dis[1]=dis[4]/51; dis[1]=dis[4]%51; dis[4]=dis[4]*10; dis[0]=dis[4]/51;
for(h=0;h
for(k=0;k
disdata=dis_7[dia[k]]; if(k==2) {DISX=0;} P3=SCAN_CON[K]; delay1ms(1); P3=0xff; } }
dis[3]++; //通道值加1 keytest(); //检测按键 }
dis[3]=number;
for(k=0;k
disdata=dis_7[dia[k]]; if(k==2) {DISX=0;} P3=SCAN_CON[K]; delay1ms(1); P3=0xff;
keytest(); //检测按键 } }
//转换子函数 test() {
uchar m;
uchar s=0x00; //初始化通道位0 ad_con=s; //第一通道地址送0809控制口 for(m=0;m
ALE=1;_nop_();_nop_();ALE=0; //锁存通道地址 START=1;_nop_();_nop_();START=0; //启动转换 _nop_();_nop_();_nop_();_nop_(); while(EOC==0); //等待转换结束
OE=1;ad_data[m]=addata;OE=0; //读取当前通道转换数据 s++;ad_con=s; //改变通道地址
ad_con=0x00; //通道地址恢复初值 }