基于Proteus的数字电压表设计与仿真专业:0811电子信息工程学号:08128041姓名:唐浩摘要:在现代检测技术中,常用高精度数字电压表进行检测,将检测到的数据送入微型计算机系统,完成计算、存储、控制等功能。本文中数字电压表的控制系统采用AT89C51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单,所用的元件较少,成本低,调节工作可实现自动化,还可以方便地进行8路A/D转换的测量,远程测量结果传送等功能。数字电压表可以测量0~5V的电压值,并在四位LED数码管上轮流显示,并且应用Proteus的ISIS软件进行单片机系统设计与仿真.关键词:单片机;数字电压表;A/D转换ADC0809;ProteusDesignandSimulationofdigitalVoltmeterBasedonProteusAbstract:Inmodernmeasuringtechnology,itisoftenrequiredtoconductsitemeasuringwithadigitalvoltmeter.Thedatameasuredwillthenbeinputintothemicro-computersystemtoexecutesuchfunctionslikecalculating,storing,controlling,anddisplaying.ThedigitalvoltmetercontrolsystemdescribedinthispapermakesuseofAT89C51SCcomputerandADC0809A/Dconvertertofulfillthedesigningofthesoftwareaswellastheelectricalcircuit.Thevoltmeterfeaturesinsimpleelectricalcircuit,loweruseofelements,lowcostandautomaticregulation,whileitcanalsoeasilycarryoutthedutiesofmeasuringA/Dconvertedvaluesfrom8routesandremotetransferofmeasuringdata.Themeteriscapableofmeasuringvoltagefrom0to5volt,anddisplayingthemeasurementsinturnoronlythatfromaselectedroute,andusesoftwareISISofProteustorealizethecircuitdesignandsimulation.。Keywords:Singlechipmicrocomputer;digitalVoltmeter;A/DswitchADC0809;Proteus1绪论随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。同时随着微电子技术的迅速发展和超大规模集成电路的出现,特别是单片机的出现,正在引起测量控制仪表领域的新的技术革命[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.3A/D转换子程序流程图A/D转换子程序流程图,如图8所示:开始初始化启动A/D转化P3.1=1?P3.0置位,允许输出。将转化的数据保存结束YN图8A/D转换子程序流程图4.4数据处理子程序流程图数据处理子程序流程图,如图98所示:开始从34H中取数据,乘以19.5mv,得到的数据BCD麻化,将数据存入A转化双字节十六进制整数BCD码带进位自身相加,十进制调整R2=0?数据输入显示器结束NY图9数据处理子程序流程图5源代码LED1EQU30H;初始化定义LED2EQU31HLED3EQU32H;存放三个数码管的段码ADCEQU35H;存放转换后的数据STBITP3.2OEBITP3.0EOCBITP3.1;定义ADC0809的功能控制引脚ORG0000HLJMPMAIN;跳转到主程序执行ORG0030HMAIN:MOVLED1,#00HMOVLED2,#00HMOVLED3,#00H;寄存器初始化CLRP3.4SETBP3.5CLRP3.6;选择ADC0809的通道2WAIT:CLRSTSETBSTCLRST;在脉冲下降沿启动转换JNBEOC,$;等待转换结束SETBOE;允许输出信号MOVADC,P1;暂存A/D转换结果CLROE;关闭输出MOVA,ADC;将转换结果放入A中,准备个位数据转换MOVB,#50;变换个位调整值50送BDIVABMOVLED1,A;将变换后的个位值送显示缓冲区LED1MOVA,B;将变换结果的余数放入A中,准备十分位变换MOVB,#5;变换十分位调整值5送BDIVABMOVLED2,A;将变换后的十分位值送LED2MOVLED3,B;最后的余数作百分位值送LED3LCALLDISP;调用显示程序AJMPWAITDISP:MOVR1,#LED1;显示子程序CJNE@R1,#5,GO;@R1=5V?是往下执行,否,则到GOMOVLED2,#0H;是5V,即最高值,将小数的十分位清零MOVLED3,#0H;将小数的百分位清零GO:MOVR2,#3;显示位数赋初值,用到3位数码管MOVR3,#0FDH;扫描初值送R3DISP1:MOVP2,#0FFH;关闭显示,目的防止乱码MOVA,@R1;显示值送AMOVDPTR,#TAB;送表首地址给DPTRMOVCA,@A+DPTR;查表取段码CJNER2,#3,GO1;判断是否个位数码管?否则跳到GO1ORLA,#80H;将整数的数码管显示小数点GO1:MOVP0,A;送段码给P0口MOVA,R3MOVP2,A;送位码给P2口LCALLDELAY;调用延时MOVR3,ARLA;改变位码MOVR3,AINCR1;改变段码DJNZR2,DISP1;三位是否显示完?否则调到DISP1RETDELAY:MOVR6,#10;延时5S程序:D1:MOVR7,#250DJNZR7,$DJNZR6,D1RETTAB:DB3FH,06H,5BH,4FH,66H;共阴极数码管显示0-4;显示数据表:DB6DH,7DH,07H,7FH,6FH;显示5-9END6.C源代码7.#includereg51.h8.#includeabsacc.h9.#includeintrins.h10.#defineucharunsignedchar11.#defineuintunsignedint12.#defineSEG_OUTP2//段码输入端口13.#defineBIT_OUTP1//扫描口14.sbitRED_LED=P3^6;15.sbitYED_LED=P3^5;16.sbitSPER=P3^7;17.sbitdot=P2^7;18.sbitST=P3^0;19.sbitOE=P3^1;20.sbitEOC=P3^2;21.sbitCLE=P3^4;22.uintdatagetdata;23.uinttemp;24.uintnum;25.ucharts50ms=0;26.uchardatadis_buff[4]={0,0,0,0};27.unsignedcharcodediaput[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};28./////////////////////////////////////////////29.voiddelayd(ucharn)30.{31.ucharL,j;32.for(L=0;Ln;L++)33.34.for(j=0;j125;j++)35.;36.}37./////////////////////////////////////////////38.voiddelay(void)39.{40.uchari;41.while(i--);42.}43.44.//////////////////////////45.voidinitiation(void)46.{47.TH0=-100/256;48.TL0=-100%256;49.TMOD=0X01;50.TR0=1;51.ET0=1;52.EA=1;53.//while(1);54.}55.///////////////////////////////////////56.voiddiaplay(void)//数码管显示57.{58.chark;59.charm=0xfe;60.for(k=0;k4;k++)61.{62.BIT_OUT=0xff;63.SEG_OUT=diaput[dis_buff[k]];64.if(k==1)65.dot=0;66.BIT_OUT=m;67.delayd(3);68.m=(m1)|0x01;69.}70.temp=getdata*1.0/255*500;//测5V71.temp=getdata*100.0/255.0*12.0;//测12v72.temp=getdata*200.0/255.0*12.0;//测24v73.dis_buff[0]=temp/1000;74.dis_buff[1]=(temp%1000/100);75.dis_buff[2]=(temp%100)/10;76.dis_buff[3]=temp%10;77.}78.79.80.voidtime0(void)interrupt181.{82.83.TH0=-100/256;//200us84.TL0=-100%256;85.num++;86./*if(num==2)87.{num=0;88.*/89.CLE=~CLE;//产生200ms的脉冲90.91.ts50ms=0;92.if(ge