基于单片机的数字电压表设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1《自动化系统工程设计》大作业班级:100401学号:1000401111姓名:王晨2基于单片机的数字电压表的设计引言数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。本文重点介绍单片A/D转换器以及由它们构成的基于单片机的数字电压表的工作原理。1.总体方案测量一个0——5V的直流电压,通过输入电路把信号送给AD0809,转换为数字信号再送至89s52单片机,通过其P1口经数码管显示出测量值。1.1结构框图如图1—1所示图1—11.2原理及功能8路数字电压表主要利用A/D转换器,其过程为如下:先用A/D转换器对各路电压3值进行采样,得到相应的数字量,再按数字量与模拟量成比例关系运算得到相应的模拟电压值,然后把模拟值通过数码管显示出来。设计时假设待测的输入电压为8路,电压值的范围为0——5v,要求能在4位LED数码上轮流显示或单路显示。测量的最小分辨率为0.019v。根据系统的功能要求,控制系统采用AT89s51单片机,A/D转换器。当输入电压为5V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196V(5/255)。ADC0809具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管显示采用软件译码动态显示。通过按键选择可8路循环显示,也可以单路循环。单路显示可通过按键选择所要显示的通道数。2.硬件电路设计8路数字电压表应用系统硬件电路由单片机、A/D转换器、数码管显示电路和按键处理电路等组成,电路原理图如图1—2所示。图1—2ADC0809具有8路模拟量输入通道IN0---IN7,通过3位地址输入端C、B、A(引脚23--25)进行选择。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚4输入的地址锁存于ADC0809内部是锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2μs宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为A/D转换器,当开始转换时,EOC信号为低电平,经过一段时间,转换结束,转换结束信号EOC输出高电平,转换结果存放于ADC0809内部的输出数据寄存器中。引脚9脚为A/D转换数据输出允许控制端OE,当OE为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线D0—D7输出。引脚10为ADC0809的时钟信号输入端CLOCK。在连接时,ADC0809的数据线D0—D7与AT89S52的P0口相连接,ADC0809的地址引脚、地址锁存端ALE、启动信号START、数据输出允许控制端OE分别与AT89S52的P2口相连接,转换结束信号EOC与AT89S52的P3.7相连接。时钟信号输入端CLOCK信号,由单片机的地址锁存信号ALE得到。LED数码管采用动态扫描方式连接,通过AT89S52的P1口和P3.0—P3.3口控制。P1口为LED数码管的字段码输出端,P3.0—P3.3口为LED数码管的位选码输出端,通过三极管驱动并反相。S1和S2是两个按键开关,分别与单片机的P3.5和P3.6相连接。S1用于单路显示或多路循环显示转换控制,S2用于单路显示时的通道选择。3.系统软件程序的设计多路数字电压表的系统软件程序由主程序、A/D转换子程序和显示子程序组成。3.1主程序主程序包含初始化部分、调用A/D转换子程序和调用显示程序,如图1—3所示。初始化部分包含存放通道数据缓冲区初始化和显示缓冲区初始化。另外,对于单路显示和循环显示,系统设置了一个标志位00H控制。初始化时00H位设置为0,默认为循环显示,当它为1时改变为单路显示。00H位通过单路/循环按键控制。3.2A/D转换子程序A/D转换子程序用于对ADC0809的8路输入模拟电压进行A/D转换,并将转换的数值存入8个相应的存储单元中,如图1—4所示。A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次。3.3显示子程序LED数码管采用软件译码动态扫描方式。在显示子程序中包含多路循环显示和单路显示程序。多路循环显示把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示1秒。单路显示程序只对当前选中的一路数据进行显示。每路数据显示需经过转换变成十进制BCD码,放于4个数码管的显示缓冲区中。单路显示或多路循环显示通过标志位00H控制。在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。5图1—3图1—43.4C语言源程序清单#includestdio.h#includeAT89x52.h#includeintrins.h//调用_nop_()延时函数#definead_conP2//0809控制口#defineaddataP0//0809数据入口#definedisdataP1//数码管显示#defineucharunsignedchar#defineuintunsignedintucharnumber=0x00;//存放单通道显示时的当前通道数sbitALE=P2^3;//0809地址锁存信号sbitSTART=P2^4;//启动信号sbitOE=P2^5;//输出允许通道sbitKEY1=P3^5;//循环或单路选择按键sbitKEY2=P3^6;//通道选择按键6sbitEOC=P3^7;//转换结束信号sbitDISX=disdata^7;//小数点位sbitFLAG=PSW^0;//循环或单路显示标志位Ucharcodedis_7[11]={0x3F,0x06,0x5B,0X4F,0x66,0x6D,0x7D,0x07,0x7E,0x6F,0x00};//数码管的字段码ucharcodescan_con[4]={0xF1,0xF2,0xF4,0xF8};//4个LED数码管的位选Uchardataad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//0809的8个通道转换数据缓冲区uchardatadis[5]={0x00,0x00,0x00,0x00,0x00};//显示缓冲区/*主函数*/main(){P0=0xff;//初始化端口P2=0x00;P1=0xff;P3=0xff;while(1){test();//测量转换数据scan();//显示数据}}/*1秒延时*/delay1ms(uintt){uinti,j;for(i=0;it;i++)for(j=0;j120;j++);}/*检测按键子程序*/keytest(){if(KEY1==0)//检测循环或单路选择按键是否按下{FLAG=!FLAG;//标志位取反,循环,单路显示却换while(KEY1==0);}if(FLAG==1)//单路循环时,检测通道选择按键是否按下7{if(KEY2==0){number++;if(number==8){number=0;}while(KEY2==0);}}}/*显示扫描子程序*/scan(){uchark,n;inth;if(FLAG==0)//循环显示子程序{dis[3]=0x00;//通道值清零for(n=0;n8;n++)//循环8次{dis[2]=ad_data[n]/51;//转换为BCD码dis[4]=ad_data[n]%51;dis[4]=dis[4]*10;dis[1]=dis[4]/51;dis[4]=dis[4]%51;dis[4]=dis[4]*10;dis[0]=dis[4]/51;for(h=0;h500;h++)//每个通道显示时间控制为1s{for(k=0;k4;k++)//4位LED循环显示{disdata=dis_7[dis[k]];if(k==2){DISX=0;}P3=scan_con[k];delay1ms(1);P3=0xff;}8}dis[3]++;//通道值加1keytest();//检测按键}}if(FLAG==1)//单路显示子程序{dis[3]=number;for(k=0;k4;k++)//4位LED扫描显示{disdata=dis_7[dis[k]];if(k==2){DISX=0;}P3=scan_con[k];delay1ms(1);P3=0xff;}keytest();//检测按键}}/*转换子函数*/test(){ucharm;uchars=0x00;//初始通道位0ad_con=s;//第一通道地址送0809控制口for(m=0;m8;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;//通道地址恢复初值}94.单片机概述AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,2个数据指针,三个16位定时器/计数器,5个中断优先级2层中断嵌套中断,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件,可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。4.1单片机引脚结构及说明如图1-5所示图1-5VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校10验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功