当前位置:文档之家› 交流电压表设计

交流电压表设计


计算公式: 量程 200UF float Capacitandc_Cycle200UF() { static float Cycle=0,Count=0,sum=0,ave=0; unsigned char i; for(i=0;i<10;i++) { WaveInput=1; TL0=0; TH0=0; T0IntCount=0; TR0=0; while(WaveInput==0); while(WaveInput==1); while(WaveInput==0); TR0=1;
*******************************************************/ float current_dc5mA() {
static unsigned char c;
c=AD_change(); current_dc=c*(2*Vref/256.0); return (current_dc); }
float AD_change() {
static unsigned char Data;
AD_wr=1; AD_wr=0; AD_wr=1; while(INT1==1); P1=0xff; AD_rd=0; Data=P1; AD_rd=1; return (Data); }
//等待 AD 转换 //清空 P1 口 // P1 为 ad 输出数据
float Volts_dc50V() {
static unsigned char b;
b=AD_change(); volts_dc=b*(2*Vref*10.0/256.0); return (volts_dc); } /*****************************************************
1ADC0804 部分 用 ADC0804 采集电压信号,参考电压为 2.5V 输入到 ADC0804,把
被测电压将输入到芯片 Vin+和 Vin-上,通过运算即可得到电压测量 值。 ADC0804 连接电路如图
2 直流电压测量
电路图 运算法则:5 V 量程 a=AD_change();volts_dc=a*(2*Vref/256.0);
基于单片机的万用表设计原理
此项目由我们专业几个人合作完成,学习电子设计初期经历了不 少困难,现在展示与网上供兴趣爱好者查阅。本团队承接电气工程及 其自动化专业毕业设计,望广大朋友们支持,假如有意者加 QQ: 1396654916 祥聊,或者发到我 QQ 邮箱 1396654916@
此次设计是运用 STC89RC52 单片机、ADC0804、555 定时器制作 万用表,可以初略测量交流、直流的电压、电流;电阻;电容。
/***************************************************** 交流电压档
*******************************************************/ float Volts_ac3V() {
volts_ac=(sum/Count*(Vref/256.0))*2-0.7; sum=0;Count=0; return (volts_ac); }
void Time0() interrupt 1 {
T0IntCount++; TL0=0; TH0=1; }
Display.h 文件
sbit Lcdrs sbit Lcdwr sbit Lcden
=P3^0; =P3^1; =P3^2;
//
1602 初始化
// 脉冲引脚
//液晶数据口
unsigned char code table_dat[]={"0123456789."};
}
变量 WaveInput 为 P3^5
I/O 口。
式 Count=(Cycle*33.0)/10.0;中。Count 单位 uF;Cycle 单位 ms;
10 为电阻值 10K。33.0 为常数。
R19 为 2UF 量程,由于找不到 10 欧姆电阻才用 15 欧姆的。
程序代码:由几个子程序组成 多用表.c 文件: #include "reg52.h" #include "AD_change.h"
假如需要测量交流电压的峰值,即在整流二极管够串联一个电 容,采集电容两端的电压即可(由于二极管的单向导电性,电容充满 电后不能放电,即为脉动电压的峰值)
交流电压连接图
算法:
3V 量程
volts_ac=(sum/Count*(Vref/256.0))*2-0.7;
30V 量程
volts_ac=(sum/Count*(10.0*Vref/256.0))*2-0.7;
while(WaveInput==1);
while(WaveInput==0);
TR0=0;
Cycle=(T0IntCount*65536+TH0*256+TL0)/1000.0;
Count=(Cycle*33.0)/10.0;
sum=Count+sum;
}
ave=sum/10.0;sum=0;
return (ave);
//
显示
aint=display_Data/1; afloat=(display_Data-aint)*1000;
for(i=3;i>0;i--) {
Buf[i]=aint%10; aint/=10; }
for(i=7;i>4;i--) {
Buf[i]=afloat%10; afloat/=10; }
void Volts_adchange() {
static unsigned char Data;
AD_wr=1; AD_wr=0; AD_wr=1; while(INT1==1); P1=0xff; AD_rd=0; Data=P1; AD_rd=1; sum=sum+Data; Count++; }
5 V 量程 b=AD_change();volts_dc=b*(2*Vref*10.0/256.0);
3 直流电流部分
电流测量电路
运算法则:
5mA 量程
c=AD_change();current_dc=c*(2*Vref/256.0);
5mA 量程
d=AD_change();current_dc=d*(2*Vref*10.0/256.0);
电阻的测量采用的事比例法,原理为: Vin/Vref=Rx/R0;
由 ADc0804 的特性得:当 Vin=Vref 时,AD 输出 128;由此得到 当 R0=1K 时 Rx=1K;所以 Rx=2*AD_Ave*R0/256;以此类推。
这种测量电阻的方法采用外部电源供电;需要把前面 AD 系统给 参考电压置 0。 电路如图所示
Shift.h 文件
//等待 AD 转换 //清空 P1 口 // P1 为 ad 输出数据
#define Vref (4.56)
sbit WaveInput =P3^7;
float volts_dc,current_dc,volts_ac,current_ac,resistance,capacitance; unsigned char T0IntCount=0;
算法
2K 量程
Res_value=AD_Ave*2/256.0;
200K 量程 Res_value= AD_Ave*200/256.0;
6 电容的测量
测量电容不用 ADC0804,采用 555 定时器,利用直接反馈型无稳
电路产生方波。用单片机测量方波的周期(定时器 0),通过周期计
算电容值
测量电路
float Volts_ac30V() {
volts_ac=(sum/Count*(10.0*Vref/256.0))*2-0.7; sum=0;Count=0; return (volts_ac); } /*****************************************************
交流电流档
*******************************************************/ float Current_ac5mA() {
current_ac=sum/Count*(2*Vref/256.0)-0.7; sum=0;Count=0; return (current_ac); }
float Current_ac50mA() {
current_ac=sum/Count*(2*10.0*Vref/256.0)-0.7; sum=0;Count=0; return (current_ac); }
/***************************************************** 直流电流档
3 交流电压的测量
交流电压的测量比较复杂,笔者进行了诸多的实验,最终觉得采 用交流采样法比较好,主要是误差较小。测量原理:把输入的交流电 压通过半波或全波整流后进行 AD 采样,本设计采用半波整流,对多 次采集的数据进行求和,对采样的数据求平均值,最后把平均值送到 LCD1602 显示数据,就得到交流电压的有效值 Ualue=Uave-0.7.
#include "display.h" #include "shift_key.h" #include "function.h" #include "key-scan.h"
void Lcd_init() {
Lcden=0; Write_com(0x38); Write_com(0x0c); Write_com(0x06); Write_com(0x01); }
相关主题