给大家分享一个proteus做的功能很全的万用表仿真程序
直流电测量:
交流电测量:
电流测量:
电容的测量部分:
电阻的测量:
整体图:
万用表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机万用表源程序如下:
- #include<reg52.h>
- #include"LCD.h"
- #include"Delay.h"
- #include"AD.h"
- #include<measure_define.h>
- #include<KEY_FUNCTION_DEFINE.H>
- #include<Cap_define.h>
- void ININT_int1(void);
- typedef unsigned char uchar;
- typedef unsigned int uint;
- extern uchar key_number;
- extern uchar disp_value[5];
- void main(void)
- {
- uchar num=0;
- s1=0;
- s2=0;
- s3=0;
- key_number=1; //初始化按键的值为0
-
- LcdInit(); //LCD1602有初始化
- WriteCom(0x80+0x46); //1602第二行显示 value=00000v
- for(num=0;num<5;num++)
- {
- WriteData(disp_value[num]);
- Delay(10);
- }
- ININT_int1(); //外部中断1的初始化
- Tmie0_init(); //定时器0的初始化
-
- while(1)
- {
- if(key_number==1) //按键值为1
- {
- DC_VOL_measure(); //直流电压的测量
- }
- if(key_number==2) //按键值为2
- {
- AC_VOL_measure(); //交流电压的测量
- }
- if(key_number==3) //按键值为3
- {
- Circuit_measure(); //电流的测量
- }
-
- if(key_number==4) //按键值为4
- {
- Res_measure(); //电阻的测量
- }
-
- if(key_number==5) //按键值为5
- {
- WriteCom(0x01); //清屏
- Cap_disp_init(); //电容显示初始化
- Cap_measure(); //电容的测量
- } /**/
-
- }
- }
复制代码- #include<reg52.h>
- #include"Delay.h"
- #include<KEY_FUNCTION_DEFINE.H>
- #include<measure_define.h>
- #include"AD.h"
- #include"LCD.h"
- typedef unsigned char uchar;
- extern uchar disp_value[5];
- extern uchar key_number;
- extern uchar code DC_disp3[];
- uchar code CC_disp[]="Current Measure ";
- uchar code CC_disp2[]="value= ";
- void Circuit_measure(void)
- { uchar ADTemp,num;
- float ValueTemp;
- WriteCom(0x01); //清屏
- WriteCom(0x80); //显示电流测量字符串
- for(num=0;CC_disp[num]!='\0';num++)
- {WriteData(CC_disp[num]);
- Delay(10); }
- WriteCom(0x80+0x40); //显示
- for(num=0;CC_disp2[num]!='\0';num++)
- {WriteData(CC_disp2[num]);
- Delay(10); }
- do{ // 选择2A档
- s1=0;
- s2=0;
- s3=1;
- Delay(5);
- ADTemp=ADSample(Circuit_adder); //AD开始采样
- if(ADTemp>253)
- { WriteCom(0x80+0x46); //显示
- for(num=0;DC_disp3[num]!='\0';num++)
- {WriteData(DC_disp3[num]);
- Delay(50);}
- }
- else
- {ValueTemp=ValueConver(ADTemp); //
- ValueTemp=ValueTemp*1000; //
- FloatToChar(ValueTemp); //浮点电压值转换为字符型数字
- WriteCom(0x80+0x46); //显示的地址
- for(num=0;num<5;num++)
- {WriteData(disp_value[num]); //显示数值
- Delay(50); }
- WriteData('m');
- WriteData('A'); }
- } while((ADTemp>24)&&(key_number==3)); //采样值大于200mA
- do{ //选通200mA通道
- s1=0;
- s2=1;
- s3=0;
- Delay(5); //读采样值
- ADTemp=ADSample(Circuit_adder);
- ValueTemp=ValueConver(ADTemp);
- ValueTemp=ValueTemp*100;
- FloatToChar(ValueTemp);
- // LcdDisplayValue(Value);
- WriteCom(0x80+0x46);
- for(num=0;num<5;num++)
- {
- WriteData(disp_value[num]);
- Delay(50);
- }
- WriteData('m');
- WriteData('A');
- } while((ADTemp>24)&&(ADTemp<253)&&(key_number==3)); //采样电压值大于20mA小于200mA
- do{
- s1=1;
- s2=0;
- s3=0;
- Delay(5);
- ADTemp=ADSample(Circuit_adder);
- ValueTemp=ValueConver(ADTemp);
- ValueTemp=ValueTemp*10;
- FloatToChar(ValueTemp);
- // LcdDisplayValue(Value);
- WriteCom(0x80+0x46);
- for(num=0;num<5;num++)
- {
- WriteData(disp_value[num]);
- Delay(50);
- }
- WriteData('m');
- WriteData('A');
- } while((ADTemp<253)&&(key_number==3));//采样电压值小于20mA
-
- }
复制代码- #include<reg52.h>
- #include"Delay.h"
- #include"AD.h"
- #include"LCD.h"
- #include<Cap_define.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- extern uchar disp_value[5];
- extern uchar key_number;
- uchar code CAP_disp[]="CAP Measure ";
- uchar code CAP_disp2[]="value= uF ";
- sbit NE555_3OUT=P3^2; //NE555的3脚
- sbit NE555_2IN=P3^5; //NE555的2脚
- uint Puls_width; //高电平的宽度
- float Cap_value; //电容值
- void Tmie0_init(void)
- {
- TMOD=0X09; //定时器0 定时方式1 ;GATE=1,只有INT0引脚为高且TR0置1时,定时器才开始工作
- TH0=0;
- TL0=0;
- TR0=1;
- ET0=0;
- EA=1;
- }
- void Cap_disp_init(void)
- {
- uchar num;
- WriteCom(0x80); //显示电容测量字符串
- for(num=0;CAP_disp[num]!='\0';num++)
- {
- WriteData(CAP_disp[num]);
- Delay(10);
- }
- WriteCom(0x80+0x40); //显示
- for(num=0;CAP_disp2[num]!='\0';num++)
- {
- WriteData(CAP_disp2[num]);
- Delay(10);
- }
-
- }
-
- void Cap_measure(void) //电容测量函数
- {
- uchar num;
- uint temp0;
- while(key_number==5) //按键是否为5;
- {
- TH0=0; //重置定时器0的初值
- TL0=0; //模拟555的单稳态电路
- NE555_2IN=1;
- NE555_2IN=0;
- Delay(10);
- NE555_2IN=1;
- Delay(1000);
-
- temp0=TH0;
- Puls_width=(temp0<<8)|TL0; //高电压的宽度
- Cap_value=(Puls_width)/(1.1*1000); //电容值的计算
-
- FloatToChar(Cap_value); //将数值转换为字型值
- WriteCom(0x80+0x46); //显示
- for(num=0;num<5;num++)
- {
- WriteData(disp_value[num]);
- Delay(10);
- }
- WriteData('u');
- WriteData('F');
-
- }
-
-
- }
复制代码
所有资料51hei提供下载:
万用表仿真.rar
(1.83 MB, 下载次数: 212)
|