仿真 程序 .需要 原理圖設計,自己設計,免費開源 回饋51黑論壇壇友
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
設計基于MCS-51的單相工頻交流電參數(shù)檢測儀。交流有效值0-220V,電流有效值0-40A。電壓、電流值經(jīng)電壓、電流傳感器輸出有效值為0-5V的交流信號,傳感器輸出的電壓、電流信號與被測電壓、電流同相位。 基本要求如下 (1) 電流、電壓測量精度0.1% (2) 檢測電壓、電流的相位角,求出功率因素 (3) 電流、電壓有效值由LED輪流顯示,也可由按鍵切換顯示量
單片機源程序如下:
- #include<regx51.h>
- #include<intrins.h>
- #include<absacc.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define addo (5.0/65535.0)
- uchar vol[]="Voltage:";//定義串口通信的電壓提示語
- uchar cur[]="Current:";//定義串口通信的電流提示語
- uchar pf[]="Power Factor:";//定義串口通信的功率因數(shù)提示語
- uchar num[10]={'0','1','2','3','4','5','6','7','8','9'};//定義串口通信的數(shù)字字符查表傳送
- sbit DIN = P2^0;
- sbit CS = P2^1;
- sbit CLK = P2^2;
- sbit SDO = P2^3;
- sbit SCK = P2^4;
- sbit CONV = P2^5;
- sbit SDI=P2^6;
- uint High,Low;
- sbit K=P3^2;
- bit choose=1;//定義A/D轉(zhuǎn)換器通道選擇變量
- double t=0;
- static unsigned char disbuf[8] = {1,2,3,4,5,6,7,8};//數(shù)碼管顯示緩沖數(shù)據(jù)
- /*延時函數(shù)*/
- void delay_ms(uint n)
- {
- uchar i;
- while(n--)
- {
- for(i=0;i<100;i++);
- }
- }
- /*定時器T0初始化 */
- void Init_T0()
- {
- TMOD=0x09;
- TH0=0;
- TL0=0;
- }
- /*數(shù)碼管進行顯示*/
- void WriteByte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DIN = ((dat<<i)&0x80)?1:0;
- CLK = 0;
- _nop_();
- CLK = 1;
- _nop_();
- }
- }
- void MAX7221_WRITE(uchar addr,uchar dat)
- {
- CS = 0;
- WriteByte(addr);
- WriteByte(dat);
- CS = 1;
- }
- void MAX7221_Initial(void)
- {
- MAX7221_WRITE(0x0A,0x07);
- MAX7221_WRITE(0x0B,0x07);
- MAX7221_WRITE(0x0C,0x01);
- MAX7221_WRITE(0x0F,0x00);
- MAX7221_WRITE(0x09,0xff);
- }
- void display(uchar *str)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- MAX7221_WRITE(i+1,str[i]);
- }
- }
- /*A/D轉(zhuǎn)換讀取轉(zhuǎn)換值*/
- uint LTC1864_READ(void)
- {
- uchar i;
- uint temp = 0;
- CONV = 0;
- CONV = 1;
- _nop_();_nop_();_nop_();
- CONV = 0;
- SDO = 1;
- for(i=0;i<16;i++)
- {
- SCK = 1;
- _nop_();
- SCK = 0;
- _nop_();
- if(i==0)
- {
- SDI=1;
- }
- if(i==1)
- {
- choose= !choose;
- SDI=choose;
- }
- temp <<= 1;
- if(SDO==1)
- {
- temp |= 0x0001;
- }
- }
- CONV = 1;
- return temp;
- }
- /*電流值進行數(shù)碼管轉(zhuǎn)換顯示*/
- void HEXTOBCD_I(uint temp)
- {
- disbuf[0] = temp/10000;
- disbuf[1] = (temp%10000/1000)|0x80;
- disbuf[2] = temp%1000/100;
- disbuf[3] = temp%100/10;
- disbuf[4] = temp%10;
- disbuf[5] = 15;
- disbuf[6] = 15;
- disbuf[7] = 1;
- }
- /*電壓值進行數(shù)碼管轉(zhuǎn)換顯示*/
- void HEXTOBCD_V(uint temp)
- {
- disbuf[0] = temp/10000;
- disbuf[1] = temp%10000/1000;
- disbuf[2] = (temp%1000/100)|0x80;
- disbuf[3] = temp%100/10;
- disbuf[4] = temp%10;
- disbuf[5] = 15;
- disbuf[6] = 15;
- disbuf[7] = 2;
- }
- /*定時器T1初始化*/
- void Time_T1(void)
- {
- TMOD=0x10;
- TL1=0xb0;
- TH1=0x3c;
- IE=0x88;
- TR1=1;
- }
- void delay_choose(int t)
- {
- Time_T1();
- while(t--)
- {
- while(!TF1);
- TF1=0;
- TL1=0x3c;
- TH1=0X88;
- }
- }
- /*讀取相位差方波正脈沖寬度*/
- void Message_Width()
- {
- while(K);
- TR0=1;
- while(!K);
- while(K);
- TR0=0;
- High=TH0;
- Low=TL0;
- }
- /*串口初始化波特率為9600*/
- void UART_init(void)
- {
- SCON = 0x50;//串口方式1
- TMOD = 0x20;// 定時器使用方式2自動重載
- TH1 = 0xFD;//9600波特率對應的預設數(shù),定時器方式2下,TH1=TL1
- TL1 = 0xFD;
- TR1 = 1;//開啟定時器,開始產(chǎn)生波特率
- }
- /*發(fā)送一個字符*/
- void UART_send_byte(uchar dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /*發(fā)送一個字符串*/
- void UART_send_string(uchar *buf)
- {
- while (*buf != '\0')
- {
- UART_send_byte(*buf++);
- }
- }
- /*電流顯示及發(fā)送*/
- void dianliu()
- {
- uchar vol_value[7];//定義串口通信數(shù)據(jù)緩沖數(shù)組
- uint I;
- I=(int)(t*30500);
- HEXTOBCD_I(I);
- display(disbuf);
- delay_ms(10);
- /*串口通信逐一發(fā)送電流值*/
- UART_init();
- UART_send_string(cur);
- vol_value[0]=num[disbuf[0]%16];
- UART_send_byte(vol_value[0]);
- vol_value[1]=num[disbuf[1]%16];
- UART_send_byte(vol_value[1]);
- UART_send_byte(0x2E);
- vol_value[2]=num[disbuf[2]%16];
- UART_send_byte(vol_value[2]);
- vol_value[3]=num[disbuf[3]%16];
- UART_send_byte(vol_value[3]);
- vol_value[4]=num[disbuf[4]%16];
- UART_send_byte(vol_value[4]);
- UART_send_byte(0x41);
- UART_send_byte(0x0d);
- UART_send_byte(0x0a);
- }
- /*電壓顯示及發(fā)送*/
- void dianya()
- {
- int I;
- uchar vol_value[7];//定義串口通信數(shù)據(jù)緩沖數(shù)組
-
- I=(int)(t*5866);
- HEXTOBCD_V(I);
- display(disbuf);
- delay_ms(10);
- /*串口通信逐一發(fā)送電壓值*/
- UART_init();
- UART_send_string(vol);
- vol_value[0]=num[disbuf[0]%16];
- UART_send_byte(vol_value[0]);
- vol_value[1]=num[disbuf[1]%16];
- UART_send_byte(vol_value[1]);
- vol_value[2]=num[disbuf[2]%16];
- UART_send_byte(vol_value[2]);
- UART_send_byte(0x2E);
- vol_value[3]=num[disbuf[3]%16];
- UART_send_byte(vol_value[3]);
- vol_value[4]=num[disbuf[4]%16];
- UART_send_byte(vol_value[4]);
- UART_send_byte(0x56);
- UART_send_byte(0x0d);
- UART_send_byte(0x0a);
- }
- /*串口通信發(fā)送功率因數(shù)*/
- void send_P()
- {
- uchar vol_value[7];//定義串口通信數(shù)據(jù)緩沖數(shù)組
- uint X1,I;
- double t=0;
- Init_T0();
- Message_Width();
- X1=(High*256+TL0)/0.92;
- t=(X1+t)/2;
- /*串口通信逐一發(fā)送功率因數(shù)*/
- t=t*0.000314;
- I=abs(cos(t-0.147)*1000);
- UART_init();
- UART_send_string(pf);
- vol_value[0]=num[I/1000];
- UART_send_byte(vol_value[0]);
- UART_send_byte(0x2E);
- vol_value[0]=num[I%1000/100];
- UART_send_byte(vol_value[0]);
- vol_value[0]=num[I%100/10];
- UART_send_byte(vol_value[0]);
- vol_value[0]=num[I%10];
- UART_send_byte(vol_value[0]);
- UART_send_byte(0x0d);
- UART_send_byte(0x0a);
- UART_send_byte(0x0d);
- UART_send_byte(0x0a);
- }
- void main()
- {
- Time_T1();
- MAX7221_Initial();
- delay_ms(10);
- LTC1864_READ();
- while(1)
- {
- delay_ms(1000);
- t= LTC1864_READ()*addo;//讀取電流模擬量
- dianliu();
- delay_ms(1000);//延時2s
- t= LTC1864_READ()*addo;//讀取電壓模擬量
- delay_choose(40);
- dianya();
- send_P();
- delay_choose(40);//延時2s
- }
- }
復制代碼
仿真程序和原理圖下載:
基于51單片機的電參數(shù)終端采集控制設計.7z
(1.49 MB, 下載次數(shù): 20)
2024-7-10 15:06 上傳
點擊文件名下載附件
|