|
最近在51黑论坛上面看到了很多大神分享的直流电压表的作品,深深受益,于是自己尝试着做了一个交流电压0~220V、交流电流0~40A的交流电压、电流计。在我设计的作品里,为了测量准确,我假设电压、电流值通过电压、电流传感器,输出成了0~5V的交流电压信号,通过变压器的降压,使电压的幅值小于5V,方便输入ADC0809进行转换。要是想用设计的电压、电流计直接测量0~220V、0~40A的电压电流值,只需改变变压器的匝数比。
不过这个作品的缺陷还是挺多的,比如说与PC机的接口就是个摆设,完全没用,还有就是串口本来想输出电压、电流的有效值,但是没有成功,不知道是编程的原因还是硬件连接的问题;再者,计算有效值的算法是取最大值比上1.414,所以交流值变小时得重新启动电压、电流计进行测量。
希望这个粗陋的设计能对大家有些用处,同时还希望大家能给予一些意见和建议,谢谢哈~
下面是万用表的源代码:
- /*****单相交流电压、电流计设计,交流有效值0-220V,电流有效值0-40A*****/
- #include<reg51.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- /******六位七段共阴极数码显示管*******/
- uchar code dispbitcode[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x76,0x38};
- uchar dispbuf[8]={0,0,0,0,0,0,0,0};
- void caiji();
- void uart();
- uint temp,temp1,temp2;
- float getdata1,getdata2,max1,max2;
- uint w; //电压值,电流值切换显示所需变量
- uchar num=0;
- sbit dula=P2^0;
- sbit wela=P2^1;
- sbit vi=P2^2;
- sbit xuan=P2^3;
- sbit ST=P3^6;
- sbit OE=P3^7;
- sbit EOC=P3^4;
- sbit clock=P3^2;
- /******主函数********/
- void main()
- {
- xuan=0;
- max1=0;
- max2=0;
- w=0;
- SCON=0x80; //串行口初始化为方式2
- PCON=0x00;
- EA=1;
- ES=1;
- ET0=1;
- ET1=1;
- TMOD=0x11;
- TH0=(65535-10)/256; //adc0809时钟
- TL0=(65535-10)%256;
- TH1=(65535-10000)/256; //定时中断扫描时间
- TL1=(65535-10000)%256;
- TR0=1;
- TR1=1;
- while(1)
- {
- caiji();
- uart();
- }
- }
- /********电压,电流传感器的数据采集*******/
- void caiji()
- {
- uchar i,j;
- /*电压传感器数据采集*/
- for(j=0;j<10;j++)
- {
- getdata1=0;
- vi=0;
- ST=1;
- ST=0;
- ST=1;
- while(EOC==1);
- while(EOC==0);
- OE=0;
- getdata1=P1;
- for(i=0;i<=200;i++);
- OE=1;
- getdata1=getdata1/51*717/250*4400;
- if(getdata1>max1)
- max1=getdata1;
- temp1=max1/1.414;
- }
- //if(temp1>22000)
- //temp1=22000;
- /*电流传感器数据采集*/
- for(j=0;j<10;j++)
- {
- getdata2=0;
- vi=1;
- ST=1;
- ST=0;
- ST=1;
- while(EOC==1);
- while(EOC==0);
- OE=0;
- getdata2=P1;
- for(i=0;i<=200;i++);
- OE=1;
- getdata2=getdata2/51*717/250*800;
- if(getdata2>max2)
- max2=getdata2;
- temp2=max2/1.414;
- // if(temp2>4000)
- // temp2=4000;
- }
-
- }
- /********串行口发送电压,电流值的有效值**********/
- void uart()
- {
- uchar i;
- SBUF=temp1; //启动串口发送
- for(i=0;i<200;i++);
- }
-
- /*adc0809时钟*/
- void clok() interrupt 1
- {
- TH0=(65535-10)/256;
- TL0=(65535-10)%256;
- clock=~clock;
- }
- /*******动态显示扫描********/
- void xianshi() interrupt 3
- {
- uchar i,j,k;
- TH1=(65535-10000)/256;
- TL1=(65535-10000)%256;
- if(w==500)
- {
- w=0;
- xuan=~xuan;
- }
- if(xuan==0)
- temp=temp1;
- else
- temp=temp2;
- i=0;
- for(i=0;i<5;i++)
- {
- dispbuf[i]=temp%10; //dispbuf数组里面存放着要在数码管显示的数字
- temp=temp/10;
- }
- dula=0;
- wela=0;
- for(k=0;k<=5;k++)
- {
- dula=1;
- P0=dispcode[dispbuf[k]];
- if(xuan==0&&k==5)
- P0=dispcode[11];
- if(xuan==1&&k==5)
- P0=dispcode[12];
- if((k==2))
- P0=P0|0x80;
- dula=0;
- P0=dispbitcode[k];
- wela=1;
- for(j=0;j<=110;j++){}
- P0=0xff; //防止出现乱码,一个循环结束必须保证数码管全灭
- wela=0;
- }
- w++;
- }
- /**********串口发送程序************/
- void uart_int() interrupt 4
- {
- TI=0;
- num++;
- if(num==0x02) ES=0;
- else
- SBUF=temp2;
- }
复制代码
|
评分
-
查看全部评分
|