求基于单片机的万用表,可以测量电压电阻电流的原理图和程序

求基于单片机的万用表,可以测量电压电阻电流的原理图和程序,第1张

电压比较简单,通过运放进行比例放大,将电压值控制在AD转换器的范围内

如果运放的电阻配置采用数字电位器,就可以实现无需调节量程的测量

电流比较麻烦,内阻必须做到尽量小,用01欧姆的高精密电阻串联,两端取电压,经过比例放大电路转换到AD采样范围内

电阻测量:(1)普通精度可以用电压电流法,需要一定高的电压加在上面

(2)高精度测量需要使用电桥来搞,这个普通万用表都没有的

电容测量,电感测量:

电容可采样RC延时充电法,振荡频率法

电感可以采样震荡频率法

我才用的单片机为STC89C52RC,晶振12M。模数转换器为ADC0832。代码如下:

/

程序功能: 模数转换器实现数字电压表

程序测试: 程序下载成功后,通过调节小系统左上方的

精密电位器,模拟电压的变化,数码管将显

示出当前的电压值

硬件说明: 用跳线帽把AD转换器左侧J13的AIN和CH0管脚

短接,用螺丝刀调节精密电位器VR2可以看到

当前电压值的改变

/

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit CS = P1^0; //片选信号

sbit CLK = P1^1; //时钟线

sbit DI = P1^2; //数据写入

sbit DO = P1^2; //数据读出,因为没有同时使用所以复用P12管脚

uchar aa,bb,cc,dd,ee;

uchar idata ram[1]; //定义一个存储空间来存储转化好的数字量

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管编码

uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,

0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//共阳数码管带小数点编码

void delay(uint z)//延时子函数

{

uint x,y;

for(x = z;x >0;x--)

for(y = 110;y > 0;y--);

}

uchar Adc0832(bit polarity,bit channel); //待调用子函数声明

void Display(uchar data1,uchar data2,uchar data3,uchar data4,uchar data5);

void Data_Process();

void main()

{

while(1)//死循环,程序反复执行

{

Data_Process(); //AD转化,数据处理

Display(aa,bb,cc,dd,ee);//数码管显示当前电压值

}

}

/

函数名称:Adc0832

功 能:实现AD转换

参 数:AD转换通道选择,输入信号极性选择

返回值 :AD转换后电压值

/

uchar Adc0832(bit polarity,bit channel)// AD转换子程序

{

uchar i,get_data1 = 0,get_data2 = 0;

CLK = 0;

DI = 1; //第一个时钟上升沿,DI=1,发出起始信号

CS = 0;

CLK = 1;

CLK = 0;

DI = polarity; //第二个时钟上升沿,极性选择

CLK = 1;

CLK = 0;

DI = channel; //第三个时钟上升沿,通道选择

CLK = 1;

CLK = 0;

DI = 1; //DI置1,防止干扰输入数据(输入、输出管脚复用)

for(i = 0;i < 8;i++)//分八次,从高到低的顺序把八位数据读出

{

CLK = 1;

CLK = 0;

if(DO) //在时钟的上升沿来临之前读走数据

{

get_data1 |= 0x80 >> i;

}

}

for(i = 0;i < 8;i++)//分八次,从低到高的顺序再读取一次数据

{

if(DO)

{

get_data2 |= 0x01 << i;

}

CLK = 1;

CLK = 0;

}

CS = 1; //数据读写完后释放总线: CS DI CLK 置1

DI = 1;

CLK = 1;

if(get_data1 ==get_data2)//如果两个值相等,则数据传输正确

{

ram[0] = get_data1; //把正确的的数字量存在RAM[0]中

}

return(ram[0]);//把AD转换值返回

}

/

函数名称:Display

功 能:数码管动态显示

参 数:五位数码管对应显示值

返回值 :无

/

void Display(uchar data1,uchar data2,uchar data3,uchar data4,uchar data5)

{

P0 = table2[data1];

P2 = 0xfe; //

delay(1);

P0 = 0xff;

P0 = table[data2];

P2 = 0xfd;

delay(1);

P0 = 0xff;

P0 = table[data3];

P2 = 0xfb;

delay(1);

P0 = 0xff;

P0 = table[data4];

P2 = 0xf7;

delay(1);

P0 = 0xff;

P0 = table[data5];

P2 = 0xef;

delay(1);

P0 = 0xff;

}

/

函数名称:Data_Process

功 能:数据处理子函数,实现转化后的数据各位值

的分离

参 数:无

返回值 :无

/

void Data_Process()

{

uchar get_data;

uint data_temp;

get_data = Adc0832(1,0);//调用AD转换子程序,单极性信号,通道0

data_temp = get_data 196;//AD转换后的数据乘以分辨率,为便于处理分辨率放大10000倍

aa = data_temp / 10000;

bb = data_temp % 10000 / 1000;

cc = data_temp % 10000 % 1000 / 100;

dd = data_temp % 10000 % 1000 % 100 / 10;

ee = data_temp % 10000 % 1000 % 100 % 10;

}

假设单片机电源电压33V,这就是基准电压(一般单片机是这样),ADC是10位的,满量程设为VM。由于没法自己测量自己的电压,需要一个参考电压,比如接一个2V稳压管,测量稳压管上的压降,设为VZ。当VZ>2VM/36时,单片机电源电压大于36v了。

以上就是关于求基于单片机的万用表,可以测量电压电阻电流的原理图和程序全部的内容,包括:求基于单片机的万用表,可以测量电压电阻电流的原理图和程序、单片机怎么采集电压表的信号、用单片机检测电源电压是否大于3.6v其程序如何写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9613574.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存