找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8860|回复: 4
打印 上一主题 下一主题
收起左侧

Proteus万用表仿真+单片机程序源码

  [复制链接]
跳转到指定楼层
楼主
给大家分享一个proteus做的功能很全的万用表仿真程序

直流电测量:


交流电测量:


电流测量:


电容的测量部分:


电阻的测量:


整体图:


万用表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机万用表源程序如下:
  1. #include<reg52.h>
  2. #include"LCD.h"
  3. #include"Delay.h"
  4. #include"AD.h"
  5. #include<measure_define.h>
  6. #include<KEY_FUNCTION_DEFINE.H>
  7. #include<Cap_define.h>
  8. void ININT_int1(void);
  9. typedef unsigned char uchar;
  10. typedef unsigned int uint;
  11. extern uchar key_number;
  12. extern uchar disp_value[5];
  13. void main(void)
  14. {        
  15.                 uchar num=0;
  16.                 s1=0;                                          
  17.                 s2=0;
  18.                 s3=0;
  19.                 key_number=1;                           //初始化按键的值为0
  20.        
  21.                 LcdInit();                                    //LCD1602有初始化  

  22.                 WriteCom(0x80+0x46);                //1602第二行显示 value=00000v
  23.                 for(num=0;num<5;num++)                            
  24.                 {
  25.                         WriteData(disp_value[num]);
  26.                         Delay(10);       
  27.                 }        
  28.         ININT_int1();                                            //外部中断1的初始化
  29.         Tmie0_init();                                                //定时器0的初始化
  30.                
  31. while(1)
  32.         {
  33.                         if(key_number==1)                  //按键值为1
  34.                         {
  35.                                 DC_VOL_measure();          //直流电压的测量
  36.                         }

  37.                         if(key_number==2)                  //按键值为2
  38.                         {
  39.                                 AC_VOL_measure();     //交流电压的测量
  40.                         }

  41.                         if(key_number==3)                  //按键值为3
  42.                         {
  43.                                 Circuit_measure();          //电流的测量
  44.                         }                        
  45.                        
  46.                         if(key_number==4)                   //按键值为4
  47.                         {
  48.                                 Res_measure();                   //电阻的测量
  49.                         }                        
  50.                        
  51.                         if(key_number==5)                   //按键值为5
  52.                         {
  53.                                 WriteCom(0x01);                   //清屏
  54.                                 Cap_disp_init();           //电容显示初始化
  55.                                  Cap_measure();                   //电容的测量
  56.                         }        /**/
  57.                        

  58.         }         
  59. }                 
复制代码
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"
  7. typedef unsigned char uchar;
  8. typedef unsigned int uint;
  9. extern uchar disp_value[5];
  10. extern uchar key_number;
  11. extern uchar code  DC_disp3[];
  12. uchar code RES_disp[]="RES Measure    ";
  13. uchar code RES_disp2[]="value=        ";       
  14.        
  15. void Res_measure(void)
  16. {
  17.                 uchar  ADTemp,num;
  18.                 float ValueTemp;
  19.                 WriteCom(0x01);         //清屏
  20.         WriteCom(0x80);                                                                 //显示
  21.                 for(num=0;RES_disp[num]!='\0';num++)
  22.                 {
  23.                         WriteData(RES_disp[num]);                         
  24.                         Delay(10);       
  25.                 }
  26.                 WriteCom(0x80+0x40);                                                                 //显示
  27.                 for(num=0;RES_disp2[num]!='\0';num++)
  28.                 {
  29.                         WriteData(RES_disp2[num]);                         
  30.                         Delay(10);       
  31.                 }                               

  32.         do{                                                                     //先选通20K通道
  33.                              s1=0;
  34.                             s2=0;
  35.                             s3=1;
  36.                                 Delay(50);
  37.                 ADTemp=ADSample(Res_adder);                                     //读采样值
  38.             if(ADTemp>253)
  39.                         {         WriteCom(0x80+0x46);                                //显示
  40.         for(num=0;DC_disp3[num]!='\0';num++)
  41.                                         {
  42.                                                 WriteData(DC_disp3[num]);
  43.                                                          Delay(50);
  44.                                         }
  45.                 }
  46.                 else       
  47.                 {
  48.                                 ValueTemp=ValueConver(ADTemp);                 //采样值0~255转换为电压值0~2v
  49.                                 ValueTemp=ValueTemp/2        ;                         //电压转换为电阻值
  50.                                 ValueTemp=ValueTemp*20000;                         //电阻值乘以对应的档位
  51.                                 FloatToChar(ValueTemp);                                 //浮点电压值转换为字符型数字
  52.                            WriteCom(0x80+0x46);                                      //显示的地址
  53.                                 for(num=0;num<5;num++)
  54.                                 {
  55.                                         WriteData(disp_value[num]);                //显示数值
  56.                                         Delay(10);       
  57.                                 }       
  58.                                 WriteData('R');
  59.                                 WriteData(' ');                                                                                       
  60.                        
  61.                 }

  62.         }  while((ADTemp>25)&&(key_number==4));                //采样电压值大于0.2V

  63.         do{                                                                                  //选通2K通道
  64.                                     s1=0;
  65.                                     s2=1;
  66.                                     s3=0;
  67.                                         Delay(50);                                                  //读采样值
  68.                         ADTemp=ADSample(Res_adder);
  69.                         ValueTemp=ValueConver(ADTemp);                         //采样值0~255转换为电压值0~2v
  70.                         ValueTemp=ValueTemp/2;                                        //电压转换为电阻值
  71.                         ValueTemp=ValueTemp*2000;                        //电阻值乘以对应的档位
  72.                
  73.                         FloatToChar(ValueTemp);
  74.                    WriteCom(0x80+0x46);               
  75.         for(num=0;num<5;num++)
  76.                         {
  77.                                 WriteData(disp_value[num]);
  78.                                 Delay(10);       
  79.                         }
  80.                                 WriteData('R');
  81.                                 WriteData(' ');       
  82. }  while((ADTemp>25)&&(ADTemp<254)&&(key_number==4));//采样电压值大于0.2v小于2v

  83.            do{
  84.                                     s1=1;                                                         //选通200欧通道
  85.                                     s2=0;
  86.                                     s3=0;
  87.                                         Delay(50);
  88.                         ADTemp=ADSample(Res_adder);                        //AD采样
  89.                         ValueTemp=ValueConver(ADTemp);                    //将0~255的数值转换为0~2V的电压值
  90.                         ValueTemp=ValueTemp/2;                                        //电压转换为电阻值
  91.                         ValueTemp=ValueTemp*200;                                //电阻乘以相对应的档位值
  92.                        
  93.                         FloatToChar(ValueTemp);                                        //电阻值转换为字符型
  94.                          WriteCom(0x80+0x46);                                        //显示电阻值
  95.         for(num=0;num<5;num++)
  96.         {
  97.                 WriteData(disp_value[num]);
  98.                 Delay(10);
  99.                        
  100.         }
  101.                 WriteData('R');
  102.                 WriteData(' ');                       
  103. }  while((ADTemp<253)&&(key_number==4));                //采样电压值小于2v     

  104. }
复制代码
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"
  7. typedef unsigned char uchar;
  8. extern uchar disp_value[5];
  9. extern uchar key_number;
  10. uchar code DC_disp[]="DC VOL Measure ";
  11. uchar code DC_disp2[]="value=        ";
  12. uchar code DC_disp3[]="1          ";
  13. sbit Buzz=P3^7;
  14. void DC_VOL_measure(void)                        //直流电压测量函数
  15. {   uchar  ADTemp,num;
  16.         float ValueTemp;
  17.         WriteCom(0x01);       
  18.            WriteCom(0x80);                                                                 //显示
  19. for(num=0;DC_disp[num]!='\0';num++)
  20.                 {
  21.                 WriteData(DC_disp[num]);                         
  22.                 Delay(10);       
  23.                 }               
  24.                 WriteCom(0x80+0x40);                                                                 //显示
  25. for(num=0;DC_disp2[num]!='\0';num++)
  26.                 {
  27.                         WriteData(DC_disp2[num]);                         
  28.                         Delay(10);       
  29.                 }
  30.         do{                                                                                                             //高电压选择端,20V~200V电压选择测量
  31.                                              s1=0;
  32.                                             s2=0;
  33.                                             s3=1;
  34.                                                 Delay(10);
  35.                         ADTemp=ADSample(DC_VOL_adder);                        //直流电压的采样
  36.                         if(ADTemp>253)
  37.                         {        Buzz=0;
  38.                             WriteCom(0x80+0x46);                                                                                //显示
  39.                                 for(num=0;DC_disp3[num]!='\0';num++)
  40.                                         {WriteData(DC_disp3[num]);
  41.                                                          Delay(10);
  42.                     }
  43.                        
  44.                           }         
  45.                  else
  46.                                         {   
  47.                                           ValueTemp=ValueConver(ADTemp);                         //采样值转换为对应的电压值
  48.                                     ValueTemp=ValueTemp*100;                                                 //电压值乘以对应的比例值
  49.                                                 FloatToChar(ValueTemp);                                                         //电压值转换为字符型
  50.                        
  51.                                            WriteCom(0x80+0x46);                                                                 //显示
  52.                                                 for(num=0;num<5;num++)
  53.                                                 {
  54.                                                         WriteData(disp_value[num]);                         
  55.                                                         Delay(10);       
  56.                                                 }
  57.                                           WriteData('V');
  58.                                           WriteData(' ');               
  59.                                         }
  60.                         }  while((ADTemp>25)&&(key_number==1));
  61.                

  62.                  do                                                                                                                                                        //中端电压选择端,4V~40V电压选择端
  63.                 {                                                                                  
  64.                                                     s1=0;
  65.                                                     s2=1;
  66.                                                     s3=0;
  67.                                                         Delay(50);                                                 
  68.                                         ADTemp=ADSample(DC_VOL_adder);                                 //直流电压的采样
  69.                                         ValueTemp=ValueConver(ADTemp);                                 //采样值转换为对应的电压值
  70.                                         ValueTemp=ValueTemp*10;                                                                  //电压值乘以对应的比例值
  71.                                         FloatToChar(ValueTemp);                                                                 //电压值转换为字符型
  72.                                
  73.                                         WriteCom(0x80+0x46);                                                                                //显示
  74.                                         for(num=0;num<5;num++)
  75.                                         {
  76.                                                 WriteData(disp_value[num]);
  77.                                                          Delay(10);
  78.                                         }
  79.                                         WriteData('V');
  80.                                         WriteData(' ');                       
  81.         } while((ADTemp>25)&&(ADTemp<253)&&(key_number==1));       

  82.                   
  83.                   do                                                                                                                                         //小端电压选择端,0~4V电压选择端
  84.            {
  85.                                                             s1=1;
  86.                                                             s2=0;
  87.                                                             s3=0;
  88.                                                                 Delay(10);
  89.                                                 ADTemp=ADSample(DC_VOL_adder);                                //直流电压的采样
  90.                                                 ValueTemp=ValueConver(ADTemp);                                 //采样值转换为对应的电压值
  91.                                        
  92.                                                 FloatToChar(ValueTemp);                                                                //电压值转换为字符型
  93.                                
  94.                                            WriteCom(0x80+0x46);                                                                   //显示
  95.                                                 for(num=0;num<5;num++)
  96.                                                 {
  97.                                                         WriteData(disp_value[num]);
  98.                                                         Delay(10);       
  99.                                                 }
  100.                                                 WriteData('V');       
  101.                                                 WriteData(' ');
  102.         } while((ADTemp<253)&&(key_number==1));

  103. }
复制代码
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"

  7. typedef unsigned char uchar;
  8. extern uchar disp_value[5];
  9. extern uchar key_number;
  10. extern uchar code  DC_disp3[];
  11. uchar code CC_disp[]="Current Measure  ";
  12. uchar code CC_disp2[]="value=        ";
  13. void Circuit_measure(void)
  14. {       uchar  ADTemp,num;
  15.                 float ValueTemp;
  16.                 WriteCom(0x01);                                                //清屏
  17.              WriteCom(0x80);                                             //显示电流测量字符串
  18.          for(num=0;CC_disp[num]!='\0';num++)         
  19.                 {WriteData(CC_disp[num]);                         
  20.                 Delay(10);        }                                                                                                                                          
  21.                 WriteCom(0x80+0x40);                                                                  //显示
  22.          for(num=0;CC_disp2[num]!='\0';num++)
  23.                 {WriteData(CC_disp2[num]);                         
  24.                         Delay(10);        }
  25.         do{                                                                            //        选择2A档
  26.                              s1=0;
  27.                             s2=0;
  28.                             s3=1;
  29.                                 Delay(5);
  30.                 ADTemp=ADSample(Circuit_adder);                   //AD开始采样
  31.         if(ADTemp>253)
  32.                 { WriteCom(0x80+0x46);                                                                                //显示
  33.                 for(num=0;DC_disp3[num]!='\0';num++)
  34.                 {WriteData(DC_disp3[num]);
  35.                         Delay(50);}
  36.                 }         
  37.         else
  38.                 {ValueTemp=ValueConver(ADTemp);                         //
  39.                  ValueTemp=ValueTemp*1000;                                       //                           
  40.                  FloatToChar(ValueTemp);                                            //浮点电压值转换为字符型数字
  41.               WriteCom(0x80+0x46);                                 //显示的地址
  42.                  for(num=0;num<5;num++)
  43.                 {WriteData(disp_value[num]);                          //显示数值
  44.                         Delay(50);        }
  45.                  WriteData('m');
  46.                  WriteData('A');        }                                                                                                 
  47.                 }  while((ADTemp>24)&&(key_number==3));         //采样值大于200mA

  48.                 do{                                                                                  //选通200mA通道
  49.                             s1=0;
  50.                             s2=1;
  51.                             s3=0;
  52.                                 Delay(5);                                                  //读采样值
  53.                 ADTemp=ADSample(Circuit_adder);
  54.                 ValueTemp=ValueConver(ADTemp);
  55.                 ValueTemp=ValueTemp*100;                                         
  56.                 FloatToChar(ValueTemp);
  57.         //        LcdDisplayValue(Value);
  58.                 WriteCom(0x80+0x46);
  59.                 for(num=0;num<5;num++)
  60.                 {
  61.                         WriteData(disp_value[num]);
  62.                         Delay(50);       
  63.                 }
  64.                 WriteData('m');       
  65.                 WriteData('A');                         
  66.         }  while((ADTemp>24)&&(ADTemp<253)&&(key_number==3));        //采样电压值大于20mA小于200mA

  67.                    do{
  68.                             s1=1;
  69.                             s2=0;
  70.                             s3=0;
  71.                                 Delay(5);
  72.                 ADTemp=ADSample(Circuit_adder);
  73.                 ValueTemp=ValueConver(ADTemp);
  74.                 ValueTemp=ValueTemp*10;
  75.                 FloatToChar(ValueTemp);
  76. //          LcdDisplayValue(Value);
  77.            WriteCom(0x80+0x46);
  78.                 for(num=0;num<5;num++)
  79.                 {
  80.                         WriteData(disp_value[num]);
  81.                         Delay(50);       
  82.                 }
  83.                 WriteData('m');       
  84.                 WriteData('A');                                       
  85.         }  while((ADTemp<253)&&(key_number==3));//采样电压值小于20mA   
  86.        
  87. }       
复制代码
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include"AD.h"
  4. #include"LCD.h"
  5. #include<Cap_define.h>
  6. typedef unsigned char uchar;
  7. typedef unsigned int uint;
  8. extern uchar disp_value[5];
  9. extern uchar key_number;
  10. uchar code CAP_disp[]="CAP Measure ";
  11. uchar code CAP_disp2[]="value=     uF ";
  12. sbit NE555_3OUT=P3^2;                                                 //NE555的3脚
  13. sbit NE555_2IN=P3^5;                                                 //NE555的2脚
  14. uint Puls_width;                                         //高电平的宽度
  15. float Cap_value;                                         //电容值


  16. void Tmie0_init(void)
  17. {
  18.                 TMOD=0X09;                                                         //定时器0  定时方式1 ;GATE=1,只有INT0引脚为高且TR0置1时,定时器才开始工作
  19.                 TH0=0;
  20.                 TL0=0;
  21.                 TR0=1;
  22.                 ET0=0;
  23.                 EA=1;
  24. }
  25. void Cap_disp_init(void)
  26. {
  27.                 uchar num;
  28.                 WriteCom(0x80);                                                 //显示电容测量字符串
  29.                 for(num=0;CAP_disp[num]!='\0';num++)
  30.                 {
  31.                         WriteData(CAP_disp[num]);                         
  32.                         Delay(10);       
  33.                 }
  34.                 WriteCom(0x80+0x40);                                 //显示
  35.                 for(num=0;CAP_disp2[num]!='\0';num++)
  36.                 {
  37.                         WriteData(CAP_disp2[num]);                         
  38.                         Delay(10);       
  39.                 }
  40.        

  41. }

  42.                                                                                                                                                        
  43. void Cap_measure(void)                                                                //电容测量函数
  44. {       
  45.                 uchar num;
  46.                 uint temp0;
  47.         while(key_number==5)                                                                //按键是否为5;
  48.         {
  49.                 TH0=0;                                                                                        //重置定时器0的初值
  50.                 TL0=0;                                                                                        //模拟555的单稳态电路
  51.                 NE555_2IN=1;

  52.                 NE555_2IN=0;
  53.                 Delay(10);
  54.                 NE555_2IN=1;
  55.                 Delay(1000);
  56.        
  57.           temp0=TH0;
  58.                 Puls_width=(temp0<<8)|TL0;                                 //高电压的宽度

  59.                 Cap_value=(Puls_width)/(1.1*1000);         //电容值的计算
  60.        
  61.                 FloatToChar(Cap_value);                                                                //将数值转换为字型值
  62.                 WriteCom(0x80+0x46);                                                                 //显示
  63.                         for(num=0;num<5;num++)
  64.                         {
  65.                                 WriteData(disp_value[num]);                         
  66.                                 Delay(10);       
  67.                         }
  68.                 WriteData('u');
  69.                 WriteData('F');               
  70.        
  71.         }       
  72.        
  73.        


  74. }       
复制代码
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"

  7. typedef unsigned char uchar;


  8. extern uchar disp_value[5];
  9. extern uchar key_number;
  10. extern uchar code  DC_disp3[];
  11. uchar code AC_disp[]="AC VOL Measure ";
  12. uchar code AC_disp2[]="value=        ";
  13. void AC_VOL_measure(void)                                //交流电压测量函数
  14. {
  15.                 uchar  ADTemp,num;
  16.                 float ValueTemp;
  17.                 WriteCom(0x01);                                                        //清屏
  18.               WriteCom(0x80);                                                    //显示
  19.                 for(num=0;AC_disp[num]!='\0';num++)
  20.                 {
  21.                         WriteData(AC_disp[num]);                         
  22.                         Delay(10);       
  23.                 }
  24.                 WriteCom(0x80+0x40);                                   //显示
  25.                 for(num=0;AC_disp2[num]!='\0';num++)
  26.                 {
  27.                         WriteData(AC_disp2[num]);                         
  28.                         Delay(10);       
  29.                 }               
  30.                        
  31.                 do{                                                                     
  32.                              s1=0;                                         //选择200v最高档
  33.                             s2=0;
  34.                             s3=1;
  35.                                 Delay(50);
  36.                 ADTemp=ADSample(AC_VOL_adder);               
  37.                 if(ADTemp>253)                                          //当超过量程时,显示为1
  38.                 {         WriteCom(0x80+0x46);                                //显示
  39.                         for(num=0;DC_disp3[num]!='\0';num++)
  40.                         {
  41.                                 WriteData(DC_disp3[num]);
  42.                                          Delay(10);
  43.                         }
  44.                 }         
  45.                 else                
  46.                         {
  47.                         ValueTemp=ValueConver(ADTemp);         //测量的电压值转换         
  48.                     ValueTemp=ValueTemp*100;                 //电压值乘以档位         
  49.                                 FloatToChar(ValueTemp);                 //电压值转换为字符串
  50.                            WriteCom(0x80+0x46);                        //第二行显示电压值         
  51.                                 for(num=0;num<5;num++)
  52.                                 {
  53.                                         WriteData(disp_value[num]);                         
  54.                                         Delay(10);       
  55.                                 }
  56.                          WriteData('V');
  57.                         WriteData(' ');                               
  58.                        
  59.                         }
  60.                                                                                                            
  61.                 }  while((ADTemp>20)&&(key_number==2));

  62.                  do
  63.                 {                                                                                  
  64.                             s1=0;                                                   //选择20v档
  65.                             s2=1;
  66.                             s3=0;
  67.                                 Delay(50);                                                 
  68.                 ADTemp=ADSample(AC_VOL_adder);             //起动AD进行采样
  69.                 ValueTemp=ValueConver(ADTemp);                 //AD进行转换
  70.                 ValueTemp=ValueTemp*10;                                 //电压乘以档位         
  71.                 FloatToChar(ValueTemp);                                 //电压转换为字符串
  72.              WriteCom(0x80+0x46);                                 //第二行显示所测电压值
  73.                 for(num=0;num<5;num++)
  74.                 {
  75.                         WriteData(disp_value[num]);
  76.                                  Delay(10);
  77.                 }
  78.                 WriteData('V');
  79.                 WriteData(' ');                                         
  80.             } while((ADTemp>24)&&(ADTemp<253)&&(key_number==2));       
  81. do
  82.            {
  83.                             s1=1;                                                //选择2V档
  84.                             s2=0;
  85.                             s3=0;
  86.                                 Delay(50);
  87.                 ADTemp=ADSample(AC_VOL_adder);                //起动AD进行采样
  88.                 ValueTemp=ValueConver(ADTemp);                 //电压值转换为字符串
  89.         FloatToChar(ValueTemp);
  90.            WriteCom(0x80+0x46);
  91.                 for(num=0;num<5;num++)
  92.                 {
  93.                         WriteData(disp_value[num]);
  94.                         Delay(15);       
  95.                 }
  96.                 WriteData('V');       
  97.                 WriteData(' ');
  98.          } while((ADTemp<253)&&(key_number==2));

  99. }
复制代码

所有资料51hei提供下载:
万用表仿真.rar (1.83 MB, 下载次数: 212)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:897559 发表于 2021-6-13 20:35 | 只看该作者
我下载的程序要如何打开呢?
回复

使用道具 举报

板凳
ID:1001583 发表于 2022-2-10 11:07 | 只看该作者
有好几个帖子都是这个相同的文件,看来看去都不知道谁才是原作者了。。。
回复

使用道具 举报

地板
ID:1022984 发表于 2022-5-4 01:27 来自手机 | 只看该作者
8x8 发表于 2022-2-10 11:07
有好几个帖子都是这个相同的文件,看来看去都不知道谁才是原作者了。。。

只是用于测试学习的话,其实还行
回复

使用道具 举报

5#
ID:121859 发表于 2022-5-5 16:31 | 只看该作者
很不错的,我下载来用过了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表