您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于8051单片机的简易电压表设计
单片机课程设计—简易直流电压表班级:电信四班姓名:彭飞宇学号:2220081336摘要电压表应用十分广泛,但大部分是模拟电压表,而由于其特性,反应速度慢,读数麻烦并且误差较大,所以为适应不断快速发展的高速信号领域,已经广泛使用数字电压表。本实验设计是基于51单片机开发平台实现的一种数字电压表系统。该设计采用8051单片机作为控制核心,以ADC0809为模数转换数据采样,实现被测电压的数据采样;通过外围分压电路实现5V和50V的换档;同时使用5V稳压管作为超范围的保护电路;用8255驱动控制四块数码管显示被测电压。1.设计任务和要求1.1设计任务设计制作一个简易直流电压表,该直流电压表能测量直流电压1.2设计要求基本要求1.能测量电压档0--5V0--50V两档,输入阻抗200K输入电压AD转换器控制器显示测量值2.数码显示共3位,其中一位小数3.要有输入信号超范围的保护电路发挥部分1.能够测量交流电压(0—500V)2.能够测量电阻二设计方案和部分仿真2.1硬件:上图为硬件的总体框图,可分为四个模块。模数转换使用ADC0809芯片,它将输入的模拟电压量转换为一个8位的二进制数字,然后进入到单片机80C51控制单元,经过8255驱动处理用数码管显示出电压值。外围电路是一种分压电路,由于ADC0809芯片输入电压不可大于5V,所以当测量50V档位的时候要通过分压电路来实现。同时还有控制单片机显示程序,使其显示为50V档位数值。(1)以下介绍MCS-51单片机的内部结构,主要部分为1.一个8位的CPU2.128B或256B单元数据存储器(RAM)电压模拟量输入外电路模数转换模块微控制器模块数码管显示模拟量数字量控制转换程序处理图1硬件框图3.4KB或8KB内程序存储器(ROM或EPROM)4.4个8位并行I/O接口P0~P35.两个定时/计数器6.5个中断源管理控制系统7.一个全双工串行I/OUART(通用异步接受、发送器)8.一个片内振荡器和时钟产生电路(2)ADC0809ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。ADC0809内部逻辑电路如下:ADC0809引脚图如下:引脚说明:1.ADC0809内部带有输出锁存器,可以与单片机直接相连。2.初始化时,使ST和OE信号全为低电平。3.送要转换的某一通道的地址到A.B,C端口上。4.在ST端给出一个至少有100ns宽的正脉冲信号。5.是否转换完毕,我们根据EOC信号来判断。6.当EOC变为高电平时,若此时OE为高电平,转换的数据输出到单片机2.2软件程序:单片机中所发程序的流程图如下图2。其中包含主函数和两个显示子函数,分别为5V和50V档位的显示子程序。通过外围电路的改变实现换档。下面为仿真所用程序#includereg52.hunsignedcharcodedispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardispbuf[4];unsignedinti;unsignedintj;unsignedchargetdata;unsignedinttemp;unsignedinttemp1;unsignedcharcount;开始初始化(8255,中断)进行AD转换调用5V显示子程序调用50V显示子程序转换结束标志位为1标志位为0循环执行图2程序框图unsignedchard;sbitST=P3^0;sbitOE=P3^1;sbitEOC=P3^2;sbitCLK=P3^3;sbitP34=P3^4;sbitP35=P3^5;sbitP36=P3^6;sbitP20=P2^0;sbitP21=P2^1;sbitP22=P2^2;sbitP23=P2^3;sbitP17=P1^7;voidTimeInitial();voidDelay(unsignedinti);voidTimeInitial(){TMOD=0x10;TH1=(65536-200)/256;TL1=(65536-200)%256;EA=1;ET1=1;TR1=1;}voidDelay(unsignedinti){unsignedintj;for(;i0;i--){for(j=0;j125;j++){;}}}voidDisplay(){P1=dispbitcode[dispbuf[3]];P20=0;P21=1;P22=1;P23=1;Delay(10);P1=0x00;P1=dispbitcode[dispbuf[2]];P17=1;P20=1;P21=0;P22=1;P23=1;Delay(10);P1=0x00;P1=dispbitcode[dispbuf[1]];P20=1;P21=1;P22=0;P23=1;Delay(10);P1=0x00;P1=dispbitcode[dispbuf[0]];P20=1;P21=1;P22=1;P23=0;Delay(10);P1=0x00;}voidmain(){TimeInitial();while(1){ST=0;OE=0;ST=1;ST=0;P34=0;P35=0;P36=0;while(EOC==0);OE=1;getdata=P0;OE=0;temp=getdata*1.0/255*500;dispbuf[0]=temp%10;dispbuf[1]=temp/10%10;dispbuf[2]=temp/100%10;dispbuf[3]=temp/1000;Display();}}voidt1(void)interrupt3using0{TH1=(65536-200)/256;TL1=(65536-200)%256;CLK=~CLK;}2.3模拟仿真结果图3按上述原理连接后,用Proteus软件模拟仿真可以得到完整电路图。如图3所示,仿真结果如图所示。2.实际制作和调试2.1测试方法和仪器所用到的元器件有:80C51单片机1片8255芯片1片ADC0809芯片1片4数码管4块12MHZ晶振1个5V稳压管1只滑动变阻器(20K)2个510K电阻1个51K电阻1个直流电源1台导线若干实验室中有实验箱,可以用实验箱完成,这样就省去了许多元器件,也使得系统稳定可行。可用标准直流电压表来测量输入的直流电压值,与数码管显示的数值比较测试。2.2软件调试为了适应试验箱上管脚连接和,对仿真程序加以修改,修改之后的程序如下:#includereg52.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#definePAXBYTE[0x8000]#definePBXBYTE[0x8001]#definePCXBYTE[0x8002]#defineCTLXBYTE[0x8003]#defineADXBYTE[0x9000]//AD转换in0口#definedusPB#definewesPAucharcodedutab[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};ucharcodewetab[4]={0x01,0x02,0x04,0x08};bitflag=0;floatnum=0;uchartmp=0;sbitEOC=P3^2;voiddelay(uchar);voidinit(){CTL=0x80;EA=1;EX1=1;IT1=1;}voiddisplay(floatcnt){ucharpos[4]={0,0,0,0};uchari=0;ucharj;uintn;n=cnt*1000;//wes=0;while(n){pos[i++]=n%10;n/=10;}for(j=0;j3;j++){dus=dutab[16];wes=wetab[j];dus=dutab[pos[j]];//wes=wetab[j];delay(2);}dus=dutab[16];wes=wetab[3];dus=dutab[pos[3]]|0x80;//wes=wetab[3];delay(2);dus=dutab[pos[3]];}voiddisplay1(floatcnt){ucharpos[4]={0,0,0,0};uchari=0;ucharj;uintn;n=cnt*100;while(n){pos[i++]=n%10;n/=10;}for(j=0;j2;j++){dus=dutab[16];wes=wetab[j];dus=dutab[pos[j]];delay(2);}dus=dutab[16];wes=wetab[2];dus=dutab[pos[2]]|0x80;delay(2);dus=dutab[pos[2]];dus=dutab[16];wes=wetab[3];dus=dutab[pos[3]];delay(2);}voiddelay(ucharz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voidmain(){init();while(1){AD=0;EOC=1;while(!EOC);PA=AD;tmp=AD;num=tmp/255.0*5;if(flag)display(num);elsedisplay1(num*10);}}voidint1()interrupt2{flag=~flag;}2.3硬件测试按实验箱内部连线接好之后,再按先前设计好的外围电路,与实验箱接上,接入可变直流电压源,观察数码管显示数值是否与标准电压表一致。可以通过加入单脉冲来改变数码管显示的小数点的位置,改变电压输入点,改变档位,从而实现5V和50V的换档。2.4调试中的问题记录1.在50V档位时,所测电压有点误差,如:输入32.65V,测得结果为34.56V,这是因为外围电路的分压作用没有调节好,没有达到1/10的分压效果。可以调节外围电路的滑动变阻器,使其显示示数正确。2.显示示数余辉过于强烈,通过检查8255的接线有点松动,把每个线都一一检查固牢后,虽仍有余辉,但不过于强烈。3.测试结果分析组数直流电压源单片机显示误差11.22V1.2170.8%22.63V2.5751.9%36.25V06.330.9%415.63V15.580.3%通过上述结果分析,当在5V档位时,测量较高值时测量精度有点低,误差大。但数值小的时候测量精度很高。不足之处是本设计的外围分压电路是通过510K和50K电阻串联分压方式,并通过调节电位器来实现1/10的分压效果,实际最好是450K和50K,这样恰好是分出十分之一电压,但实际电路受到电压源等因素影响较大,这之间会因为电压值的不同而引起效果好坏的改变,可以考虑用运算放大器来设计一个精确而又稳定的分压电路。对于过压保护电路,由于实验室没有提供MOS管,故只能采用5.1V的稳压管来实现电路过压保护作用。由于稳压管容易烧坏,所以在电压源开机瞬间,不可使电压源内电压过高,否则稳压管会烧坏。4.课程设计总结本次课程设计中0-5V档与0-50V档没有本质的区别,因为是通过外围分压电路将输入电压缩小10倍,从而转换为0-5V档,而在显示结果时只需将数码管的小数点右移一位即成为正确的输入电压。对于ADC0809的分辨率应该是v/255,v为该档位的最大电压,5V的分辨率只有0.02V左右。但此设计中使用C语言程序编译,使用的是浮点数,故显示时不会受缚于0.02V的分辨率。总体来说通过本次实验,用Proteus进行仿
本文标题:基于8051单片机的简易电压表设计
链接地址:https://www.777doc.com/doc-2567941 .html