标题: 单片机万用表仿真及源码 能测直流 交流电压 电流 电容和电阻 [打印本页]

作者: 51hei学习技术中    时间: 2017-3-30 17:01
标题: 单片机万用表仿真及源码 能测直流 交流电压 电流 电容和电阻
这是一个51单片机做的仿真设计,一个能测直流电压 交流电压 电流 电容和电阻的功能十分强大的单片机万用表仿真分享给大家:

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


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


单片机万用表程序源码:
  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. extern uchar key_number;
  10. extern uchar disp_value[5];
  11. void main(void)
  12. {         
  13.                 uchar num=0;
  14.                 s1=0;                                          
  15.                 s2=0;
  16.                 s3=0;
  17.                 key_number=1;                           //初始化按键的值为0
  18.         
  19.                 LcdInit();                                    //LCD1602有初始化  

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

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

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

  56.         }         
  57. }                 
复制代码

下载:
单片机万用表仿真及源码.7z (1.66 MB, 下载次数: 910)


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

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

  98. }
复制代码

作者: 51hei学习技术中    时间: 2017-3-30 17:04
电容检测程序:
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include"AD.h"
  4. #include"LCD.h"
  5. #include<Cap_define.h>
  6. extern uchar disp_value[5];
  7. extern uchar key_number;
  8. uchar code CAP_disp[]="CAP Measure ";
  9. uchar code CAP_disp2[]="value=     uF ";
  10. sbit NE555_3OUT=P3^2;                                                 //NE555的3脚
  11. sbit NE555_2IN=P3^5;                                                 //NE555的2脚
  12. uint Puls_width;                                         //高电平的宽度
  13. float Cap_value;                                         //电容值


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

  39. }

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

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

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


  72. }       

复制代码

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

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

  66.                    do{
  67.                             s1=1;
  68.                             s2=0;
  69.                             s3=0;
  70.                                 Delay(5);
  71.                 ADTemp=ADSample(Circuit_adder);
  72.                 ValueTemp=ValueConver(ADTemp);
  73.                 ValueTemp=ValueTemp*10;
  74.                 FloatToChar(ValueTemp);
  75. //          LcdDisplayValue(Value);
  76.            WriteCom(0x80+0x46);
  77.                 for(num=0;num<5;num++)
  78.                 {
  79.                         WriteData(disp_value[num]);
  80.                         Delay(50);       
  81.                 }
  82.                 WriteData('m');       
  83.                 WriteData('A');                                       
  84.         }  while((ADTemp<253)&&(key_number==3));//采样电压值小于20mA   
  85.        
  86. }       
复制代码

作者: 51单片机小白    时间: 2017-4-17 16:44
好强大,不知能不能实际做成功呢
作者: dashushi1603    时间: 2017-5-7 19:35
可以刚好是我想要的
作者: 逆风丶蒲公英灬    时间: 2017-5-23 08:36
好东西
作者: Chongde51hei    时间: 2017-5-25 14:42
可以测负的电压值吗?

作者: 黄工366    时间: 2017-10-21 00:03
好强大,不知能不能实际做成功呢
作者: zzwk123456    时间: 2017-10-21 12:43
感谢楼主分享,正好拿来学习下
作者: zzbin    时间: 2017-10-21 17:03
好强大
作者: libra1    时间: 2018-1-10 19:53
刚好要学习,谢谢楼主,功能真的很强大
作者: jxdianqi    时间: 2018-1-10 22:44
DC好像没有负压功能,这是数字表都有的
作者: wozaizheli    时间: 2018-1-12 10:58
请问有任务书吗
作者: wozaizheli    时间: 2018-1-12 12:59
电流不分交直流吗
作者: 温xyz    时间: 2018-1-13 07:25
谢谢分享,这个ADC是什么芯片来的?
作者: wozaizheli    时间: 2018-1-18 18:36
51单片机小白 发表于 2017-4-17 16:44
好强大,不知能不能实际做成功呢

不知道有没有pcb图
作者: jms209    时间: 2018-2-8 19:46

刚好要学习,谢谢楼主
作者: Newdas    时间: 2018-3-24 18:04

下载后,这个程序不能编译啊。。。
作者: 1039629873    时间: 2018-4-21 13:12
不能编译是什么问题,一堆错误
作者: 若梦5151    时间: 2018-4-24 14:31
大佬好!能不能加个频率测量的功能啊!
作者: Newdas    时间: 2018-4-25 14:22
1039629873 发表于 2018-4-21 13:12
不能编译是什么问题,一堆错误

我改了一个月还没改出来,放弃了。。。压缩包里原来的hex居然可以用,神奇
作者: denminshen    时间: 2018-9-8 14:55
看看学习学习!
作者: a704625084    时间: 2018-9-10 16:25
谢谢分享
作者: y712323    时间: 2018-10-29 15:28
Newdas 发表于 2018-4-25 14:22
我改了一个月还没改出来,放弃了。。。压缩包里原来的hex居然可以用,神奇

你好,我改好了,在每个用到变量的模块(函数),先定义变量数据类型就可以。
作者: fengL    时间: 2018-11-10 14:46
y712323 发表于 2018-10-29 15:28
你好,我改好了,在每个用到变量的模块(函数),先定义变量数据类型就可以。

请问能发份资料吗?
作者: fengL    时间: 2018-11-10 15:05
大伙可以给一下资料么
作者: liuxien1982    时间: 2018-11-23 19:00
测量精度怎么样?
作者: qwtjhtjh    时间: 2018-12-7 12:16
好强大学习了!
作者: 8zhangben    时间: 2018-12-14 21:05
谢谢分享!!!
作者: 大眼    时间: 2019-2-18 17:37
好事  牛逼一比
作者: pclv    时间: 2019-4-6 01:29

谢谢分享!!!
作者: qq294268672    时间: 2019-7-6 10:41
好厉害,膜拜楼主
作者: 化蝶    时间: 2019-11-2 20:43
厉害呀,值得学习
作者: 1481714970    时间: 2019-11-3 20:20
功能很强大  
作者: 940148990    时间: 2020-5-5 11:34
太强了谢谢分享  学习到了~
作者: 952112605    时间: 2020-5-12 16:46
很给力!
作者: Summer·    时间: 2020-6-16 11:13
程序有错误啊!!

1111.png (125.29 KB, 下载次数: 157)

1111.png

作者: 325627    时间: 2020-6-17 14:19
非常给力
作者: 多喝水    时间: 2020-6-18 00:45
谢谢分享
作者: hlq18775046761    时间: 2020-6-20 22:06
y712323 发表于 2018-10-29 15:28
你好,我改好了,在每个用到变量的模块(函数),先定义变量数据类型就可以。

你好,怎么改呢,可以具体一下吗,因为我是单片机小白,不是特别懂
作者: hlq18775046761    时间: 2020-6-21 09:14
y712323 发表于 2018-10-29 15:28
你好,我改好了,在每个用到变量的模块(函数),先定义变量数据类型就可以。

怎么改呢,还是不懂,求解
作者: 腾飞的龙    时间: 2021-4-24 09:50
#define uchar unsigned char
#define uint unsigned int
加上这样的定义就OK啦
作者: LAJIDING    时间: 2021-5-4 16:11
想问一下,这个万用表的测量范围和精度是多少呀?
作者: wuguanwuyan    时间: 2021-5-28 23:53
25楼说的对,加上
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
作者: 范小爷    时间: 2021-11-30 23:26
wuguanwuyan 发表于 2021-5-28 23:53
25楼说的对,加上
#define uchar unsigned char
#define uint unsigned int

加了还是不行

作者: 孫先森的猫~    时间: 2022-3-13 10:22
谁能根据楼主提供的资料 画一个PCB吗?

作者: tom1234516    时间: 2022-3-14 22:32
太牛了,做做看能不能成功
作者: cb474265474265    时间: 2022-3-15 06:38
感恩分享!
作者: axdvgnjkl    时间: 2023-4-18 15:19
我做的是放大器非线性失真装置的,我找到的代码居然和上面测电压的那个代码一样,我不知道该怎么办
作者: wydev    时间: 2023-4-22 15:17
先收藏起来
作者: a6645041    时间: 2023-5-11 21:13
感谢楼主分享,正好拿来学习下
作者: 大漠落日    时间: 2023-11-14 14:07
虽然有错误,但可以借鉴一下,不错,有时间慢慢研究
作者: 蚂蚁科技    时间: 2024-4-13 17:26
交流采样的芯片是什么型号?
作者: yyzf998    时间: 2024-4-14 08:45
可以啊,我的编译直接通过




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1