找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字万用表仿真+程序+调试说明(可测电压 电流 电阻)

  [复制链接]
跳转到指定楼层
楼主
数字万用表  能够测量电压 电流 电阻  电压是单量程
参加学校内比赛用的,希望对大家有帮助
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真说明:
1.        解开压缩后打开仿真文件,点击运行按键进行仿真。
2.        按切换档位按键可以切换电压、电流、电阻的测量;
3.        在仿真过程中可以调节滑动变阻器“RV1”来模拟改变电阻值,在册电阻的档位可以看出阻值变化。
4.        改变电压和电流量需要停止仿真,然后“R5(2)”/“R3(1)”那个绿色箭头,在跳出的对话框可以修改输入的模拟量参数。点击确认后再运行仿真就可以看到修改的测量值。

您好:
请您在拿到实物调试前首先阅读本篇使用说明,否则出现的后果本店概不负责,敬请谅解。
注意事项:
收到商品以后,请注意以下几个使用注意的地方:
1.        不要随意将电路板上的线头短接,尤其电源正负极不能反接;
2.        插上电源前,在电路板下面放一张纸或其他绝缘的物品,防止背面有金属短接;
3.        测量各个模拟量需要保证参数在测量范围内,否则容易烧坏电路。
4.        测电压和电流时将正表笔与正极相连,负表笔与负极相连不要接反;

使用方法:
1.        插上USB接口就可进行工作;
2.        液晶屏上面的黑色小按键,是切换档位的按键,可以切换电压、电流、电阻的测量;
3.        电路板上的红线和黑线分别是万用表的正表笔和负表笔;其中负表笔在使用过程中不需要变动,正表笔在测量不同的量时需要手动切换(方法是将红色的线插到相应的针子上);

注意实际测量时电压不可超过10v,电流不可超过500mA,这是极限值,千万不可超过

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /***************引脚声明*********************/
  6. #define lcd P0
  7. sbit rs=P2^7;          //LCD液晶控制端
  8. sbit en=P2^6;
  9. sbit SPK=P1^7;  //蜂鸣器引脚
  10. sbit CS=P1^2;   //将CS位定义为P1.2引脚
  11. sbit CLK=P1^0;  //将CLK位定义为P1.0引脚
  12. sbit DIO=P1^1;  //将DIO位定义为P1.1引脚
  13. sbit key=P2^5;  //定义按键引脚
  14. sbit a=P2^0;                //模拟量通道选择端
  15. sbit b=P2^1;                //模拟量通道选择端
  16. sbit c=P2^2;                //模拟量通道选择端

  17. /***********LCD显示数组**************************/
  18. uchar code table0[]="  DCV(0-5V)   ";
  19. uchar table1[]="  V=0000.00 v";
  20. uchar code table2[]="  DCI(0-100mA)";
  21. uchar table3[]="  I=0000.00mA";
  22. uchar code table4[]="  R(0-1k)     ";
  23. uchar table5[]="  R=000.0    ";

  24. /***************全局变量************************/
  25. uchar flag=0;      //换挡标志位


  26. void delay(uint count)                 //延时
  27. {
  28.   uint i,j;
  29.   for(i=0;i<count;i++)
  30.    for(j=0;j<120;j++);
  31. }

  32. /*************LCD1602驱动程序************************/
  33. void w_cmd(uchar com)                  //lcd1602写命令
  34. {
  35.   rs=0;
  36.   lcd=com;
  37.   en=1;
  38.   delay(5);
  39.   en=0;
  40. }

  41. void w_data(uchar dat)                  //lcd1602读数据
  42. {
  43.   rs=1;
  44.   lcd=dat;
  45.   en=1;
  46.   delay(5);
  47.   en=0;
  48. }

  49. void w_str(uchar *s)       //lcd1602写字符串
  50. {
  51.     while(*s)  w_data(*s++);
  52. }

  53. void init()                     //lcd1602初始化
  54. {
  55.   en=0;
  56.   w_cmd(0x38);
  57.   w_cmd(0x0c);
  58.   w_cmd(0x06);
  59.   w_cmd(0x01);
  60. }

  61. /*****************************************************
  62. 函数功能:将模拟信号转换成数字信号
  63. ***************************************************/
  64. unsigned char  A_D()
  65. {
  66.   unsigned char i,dat;
  67.    CS=1;   //一个转换周期开始
  68.    CLK=0;  //为第一个脉冲作准备
  69.    CS=0;  //CS置0,片选有效
  70.    DIO=1;    //DIO置1,规定的起始信号  
  71.    CLK=1;   //第一个脉冲
  72.    CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
  73.    DIO=1;   //DIO置1, 通道选择信号  
  74.    CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
  75.    CLK=0;   //第二个脉冲下降沿
  76.    
  77.    DIO=0;   //DI置0,选择通道0
  78.    CLK=1;    //第三个脉冲
  79.    CLK=0;    //第三个脉冲下降沿
  80.    DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
  81.    CLK=1;    //第四个脉冲
  82.    for(i=0;i<8;i++)  //高位在前
  83.     {
  84.       CLK=1;         //第四个脉冲
  85.       CLK=0;
  86.       dat<<=1;       //将下面储存的低位数据向右移
  87.    dat|=(unsigned char)DIO;   //将输出数据DIO通过或运算储存在dat最低位
  88.     }            
  89.     CS=1;          //片选无效
  90.   return dat;  //将读书的数据返回     
  91. }
  92. /**********************报警程序************************/
  93. void BaoJing(void)
  94. {  
  95.         uint i, j;
  96.         for (i = 0; i < 200; i++)    //产生脉冲使蜂鸣器发出声音
  97.         {
  98.          SPK = 0; for (j = 0; j < 100; j++);
  99.          SPK = 1; for (j = 0; j < 100; j++);
  100.   }         
  101. }
  102. /*********************按键判定************************************/
  103. void keyscan()
  104. {
  105.         if(key==0)                   //判断是否按下
  106.         {
  107.                 delay(10);
  108.                 if(key==0)
  109.                 {
  110.                         while(!key);
  111.                         flag++;
  112.                         if(flag>3) flag=0;
  113.                        
  114.                 }
  115.         }
  116. }
  117. /*******************定时器1初始化程序******************/
  118. void Timer1_Init(void) //
  119. {
  120.         TMOD=0x11;       
  121.         TH1 = ( 65535 - 50000 ) / 256;   //0.2ms
  122.         TL1 = ( 65535 - 50000 ) % 256;
  123.         ET1=1;               
  124.         TR1=1;         
  125.         EA=1;
  126. }
  127. /*******************定时器1中断程序********************/
  128. void Timer1 ( void ) interrupt 3  //定时器1中断函数 0.2ms
  129. {
  130.         TH1 = ( 65535 - 50000) / 256;  
  131.         TL1 = ( 65535 - 50000 ) % 256;
  132.         keyscan();   //按键判定
  133. }

  134. /*主函数*/                                                               
  135. void main()
  136. {
  137.   uint adval;
  138.   unsigned long int temp;
  139.   init();         //液晶初始化       
  140.   Timer1_Init();  //定时器1初始化       
  141.   while(1)
  142.   {
  143.          
  144.          if(flag==0)                 //直流电压测量
  145.          {       
  146.                         c=0;b=0;a=0;    //通道选择
  147.                         w_cmd(0x80);
  148.                         w_str(table0);
  149.                         adval=A_D();    //进行A/D转换
  150.                         temp=adval* 5.0/255* 2*100;  //转换成实际电压并放大100倍
  151.                         if(temp>500)
  152.                         {
  153.                                 BaoJing();   //超量程报警
  154.                                 w_cmd(0xc0+0x00);       
  155.                                 w_str("  V= .OL  v  ");
  156.                                 delay(500);
  157.                         }
  158.                         else
  159.                         {
  160.                                 table1[4]=temp/100000+0x30;
  161.                                 table1[5]=temp%100000/10000+0x30;
  162.                                 table1[6]=temp%10000/1000+0x30;
  163.                                 table1[7]=temp%1000/100+0x30;
  164.                                 table1[9]=temp%100/10+0x30;
  165.                                 table1[10]=temp%10+0x30;                       
  166.                                 w_cmd(0xc0+0x00);       
  167.                                 w_str(table1);               
  168.                                 delay(10);
  169.                         }
  170.          }

  171.          if(flag==1)           //          直流电流测量
  172.          {
  173.                         c=0;b=0;a=1;    //通道选择
  174.                         w_cmd(0x80);
  175.                         w_str(table2);               
  176.                         adval=A_D();    //进行A/D转换
  177.                         temp=adval*0.1/255*5000000/10;
  178.                         if(temp>10000)
  179.                         {
  180.                                 BaoJing();   //超量程报警
  181.                                 w_cmd(0xc0+0x00);       
  182.                                 w_str("  I= .OL mA  ");
  183.                                 delay(500);
  184.                         }
  185.                         else
  186.                         {
  187.                                 table3[4]=temp/100000+0x30;
  188.                                 table3[5]=temp%100000/10000+0x30;
  189.                                 table3[6]=temp%10000/1000+0x30;
  190.                                 table3[7]=temp%1000/100+0x30;
  191.                                 table3[9]=temp%100/10+0x30;
  192.                                 table3[10]=temp%10+0x30;       
  193.                                 w_cmd(0xc0+0);       
  194.                                 w_str(table3);
  195.                                
  196.                                 delay(10);
  197.                         }
  198.     }
  199.           if(flag==2)           //          电阻测量
  200.           {   
  201. ……………………

  202. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
数字万用表-直流单量程 超量程报警.zip (108.67 KB, 下载次数: 298)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:438438 发表于 2018-12-18 11:35 | 只看该作者
仿真打不开呀
回复

使用道具 举报

板凳
ID:418578 发表于 2019-2-16 02:10 | 只看该作者
目前在思考这个问题,谢谢大佬!
回复

使用道具 举报

地板
ID:563362 发表于 2019-6-16 00:31 | 只看该作者
挺厉害的
回复

使用道具 举报

5#
ID:596163 发表于 2019-8-10 10:08 | 只看该作者
感谢楼主分享
回复

使用道具 举报

6#
ID:693642 发表于 2020-2-15 19:43 | 只看该作者
感谢楼主分享
回复

使用道具 举报

7#
ID:711889 发表于 2020-3-19 21:35 | 只看该作者
剩下的程序在附件的哪里啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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