电阻测量原理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Buf[4]=10;
for(i=1;i<8;i++) {
Write_com(0x80+i); Write_data(table_dat[Buf[i]]); } }
AD.h 文件
sbit sbit
AD_wr AD_rd
=P3^6; =P3^5;
//AD 数据口
unsigned int i,Count,temp,sum; unsigned char Collection_flag;
//
显示
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; }
基于单片机的万用表设计原理
此项目由我们专业几个人合作完成,学习电子设计初期经历了不 少困难,现在展示与网上供兴趣爱好者查阅。本团队承接电气工程及 其自动化专业毕业设计,望广大朋友们支持,假如有意者加 QQ: 1396654916 祥聊,或者发到我 QQ 邮箱 1396654916@qq.com
此次设计是运用 STC89RC52 单片机、ADC0804、555 定时器制作 万用表,可以初略测量交流、直流的电压、电流;电阻;电容。
void Time_init_capacitandce() {
TMOD=0x01; EA=1;ET0=1; TL0=0; TH0=0; WaveInput=1; }
void main() {
Lcd_init(); Time_init_capacitandce();
while(1) {
Key_scan(); } }
float Volts_dc50V() {
static unsigned char b;
b=AD_change(); volts_dc=b*(2*Vref*10.0/256.0); return (volts_dc); } /*****************************************************
while(WaveInput==1);
while(WaveInput==0);
TRபைடு நூலகம்=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);
float Volts_ac30V() {
volts_ac=(sum/Count*(10.0*Vref/256.0))*2-0.7; sum=0;Count=0; return (volts_ac); } /*****************************************************
// 显示数组
void delayms(unsigned char n) {
static unsigned char i;
// 5ms 延时
for(;n>0;n--) for(i=110;i>0;i--);
}
void Write_com(unsigned char com) {
Lcdrs=0;Lcdwr=0; P2=com;delayms(5); Lcden=1;delayms(5);Lcden=0; }
0. 7V 为整流管的压降(0.7)
4 交流电流
测量原理和测量交流电压类似。原理图如下
算法 5mA 量程: current_ac=sum/Count*(2*Vref/256.0)-0.7; 50mA 量程: current_ac=sum/Count*(2*10.0*Vref/256.0)-0.7; 5 电阻的测量
交流电流档
*******************************************************/ float Current_ac5mA() {
current_ac=sum/Count*(2*Vref/256.0)-0.7; sum=0;Count=0; return (current_ac); }
3 交流电压的测量
交流电压的测量比较复杂,笔者进行了诸多的实验,最终觉得采 用交流采样法比较好,主要是误差较小。测量原理:把输入的交流电 压通过半波或全波整流后进行 AD 采样,本设计采用半波整流,对多 次采集的数据进行求和,对采样的数据求平均值,最后把平均值送到 LCD1602 显示数据,就得到交流电压的有效值 Ualue=Uave-0.7.
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);
算法
2K 量程
Res_value=AD_Ave*2/256.0;
200K 量程 Res_value= AD_Ave*200/256.0;
6 电容的测量
测量电容不用 ADC0804,采用 555 定时器,利用直接反馈型无稳
电路产生方波。用单片机测量方波的周期(定时器 0),通过周期计
算电容值
测量电路
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++; }
直流电压档 *******************************************************/ float Volts_dc5V() {
static unsigned char a;
a=AD_change(); volts_dc=a*(2*Vref/256.0); return (volts_dc); }
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."};
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;
计算公式: 量程 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 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 输出数据
假如需要测量交流电压的峰值,即在整流二极管够串联一个电 容,采集电容两端的电压即可(由于二极管的单向导电性,电容充满 电后不能放电,即为脉动电压的峰值)
交流电压连接图
算法:
3V 量程
volts_ac=(sum/Count*(Vref/256.0))*2-0.7;
30V 量程
volts_ac=(sum/Count*(10.0*Vref/256.0))*2-0.7;
float Current_ac50mA() {
current_ac=sum/Count*(2*10.0*Vref/256.0)-0.7; sum=0;Count=0; return (current_ac); }
/***************************************************** 直流电流档
/***************************************************** 交流电压档
*******************************************************/ float Volts_ac3V() {
volts_ac=(sum/Count*(Vref/256.0))*2-0.7; sum=0;Count=0; return (volts_ac); }
//定义数据口
void Write_data(unsigned char Data)
{
Lcdrs=1;
P2=Data;delayms(5);
//数据输出
Lcden=1;delayms(5);Lcden=0;
}
void Lcd_display(float display_Data) {
unsigned int afloat,aint; static unsigned char Buf[8];
*******************************************************/ float current_dc5mA() {
static unsigned char c;
c=AD_change(); current_dc=c*(2*Vref/256.0); return (current_dc); }
电阻的测量采用的事比例法,原理为: Vin/Vref=Rx/R0;
由 ADc0804 的特性得:当 Vin=Vref 时,AD 输出 128;由此得到 当 R0=1K 时 Rx=1K;所以 Rx=2*AD_Ave*R0/256;以此类推。
这种测量电阻的方法采用外部电源供电;需要把前面 AD 系统给 参考电压置 0。 电路如图所示
float current_dc50mA() {
}
变量 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"
#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); }
1ADC0804 部分 用 ADC0804 采集电压信号,参考电压为 2.5V 输入到 ADC0804,把
被测电压将输入到芯片 Vin+和 Vin-上,通过运算即可得到电压测量 值。 ADC0804 连接电路如图
2 直流电压测量
电路图 运算法则:5 V 量程 a=AD_change();volts_dc=a*(2*Vref/256.0);