单片机论坛

 找回密码
 立即注册
QQ登录 只需一步,快速开始
搜索
查看: 1942|回复: 17
打印 上一主题 下一主题
收起左侧

单片机万用表仿真及源码 能测直流 交流电压 电流 电容和电阻

  [复制链接]
跳转到指定楼层
楼主
这是一个51单片机做的仿真设计,一个能测直流电压 交流电压 电流 电容和电阻的功能十分强大的单片机万用表仿真分享给大家:

万用表继电器附操作图 万用表的仿真原理图:


整个仿真文件界面截图(各个电路模块分开放置的):


单片机万用表程序源码:
  • #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);

  • 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();                   //电容的测量
  •                         }        /**/
  •                         

  •         }         
  • }                 
  • 复制代码

    下载:
    单片机万用表仿真及源码.zip (1.91 MB, 下载次数: 128)

    评分

    参与人数 2黑币 +10 收起 理由
    zysadd + 5 很给力!
    zzwk123456 + 5 很给力!
    查看全部评分
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏9 转播转播 分享分享 分享淘帖 顶1 踩
    回复 使用道具 举报
    沙发
     楼主| 51hei官方发布 发表于 2017-3-30 17:02 | 只看该作者
    这个万用表实现交流电压检测的单片机程序代码:
  • #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 AC_disp[]="AC VOL Measure ";
  • uchar code AC_disp2[]="value=        ";
  • void AC_VOL_measure(void)                                //交流电压测量函数
  • {
  •                 uchar  ADTemp,num;
  •                 float ValueTemp;
  •                 WriteCom(0x01);                                                        //清屏
  •               WriteCom(0x80);                                                    //显示
  •                 for(num=0;AC_disp[num]!='\0';num++)
  •                 {
  •                         WriteData(AC_disp[num]);                        
  •                         Delay(10);        
  •                 }
  •                 WriteCom(0x80+0x40);                                   //显示
  •                 for(num=0;AC_disp2[num]!='\0';num++)
  •                 {
  •                         WriteData(AC_disp2[num]);                        
  •                         Delay(10);        
  •                 }               
  •                         
  •                 do{                                                                     
  •                              s1=0;                                         //选择200v最高档
  •                             s2=0;
  •                             s3=1;
  •                                 Delay(50);
  •                 ADTemp=ADSample(AC_VOL_adder);               
  •                 if(ADTemp>253)                                          //当超过量程时,显示为1
  •                 {         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>20)&&(key_number==2));

  •                  do
  •                 {                                                                                 
  •                             s1=0;                                                   //选择20v档
  •                             s2=1;
  •                             s3=0;
  •                                 Delay(50);                                                
  •                 ADTemp=ADSample(AC_VOL_adder);             //起动AD进行采样
  •                 ValueTemp=ValueConver(ADTemp);                 //AD进行转换
  •                 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>24)&&(ADTemp<253)&&(key_number==2));        
  • do
  •            {
  •                             s1=1;                                                //选择2V档
  •                             s2=0;
  •                             s3=0;
  •                                 Delay(50);
  •                 ADTemp=ADSample(AC_VOL_adder);                //起动AD进行采样
  •                 ValueTemp=ValueConver(ADTemp);                 //电压值转换为字符串
  •         FloatToChar(ValueTemp);
  •            WriteCom(0x80+0x46);
  •                 for(num=0;num<5;num++)
  •                 {
  •                         WriteData(disp_value[num]);
  •                         Delay(15);        
  •                 }
  •                 WriteData('V');        
  •                 WriteData(' ');
  •          } while((ADTemp<253)&&(key_number==2));

  • }
  • 复制代码
    回复 使用道具 举报
    板凳
     楼主| 51hei官方发布 发表于 2017-3-30 17:04 | 只看该作者
    电容检测程序:
  • #include<reg52.h>
  • #include"Delay.h"
  • #include"AD.h"
  • #include"LCD.h"
  • #include<Cap_define.h>
  • 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官方发布 发表于 2017-3-30 17:05 | 只看该作者
    万用表检测电流的源程序:
  • #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 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   
  •        
  • }       
  • 复制代码
    回复 使用道具 举报
    5#
    51单片机小白 发表于 2017-4-17 16:44 | 只看该作者
    好强大,不知能不能实际做成功呢
    回复 使用道具 举报
    6#
    dashushi1603 发表于 2017-5-7 19:35 | 只看该作者
    可以刚好是我想要的
    回复 使用道具 举报
    7#
    逆风丶蒲公英灬 发表于 2017-5-23 08:36 来自手机 | 只看该作者
    好东西
    回复 使用道具 举报
    8#
    Chongde51hei 发表于 2017-5-25 14:42 | 只看该作者
    可以测负的电压值吗?
    回复 使用道具 举报
    9#
    黄工366 发表于 2017-10-21 00:03 | 只看该作者
    好强大,不知能不能实际做成功呢
    回复 使用道具 举报
    10#
    zzwk123456 发表于 2017-10-21 12:43 | 只看该作者
    感谢楼主分享,正好拿来学习下
    回复 使用道具 举报
    11#
    zzbin 发表于 2017-10-21 17:03 来自手机 | 只看该作者
    好强大
    回复 使用道具 举报
    12#
    libra1 发表于 2018-1-10 19:53 | 只看该作者
    刚好要学习,谢谢楼主,功能真的很强大
    回复 使用道具 举报
    13#
    jxdianqi 发表于 2018-1-10 22:44 | 只看该作者
    DC好像没有负压功能,这是数字表都有的
    回复 使用道具 举报
    14#
    wozaizheli 发表于 2018-1-12 10:58 | 只看该作者
    请问有任务书吗
    回复 使用道具 举报
    15#
    wozaizheli 发表于 2018-1-12 12:59 | 只看该作者
    电流不分交直流吗
    回复 使用道具 举报
    16#
    温加饱 发表于 2018-1-13 07:25 | 只看该作者
    谢谢分享,这个ADC是什么芯片来的?
    回复 使用道具 举报
    17#
    wozaizheli 发表于 2018-1-18 18:36 | 只看该作者
    51单片机小白 发表于 2017-4-17 16:44
    好强大,不知能不能实际做成功呢

    不知道有没有pcb图
    回复 使用道具 举报
    18#
    jms209 发表于 2018-2-8 19:46 | 只看该作者

    刚好要学习,谢谢楼主
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 立即注册
    本版积分规则
    QQ|手机版|小黑屋|单片机论坛
    Powered by 单片机教程网
    快速回复 返回顶部 返回列表