機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
基于PIC16F72的兩路交流信號(hào)AD轉(zhuǎn)換(C程序)
基于PIC16F72的兩路交流信號(hào)AD轉(zhuǎn)換(C程序)
 更新時(shí)間:2008-7-26 17:03:33  點(diǎn)擊數(shù):3
【字體: 字體顏色

//這是一個(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路通
           }
   }
}

 

  • 上一篇: PIC16F72-讀寫EEPROM程序-使用AT2401+按鍵+顯示(C程序)
  • 下一篇: 基于PIC16F877A的秒表程序
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1