找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5605|回复: 4
收起左侧

交流电压、电流计万用表仿真(电压电流值自动切换)

  [复制链接]
ID:137190 发表于 2016-9-9 17:43 | 显示全部楼层 |阅读模式
最近在51黑论坛上面看到了很多大神分享的直流电压表的作品,深深受益,于是自己尝试着做了一个交流电压0~220V、交流电流0~40A的交流电压、电流计。在我设计的作品里,为了测量准确,我假设电压、电流值通过电压、电流传感器,输出成了0~5V的交流电压信号,通过变压器的降压,使电压的幅值小于5V,方便输入ADC0809进行转换。要是想用设计的电压、电流计直接测量0~220V、0~40A的电压电流值,只需改变变压器的匝数比。
不过这个作品的缺陷还是挺多的,比如说与PC机的接口就是个摆设,完全没用,还有就是串口本来想输出电压、电流的有效值,但是没有成功,不知道是编程的原因还是硬件连接的问题;再者,计算有效值的算法是取最大值比上1.414,所以交流值变小时得重新启动电压、电流计进行测量。
希望这个粗陋的设计能对大家有些用处,同时还希望大家能给予一些意见和建议,谢谢哈~
0.png

下面是万用表的源代码:
  1. /*****单相交流电压、电流计设计,交流有效值0-220V,电流有效值0-40A*****/
  2. #include<reg51.h>
  3. #include<math.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. /******六位七段共阴极数码显示管*******/
  7. uchar code dispbitcode[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  8. uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x76,0x38};
  9. uchar dispbuf[8]={0,0,0,0,0,0,0,0};
  10. void caiji();
  11. void uart();
  12. uint temp,temp1,temp2;
  13. float getdata1,getdata2,max1,max2;
  14. uint w;                                                           //电压值,电流值切换显示所需变量
  15. uchar num=0;                        
  16. sbit dula=P2^0;
  17. sbit wela=P2^1;
  18. sbit vi=P2^2;
  19. sbit xuan=P2^3;
  20. sbit ST=P3^6;
  21. sbit OE=P3^7;
  22. sbit EOC=P3^4;
  23. sbit clock=P3^2;
  24. /******主函数********/
  25. void main()
  26. {
  27.         xuan=0;
  28.         max1=0;
  29.         max2=0;
  30.         w=0;
  31.         SCON=0x80;                                                                 //串行口初始化为方式2
  32.         PCON=0x00;
  33.         EA=1;
  34.         ES=1;
  35.         ET0=1;
  36.         ET1=1;
  37.         TMOD=0x11;
  38.         TH0=(65535-10)/256;                                                 //adc0809时钟
  39.         TL0=(65535-10)%256;
  40.         TH1=(65535-10000)/256;                                         //定时中断扫描时间
  41.         TL1=(65535-10000)%256;
  42.         TR0=1;
  43.         TR1=1;
  44.         while(1)
  45.         {
  46.                 caiji();
  47.                 uart();
  48.         }
  49. }
  50. /********电压,电流传感器的数据采集*******/
  51. void caiji()
  52. {
  53.         uchar i,j;
  54.         /*电压传感器数据采集*/
  55.         for(j=0;j<10;j++)
  56.         {
  57.     getdata1=0;
  58.         vi=0;
  59.         ST=1;
  60.         ST=0;
  61.         ST=1;
  62.         while(EOC==1);
  63.         while(EOC==0);
  64.         OE=0;
  65.         getdata1=P1;
  66.         for(i=0;i<=200;i++);                                                  
  67.         OE=1;
  68.         getdata1=getdata1/51*717/250*4400;
  69.         if(getdata1>max1)
  70.         max1=getdata1;
  71.         temp1=max1/1.414;
  72.         }
  73.         //if(temp1>22000)
  74.         //temp1=22000;
  75.         /*电流传感器数据采集*/
  76.            for(j=0;j<10;j++)
  77.         {
  78.         getdata2=0;
  79.         vi=1;
  80.         ST=1;
  81.         ST=0;
  82.         ST=1;
  83.         while(EOC==1);
  84.         while(EOC==0);
  85.         OE=0;
  86.         getdata2=P1;
  87.         for(i=0;i<=200;i++);                                                         
  88.         OE=1;
  89.         getdata2=getdata2/51*717/250*800;
  90.         if(getdata2>max2)
  91.         max2=getdata2;
  92.         temp2=max2/1.414;
  93. //        if(temp2>4000)
  94. //        temp2=4000;
  95.         }
  96.         
  97. }
  98. /********串行口发送电压,电流值的有效值**********/
  99. void uart()
  100. {
  101.         uchar i;
  102.         SBUF=temp1;                                                //启动串口发送
  103.         for(i=0;i<200;i++);
  104. }
  105.                  
  106. /*adc0809时钟*/
  107. void clok() interrupt 1
  108. {
  109.         TH0=(65535-10)/256;
  110.         TL0=(65535-10)%256;
  111.         clock=~clock;
  112. }

  113. /*******动态显示扫描********/
  114. void xianshi() interrupt 3
  115. {
  116.         uchar i,j,k;
  117.         TH1=(65535-10000)/256;
  118.         TL1=(65535-10000)%256;
  119.         if(w==500)
  120.         {
  121.         w=0;
  122.         xuan=~xuan;
  123.         }
  124.         if(xuan==0)
  125.         temp=temp1;
  126.         else
  127.         temp=temp2;
  128.         i=0;
  129.                 for(i=0;i<5;i++)                                         
  130.                 {
  131.                         dispbuf[i]=temp%10;                         //dispbuf数组里面存放着要在数码管显示的数字
  132.                         temp=temp/10;
  133.                 }                                                                 
  134.                 dula=0;
  135.                 wela=0;
  136.                         for(k=0;k<=5;k++)
  137.                         {
  138.                                 dula=1;
  139.                                 P0=dispcode[dispbuf[k]];
  140.                                 if(xuan==0&&k==5)
  141.                                 P0=dispcode[11];
  142.                                 if(xuan==1&&k==5)
  143.                                 P0=dispcode[12];
  144.                                 if((k==2))
  145.                                 P0=P0|0x80;
  146.                                 dula=0;
  147.                                 P0=dispbitcode[k];
  148.                                 wela=1;
  149.                                 for(j=0;j<=110;j++){}
  150.                                 P0=0xff;                                         //防止出现乱码,一个循环结束必须保证数码管全灭
  151.                                 wela=0;                                         
  152.                         }
  153.         w++;               
  154. }
  155. /**********串口发送程序************/
  156. void uart_int() interrupt 4
  157. {
  158.         TI=0;
  159.         num++;
  160.         if(num==0x02) ES=0;
  161.         else
  162.         SBUF=temp2;
  163. }
复制代码

0.png

课设万用表2.rar

138.47 KB, 下载次数: 130, 下载积分: 黑币 -5

评分

参与人数 2黑币 +9 收起 理由
zz9977 + 5 很给力!
vvv64 + 4

查看全部评分

回复

使用道具 举报

ID:197660 发表于 2017-5-12 18:37 | 显示全部楼层
感谢分享,正在做数字万用表,可以参考
回复

使用道具 举报

ID:125150 发表于 2018-3-31 16:31 | 显示全部楼层
感谢分享,下载看看!
回复

使用道具 举报

ID:355214 发表于 2018-6-25 22:02 | 显示全部楼层
看看,感觉不错
回复

使用道具 举报

ID:337280 发表于 2018-7-20 17:13 | 显示全部楼层
现在在做一个 简易功率测试仪    在想怎么弄交流    看到你的图 我连程序都没敢看      感觉还要再等几年我才能看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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