|
最近在51黑論壇上面看到了很多大神分享的直流電壓表的作品,深深受益,于是自己嘗試著做了一個交流電壓0~220V、交流電流0~40A的交流電壓、電流計。在我設(shè)計的作品里,為了測量準(zhǔn)確,我假設(shè)電壓、電流值通過電壓、電流傳感器,輸出成了0~5V的交流電壓信號,通過變壓器的降壓,使電壓的幅值小于5V,方便輸入ADC0809進(jìn)行轉(zhuǎn)換。要是想用設(shè)計的電壓、電流計直接測量0~220V、0~40A的電壓電流值,只需改變變壓器的匝數(shù)比。
不過這個作品的缺陷還是挺多的,比如說與PC機(jī)的接口就是個擺設(shè),完全沒用,還有就是串口本來想輸出電壓、電流的有效值,但是沒有成功,不知道是編程的原因還是硬件連接的問題;再者,計算有效值的算法是取最大值比上1.414,所以交流值變小時得重新啟動電壓、電流計進(jìn)行測量。
希望這個粗陋的設(shè)計能對大家有些用處,同時還希望大家能給予一些意見和建議,謝謝哈~
0.png (792.81 KB, 下載次數(shù): 64)
下載附件
2016-9-9 17:41 上傳
下面是萬用表的源代碼:
- /*****單相交流電壓、電流計設(shè)計,交流有效值0-220V,電流有效值0-40A*****/
- #include<reg51.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- /******六位七段共陰極數(shù)碼顯示管*******/
- 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;
- /******主函數(shù)********/
- 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();
- }
- }
- /********電壓,電流傳感器的數(shù)據(jù)采集*******/
- void caiji()
- {
- uchar i,j;
- /*電壓傳感器數(shù)據(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;
- /*電流傳感器數(shù)據(jù)采集*/
- 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;
- }
-
- }
- /********串行口發(fā)送電壓,電流值的有效值**********/
- void uart()
- {
- uchar i;
- SBUF=temp1; //啟動串口發(fā)送
- for(i=0;i<200;i++);
- }
-
- /*adc0809時鐘*/
- void clok() interrupt 1
- {
- TH0=(65535-10)/256;
- TL0=(65535-10)%256;
- clock=~clock;
- }
- /*******動態(tài)顯示掃描********/
- 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數(shù)組里面存放著要在數(shù)碼管顯示的數(shù)字
- 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; //防止出現(xiàn)亂碼,一個循環(huán)結(jié)束必須保證數(shù)碼管全滅
- wela=0;
- }
- w++;
- }
- /**********串口發(fā)送程序************/
- void uart_int() interrupt 4
- {
- TI=0;
- num++;
- if(num==0x02) ES=0;
- else
- SBUF=temp2;
- }
復(fù)制代碼
0.png (68.61 KB, 下載次數(shù): 82)
下載附件
2016-9-9 17:41 上傳
|
-
-
課設(shè)萬用表2.rar
2016-9-9 17:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
138.47 KB, 下載次數(shù): 130, 下載積分: 黑幣 -5
評分
-
查看全部評分
|