|
//這是一個(gè)兩路交流信號(hào)的AD轉(zhuǎn)換,然后和標(biāo)準(zhǔn)比較決定輸出大于標(biāo)準(zhǔn)的那一路,默認(rèn)輸出A路 #include <pic.h> #include <math.h> #include <stdio.h> bank1 int re0[40]; //定義存放A/D轉(zhuǎn)換結(jié)果的數(shù)組,在bank0中 bank1 int re1[40]; //定義存放A/D轉(zhuǎn)換結(jié)果的數(shù)組,在bank1中 unsigned int i,j, k; //定義幾個(gè)整型變量 double squ ,squad; //平方寄存器和平方和寄存器,squ又通用為存儲(chǔ)其它數(shù)值 double standard; //定義雙精度浮點(diǎn)型 int uo;
//系統(tǒng)各I/O口初始化 void ioinitial() { TRISA=0X03; //RA0~RA1為輸入 RA2~RA4為輸出 TRISB=0XC0; // RB0~RB5為輸出 RB6~RB7為輸入 RB1=1; //B路關(guān)斷 RB2=0; // 選A導(dǎo)通 RB3=0; // A路導(dǎo)通 RB4=0; // LEDB不亮 RB5=1; // LEDA亮 }
//RA0 A/D轉(zhuǎn)換初始化子程序 void ad0initial() { ADCON0= 0XC1; //選擇A/D通道為RA0,RC時(shí)鐘,且打開A/D轉(zhuǎn)換器 //在工作狀態(tài),使A/D轉(zhuǎn)換時(shí)鐘為 ADCON1=0X02; // RA0 RA1為模擬通道 VDD為參考電壓5V ADIF=0; // 清ad中斷標(biāo)志位 ADIE=1; //A/D轉(zhuǎn)換中斷允許 GIE=1; //全局中斷使能(允許CPU響應(yīng)所有中斷源產(chǎn)生的中斷請求 RP0 =0; //設(shè)置RA0為輸入方式 }
//RA1 A/D轉(zhuǎn)換初始化子程序 void ad1initial() { ADCON0= 0XC9; //選擇A/D通道為RA1,RC時(shí)鐘,且打開A/D轉(zhuǎn)換器 //在工作狀態(tài),使A/D轉(zhuǎn)換時(shí)鐘為 ADCON1=0X02; // RA0 RA1為模擬通道 VDD為參考電壓5V ADIF=0; // 清ad中斷標(biāo)志位 ADIE=1; //A/D轉(zhuǎn)換中斷允許 GIE=1; //全局中斷使能(允許CPU響應(yīng)所有中斷源產(chǎn)生的中斷請求 }
//數(shù)據(jù)采集延時(shí)子程序 void delay0() { for(i=0;i<10;i++) continue; } //AD轉(zhuǎn)換間隔 void delay1() { for(i=0;i<10;i++) continue; } // 存AD0結(jié)果 void ad0store() { ADIF=0; //清除中斷標(biāo)志 re0[i]=ADRES; //1次A/D轉(zhuǎn)換的結(jié)果存入數(shù)組 }
// 存AD1結(jié)果 void ad1store() { ADIF=0; //清除中斷標(biāo)志 re1[j]=ADRES; //1次A/D轉(zhuǎn)換的結(jié)果存入數(shù)組 }
// 處理AD040次AD轉(zhuǎn)換結(jié)果得到交流信號(hào)有效值 void ad0process() {for(i=0,squad=0;i<40;i++) { uo=re0[i]; squ=(double)uo; //強(qiáng)制把采得的數(shù)據(jù)量轉(zhuǎn)換成雙精度數(shù),以便運(yùn)算 squ=squ*5/256; //把每點(diǎn)的數(shù)據(jù)轉(zhuǎn)換成實(shí)際數(shù)據(jù) squ=squ*squ; //求一點(diǎn)電壓的平方 squad=squad+squ; } //以上求得40點(diǎn)電壓的平方和,存于寄存器squad中 squ=squad/40; //求得平均值 squ=sqrt(squ); //開平方,求得最后的電壓值 } // 處理AD140次AD轉(zhuǎn)換結(jié)果得到交流信號(hào)有效值 void ad1process() {for(j=0,squad=0;j<40;j++) { uo=re1[j]; squ=(double)uo; //強(qiáng)制把采得的數(shù)據(jù)量轉(zhuǎn)換成雙精度數(shù),以便運(yùn)算 squ=squ*5/256; //把每點(diǎn)的數(shù)據(jù)轉(zhuǎn)換成實(shí)際數(shù)據(jù) squ=squ*squ; //求一點(diǎn)電壓的平方 squad=squad+squ; } //以上求得40點(diǎn)電壓的平方和,存于寄存器squad中 squ=squad/40; //求得平均值 squ=sqrt(squ); //開平方,求得最后的電壓值 }
// A路通 void aon() { RB1=1; //B路關(guān)斷 RB2=0; // 選A導(dǎo)通 RB3=0; // A路導(dǎo)通 RB4=0; // LEDB不亮 RB5=1; // LEDA亮 } // B路通 void bon() { RB1=0; //A路關(guān)斷 RB2=1; // 選B導(dǎo)通 RB3=1; // B路導(dǎo)通 RB4=1; // LEDB亮 RB5=0; // LEDA不亮 } //主程序 main() { ioinitial(); //系統(tǒng)各I/O口初始化 standard=0.273861 ; //75dbuv轉(zhuǎn)換為電壓為0.273861 for (i=0;i<40;i++) { ad0initial(); //A/D轉(zhuǎn)換初始化 delay0(); //AD采集延時(shí) ADGO=1 ; //啟動(dòng)A/D轉(zhuǎn)換 for(i=1;ADGO=1;i=1) {continue;} //go為1循環(huán)等待,go不為1結(jié)束循環(huán) ad0store() ; // 存AD0結(jié)果 delay1() ; //AD轉(zhuǎn)換間隔 } ad0process() ; // 處理AD040次AD轉(zhuǎn)換結(jié)果得到交流信號(hào)有效值 if(squ>=standard) { aon() ; // A路通 } else { for(k=0;k<10;k++) { for (i=0 ;i<40;i++) { ad1initial(); //A/D轉(zhuǎn)換初始化 delay0(); //AD采集延時(shí) ADGO=1 ; //啟動(dòng)A/D轉(zhuǎn)換 for(i=1;ADGO=1;i=1) {continue;} //go為1循環(huán)等待,go不為1結(jié)束循環(huán) ad1store(); // 存AD1結(jié)果 delay1(); //AD轉(zhuǎn)換間隔 } ad1process(); // 處理AD040次AD轉(zhuǎn)換結(jié)果得到交流信號(hào)有效值 if(squ<standard) break; } if (k=10) { bon(); // b路通 } else { aon() ; // A路通 } } }
|