1、1基于 51 单片机数字万用表摘要:本设计采用 AT89C52 为主控芯片配以振荡电路设计设计了一个数字万用表,可用于测量直流电压,直流电流,电阻和电容,并配以档位转换。本系统使用 ADC0832 作为数据转换芯片,LM358 作为放大芯片,通过 LCD1602 显示,各模块主要通过 AD 转换以及电压放大实现测量功能。绪论:数字多用表(GMM)就是在电气测量中要用到的电子仪器。它可以有很多特殊功能,但主要功能就是对电压、电阻和电流进行测量。传统的指针式万用表功能单精度低,不能满足数字化时代的需求,采用单片机制作的数字万用表,具有精度高、抗干扰能力强,可扩展力强、集成方便等优点,目前,由各种单
2、片机芯片构成的数字电万用表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,显示出强大的生命力。总体设计设计方案:21.电压测量原理与 AD 转换电路ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道A/D 转换芯片。其最高分辨可达 256 级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在 05V 之间。芯片转换时间仅为 32S,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过 DI 数据输入端,可以轻易的实现通道功能的选择。
3、本系统只对 CH0 进行单通道转换。单片机AD 电路 分压电路AD 电路 放大电路放大电路路路功能开关显示电路晶振电路电压电流电阻振荡电路电容电压信号输入 分压 AD 转换 单片机显示3电压测量流程图对于本设计分压电路模块介绍之前首先分析以下两种设计方案。多量程分压电路多量程分压器原理上述两图所制作的多量程电压测量,其内阻比较小,不能达到测量要求,对电路做以下改进。4对于本次设计的电压模块只设置 5V,30V 两个档位,如图直接采用一组分压电路既可达到要求。2.电流测量原理与放大电路对于电流模块此处给予多种方案:(本系统采用的方案二)方案一:原理:通过改变检流电阻的大小实现不同档位的转换。5图
4、中保险丝可保护电流过大,二极管防止电压过大,当二极管两端电压达到导通电压,检流电阻连端电压将达到稳定,从而有效的控制输入电压的大小。方案二:6电流测量原理与方案一基本相同,但在相同电流的测量上此电路比方案一电路的内组更小,由于加入了运算放大器,所以最大的输出电压不会超过电源电压(实验数据显示不会超过 3.6V)并不用担心检流电阻两端电压大小。而且此方案还有一个最大的优势,它的分辨率更高,理由如下:根据 ADC0832 的最小分辨率 x 可知,此方案中测量电流的最小分辨电流 i 满足 i*R*k=x(R 为检流电阻,k 为放大器放大倍数),得到i=x/(R*k)在方案一中,i=x/R ,由于电阻
5、材质的问题其本身电压不能超过额定电压,在量程相同的情况下 Imax*R*k=3,Imax*RR即 iv(1010+R).v 是最小输入电压。根据上述说明可以得出各个档位测量范围。档位 1(V=0.05,v=0.0003),R13)dat0=(153000/add-1010)/1000;dat1=(153000/add-1010)/100)%10;dat2=(153000/add-1010)/10)%10;dat3=(153000/add-1010)%10;writedate(0xc0,dat0+0);writedate(0xc1,dat1+0);writedate(0xc2,dat2+0);
6、writedate(0xc3,dat3+0);elsewritedate(0xc0,1);14if(date1=5) /电阻档位 2add=AAD_read();if(add16)dat0=(168300/add-101)/1000;dat1=(168300/add-101)/100)%10;dat2=(168300/add-101)/10)%10;dat3=(168300/add-101)%10;writedate(0xc0,dat0+0);writedate(0xc1,dat1+0);writedate(0xc2,.);writedate(0xc3,dat2+0);writedate(0x
7、c4,dat3+0);elsewritedate(0xc0,1); if(date1=6) /电阻档位 3 add=AAD_read(); if(add15) dat0=(1545300/add-101)/10000;dat1=(1545300/add-101)/1000)%10;dat2=(1545300/add-101)/100)%10;dat3=(1545300/add-101)/10)%10;writedate(0xc0,dat0+0);writedate(0xc1,dat1+0);writedate(0xc2,dat2+0);writedate(0xc3,.);writedate(0
8、xc4,dat3+0);elsewritedate(0xc0,1); if(date1=7) /电容档位 1TR0=0;if(add51)dat0=(505000/add)/1000;dat1=(505000/add)/100)%10;dat2=(505000/add)/10)%10;dat3=(505000/add)%10;writedate(0x80,dat0+0);writedate(0x81,dat1+0);writedate(0x82,dat2+0);15writedate(0x83,.);writedate(0x84,dat3+0);elsewritedate(0x80,1); a
9、dd=0;if(date1=8) /电容档位 2TR0=0;if(add51)dat0=(505000/add)/1000;dat1=(505000/add)/100)%10;dat2=(505000/add)/10)%10;dat3=(505000/add)%10;writedate(0x80,dat0+0);writedate(0x81,dat1+0);writedate(0x82,dat2+0);writedate(0x83,.);writedate(0x84,dat3+0);elsewritedate(0x80,1); add=0;if(date1=9) /电容档位 3(此档位不可用)
10、TR0=0;writedate(0xc0,add/10000000+0);writedate(0xc1,(add/1000000)%10+0);writedate(0xc2,(add/100000)%10+0);writedate(0xc3,(add/10000)%10+0);writedate(0xc4,(add/1000)%10+0);writedate(0xc5,(add/100)%10+0);writedate(0xc6,(add/10)%10+0);writedate(0xc7,(add)%10+0);add=0;time=18;16TH0=0x3c;TL0=0xb0;void ke
11、yboat() interrupt 2 /功能转换开关 unsigned char trange=200;if(key_boat=0) delay(50);if(key_boat=0)key+;TR0=0; if(key11)key=1; TR0=1;writeadd(1);switch(key)case 1: writedate(0x80+13,U);writedate(0x80+14,5);writedate(0x80+15,v);break;case 2: writedate(0x80+12,U) ;writedate(0x80+13,3); writedate(0x80+14,0);w
12、ritedate(0x80+15,v);break;case 3: writedate(0xc0+11,I) ;writedate(0xc0+12,1); writedate(0xc0+13,0);writedate(0xc0+14,m);writedate(0xc0+15,A);break;case 4: writedate(0xc0+11,I) ;writedate(0xc0+12,8); writedate(0xc0+13,0);writedate(0xc0+14,m);writedate(0xc0+15,A);break;case 5: writedate(0xc0+10,I) ;wr
13、itedate(0xc0+11,1); writedate(0xc0+12,5);writedate(0xc0+13,0);writedate(0xc0+14,m);writedate(0xc0+15,A);break;case 6: writedate(0xc0+13,R);writedate(0xc0+14,9);writedate(0xc0+15,K);break;case 7: writedate(0xc0+12,R) ;writedate(0xc0+13,9); writedate(0xc0+14,9);writedate(0xc0+15,K);break;case 8: write
14、date(0xc0+11,R) ;writedate(0xc0+12,9); writedate(0xc0+13,9);writedate(0xc0+14,9);writedate(0xc0+15,K);break;case 9: writedate(0x80+12,C); writedate(0x80+13,=);writedate(0x80+14,u);writedate(0x80+15,F);break;case 10:writedate(0x80+12,C); writedate(0x80+13,=);writedate(0x80+14,n);writedate(0x80+15,F);
15、break;17case 11:writedate(0x80+10,e) ;writedate(0x80+11,r); writedate(0x80+12,r);writedate(0x80+13,o);writedate(0x80+14,r);break;date=key;date1=key-2; delay(50);while(key_boat=0key_boat=1;TR0=1;unsigned char AAD_read() /电流测量端数据接收函数unsigned char dat,i,test=0,adval=0;AAD_CLK=0;/AAD_D1=1;_nop_();AAD_CS
16、=0;_nop_();AAD_CLK=1;_nop_();AAD_CLK=0; /AAD_D1=0;_nop_();AAD_CLK=1;_nop_();AAD_CLK=0; /AAD_D1=0;_nop_();AAD_CLK=1;_nop_();AAD_CLK=0;AAD_D1=1;for(i=0;i=1;if(AAD_D0)test|=0x80;AAD_CLK=1;_nop_();AAD_CLK=0;if(adval=test)dat=test;_nop_();AAD_CS=1;AAD_D0=1;AAD_D1=1;AAD_CLK=1;return dat;unsigned char AVD_
17、read() /电压测量端 ADC0832 数据接收函数unsigned char dat,i,test=0,adval=0;AVD_CLK=0;/AVD_D1=1;_nop_();AVD_CS=0;_nop_();AVD_CLK=1;_nop_();AVD_CLK=0; /19AVD_D1=0;_nop_();AVD_CLK=1;_nop_();AVD_CLK=0; /AVD_D1=0;_nop_();AVD_CLK=1;_nop_();AVD_CLK=0;AVD_D1=1;for(i=0;i=1;if(AVD_D0)test|=0x80;AVD_CLK=1;_nop_();AVD_CLK=
18、0;if(adval=test)dat=test;_nop_();AVD_CS=1;AVD_D0=1;AVD_D1=1;AVD_CLK=1;return dat;20显示函数#include“lcd.h“void delay(unsigned char i)unsigned char j=100;while(i0)j=100;while(j-);i-;void writeadd(unsigned char add) /写入指令check();E=0;RS=0;RW=0;delay(1);LCD=add;delay(1);E=1;delay(1);E=0;delay(1);void check(
19、)RS=0;RW=1;delay(1);E=1;while(LCDE=0;delay(1);void writedate(unsigned char add,unsigned char date) /写入地址和数据writeadd(add);check();21E=0;RS=1;RW=0;delay(1);LCD=date; delay(1);E=1;delay(1);E=0;delay(1);void init()writeadd(0xc);writeadd(0x3c);显示函数头文件#ifndef LCD_H#define LCD_H#include“reg51.h“#include#define LCD P0sbit RS=P26;sbit RW=P25;sbit E=P27;void delay(unsigned char i);void writeadd(unsigned char add);void writedate(unsigned char add,unsigned char date);void check();void init();#endif