标题:
51单片机做的万用表仿真 功能很全面
[打印本页]
作者:
xu37479333
时间:
2017-3-27 10:48
标题:
51单片机做的万用表仿真 功能很全面
51单片机万用表仿真原理图:
万用表.gif
(1.66 MB, 下载次数: 152)
下载附件
2017-3-30 04:22 上传
万用表直流电压测量程序:
#include<reg52.h>
#include"Delay.h"
#include<KEY_FUNCTION_DEFINE.H>
#include<measure_define.h>
#include"AD.h"
#include"LCD.h"
extern uchar disp_value[5];
extern uchar key_number;
uchar code DC_disp[]="DC VOL Measure ";
uchar code DC_disp2[]="value= ";
uchar code DC_disp3[]="1 ";
sbit Buzz=P3^7;
void DC_VOL_measure(void) //直流电压测量函数
{ uchar ADTemp,num;
float ValueTemp;
WriteCom(0x01);
WriteCom(0x80); //显示
for(num=0;DC_disp[num]!='\0';num++)
{
WriteData(DC_disp[num]);
Delay(10);
}
WriteCom(0x80+0x40); //显示
for(num=0;DC_disp2[num]!='\0';num++)
{
WriteData(DC_disp2[num]);
Delay(10);
}
do{ //高电压选择端,20V~200V电压选择测量
s1=0;
s2=0;
s3=1;
Delay(10);
ADTemp=ADSample(DC_VOL_adder); //直流电压的采样
if(ADTemp>253)
{ Buzz=0;
WriteCom(0x80+0x46); //显示
for(num=0;DC_disp3[num]!='\0';num++)
{WriteData(DC_disp3[num]);
Delay(10);
}
}
else
{
ValueTemp=ValueConver(ADTemp); //采样值转换为对应的电压值
ValueTemp=ValueTemp*100; //电压值乘以对应的比例值
FloatToChar(ValueTemp); //电压值转换为字符型
WriteCom(0x80+0x46); //显示
for(num=0;num<5;num++)
{
WriteData(disp_value[num]);
Delay(10);
}
WriteData('V');
WriteData(' ');
}
} while((ADTemp>25)&&(key_number==1));
do //中端电压选择端,4V~40V电压选择端
{
s1=0;
s2=1;
s3=0;
Delay(50);
ADTemp=ADSample(DC_VOL_adder); //直流电压的采样
ValueTemp=ValueConver(ADTemp); //采样值转换为对应的电压值
ValueTemp=ValueTemp*10; //电压值乘以对应的比例值
FloatToChar(ValueTemp); //电压值转换为字符型
WriteCom(0x80+0x46); //显示
for(num=0;num<5;num++)
{
WriteData(disp_value[num]);
Delay(10);
}
WriteData('V');
WriteData(' ');
} while((ADTemp>25)&&(ADTemp<253)&&(key_number==1));
do //小端电压选择端,0~4V电压选择端
{
s1=1;
s2=0;
s3=0;
Delay(10);
ADTemp=ADSample(DC_VOL_adder); //直流电压的采样
ValueTemp=ValueConver(ADTemp); //采样值转换为对应的电压值
FloatToChar(ValueTemp); //电压值转换为字符型
WriteCom(0x80+0x46); //显示
for(num=0;num<5;num++)
{
WriteData(disp_value[num]);
Delay(10);
}
WriteData('V');
WriteData(' ');
} while((ADTemp<253)&&(key_number==1));
}
复制代码
#include<reg52.h>
#include"Delay.h"
#include<KEY_FUNCTION_DEFINE.H>
#include<measure_define.h>
#include"AD.h"
#include"LCD.h"
extern uchar disp_value[5];
extern uchar key_number;
extern uchar code DC_disp3[];
uchar code RES_disp[]="RES Measure ";
uchar code RES_disp2[]="value= ";
void Res_measure(void)
{
uchar ADTemp,num;
float ValueTemp;
WriteCom(0x01); //清屏
WriteCom(0x80); //显示
for(num=0;RES_disp[num]!='\0';num++)
{
WriteData(RES_disp[num]);
Delay(10);
}
WriteCom(0x80+0x40); //显示
for(num=0;RES_disp2[num]!='\0';num++)
{
WriteData(RES_disp2[num]);
Delay(10);
}
do{ //先选通20K通道
s1=0;
s2=0;
s3=1;
Delay(50);
ADTemp=ADSample(Res_adder); //读采样值
if(ADTemp>253)
{ WriteCom(0x80+0x46); //显示
for(num=0;DC_disp3[num]!='\0';num++)
{
WriteData(DC_disp3[num]);
Delay(50);
}
}
else
{
ValueTemp=ValueConver(ADTemp); //采样值0~255转换为电压值0~2v
ValueTemp=ValueTemp/2 ; //电压转换为电阻值
ValueTemp=ValueTemp*20000; //电阻值乘以对应的档位
FloatToChar(ValueTemp); //浮点电压值转换为字符型数字
WriteCom(0x80+0x46); //显示的地址
for(num=0;num<5;num++)
{
WriteData(disp_value[num]); //显示数值
Delay(10);
}
WriteData('R');
WriteData(' ');
}
} while((ADTemp>25)&&(key_number==4)); //采样电压值大于0.2V
do{ //选通2K通道
s1=0;
s2=1;
s3=0;
Delay(50); //读采样值
ADTemp=ADSample(Res_adder);
ValueTemp=ValueConver(ADTemp); //采样值0~255转换为电压值0~2v
ValueTemp=ValueTemp/2; //电压转换为电阻值
ValueTemp=ValueTemp*2000; //电阻值乘以对应的档位
FloatToChar(ValueTemp);
WriteCom(0x80+0x46);
for(num=0;num<5;num++)
{
WriteData(disp_value[num]);
Delay(10);
}
WriteData('R');
WriteData(' ');
} while((ADTemp>25)&&(ADTemp<254)&&(key_number==4));//采样电压值大于0.2v小于2v
do{
s1=1; //选通200欧通道
s2=0;
s3=0;
Delay(50);
ADTemp=ADSample(Res_adder); //AD采样
ValueTemp=ValueConver(ADTemp); //将0~255的数值转换为0~2V的电压值
ValueTemp=ValueTemp/2; //电压转换为电阻值
ValueTemp=ValueTemp*200; //电阻乘以相对应的档位值
FloatToChar(ValueTemp); //电阻值转换为字符型
WriteCom(0x80+0x46); //显示电阻值
for(num=0;num<5;num++)
{
WriteData(disp_value[num]);
Delay(10);
}
WriteData('R');
WriteData(' ');
} while((ADTemp<253)&&(key_number==4)); //采样电压值小于2v
}
复制代码
显示程序:
#include<reg52.h>
#include"LCD.h"
#define datasend P0 //P0口数据送LCD1602
sbit LcdRs=P2^0; //1602数据、命令控制端
sbit LcdEn=P2^1; //1602使能端
uchar mytable0[]=" my design" ;
uchar mytable1[]="wan yong biao";
uchar code line0[]="welcome you";
uchar code line1[]="Value= V";
unsigned char disp_value[5]={'0','0','0','0','0'};
//写命令
void WriteCom(unsigned char Com)
{
LcdRs=0; //低电平选择为写指令
datasend=Com; //把指令写入P0口
Delay(5); //参考时序图
LcdEn=1; //开使能
Delay(5); //读取指令
LcdEn=0; //关闭使能
}
//写数据
void WriteData(unsigned char Data)
{
LcdRs=1; //高电平选择为写数据
datasend=Data; //把数据写入P0口
Delay(5); //参考时序图
LcdEn=1; //开使能
Delay(5); //读取指令
LcdEn=0; //关闭使能
}
//初始化
void LcdInit(void)
{ uchar num;
LcdEn=0;
WriteCom(0x38); //设置16x2显示,5x7点阵显示,8位数据接口
WriteCom(0x0c); //00001DCB,D(开关显示),C(是否显示光标),B(光标闪烁,光标不显示)
WriteCom(0x06); //000001N0,N(地址指针+-1)
WriteCom(0x01); //清屏指令 每次显示下一屏内容时,必须清屏
WriteCom(0x80+0x01); //第一行,顶格显示
for(num=0;num<10;num++)
{
WriteData(mytable0[num]);
Delay(10);
}
WriteCom(0x80+0x40); //第二行,从第一格开始显示
for(num=0;num<13;num++)
{
WriteData(mytable1[num]);
Delay(10);
}
Delay(1000);
WriteCom(0x01); //清屏指令 每次显示下一屏内容时,必须清屏
WriteCom(0x80);
for(num=0;num<8;num++)
{
WriteData(line0[num]);
Delay(10);
}
WriteCom(0x80+0x40);
for(num=0;num<12;num++)
{
WriteData(line1[num]);
Delay(10);
}
}
//将浮点数据转换为字符型数组
void FloatToChar(float Data)
{
uchar Temp1[5];
uchar Temp2[3];
unsigned int IntData,Temp;
float FloatData;
unsigned char i=0,j=0,k=0;
IntData=(unsigned int)Data;
FloatData=Data-IntData;
//整数部分
if(IntData==0)
{
Temp1[i]=0;
i++;
}
while(IntData)
{
Temp1[i]=IntData%10;
i++;
IntData=IntData/10;
}
//小数部分
while((FloatData>0.001)&&(j<3))
{
FloatData=FloatData*10;
Temp=(int)FloatData;
Temp2[j]=Temp;
j++;
FloatData=FloatData-Temp;
}
while(i>0)
{
disp_value[k]=Temp1[i-1]+'0';
i--;
k++;
}
disp_value[k]='.';
i=0;
k++;
while(i<j)
{
disp_value[k]=Temp2[i]+'0';
i++;
k++;
}
}
复制代码
0.png
(65.93 KB, 下载次数: 120)
下载附件
2017-3-30 04:23 上传
下载:
http://www.51hei.com/bbs/dpj-80194-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1