12C5A60S2_ADC

#include
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sfr P1ASF = 0x9D; //P1 analog special function
sfr ADC_CONTR = 0xBC; //A/D 轉換控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES  = 0xBD;  //A/D 轉換結果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2    0000,0000
sfr ADC_RESL = 0xBE;  //A/D 轉換結果低2位                                           ADCV.1 ADCV.0    0000,0000
sfr AUXR1 = 0xA2; //Auxiliary Register 1  -  PCA_P4  SPI_P4  S2_P4  GF2    ADRJ   -    DPS  0000,0000
sfr ADC_RES  = 0xBD;  //A/D 轉換結果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2    0000,0000
sfr ADC_RESL = 0xBE;  //A/D 轉換結果低2位                                           ADCV.1 ADCV.0    0000,0000
sfr IE      = 0xA8;  //中斷控制寄存器        EA  ELVD  EADC   ES   ET1  EX1  ET0  EX0  0x00,0000
sfr IP      = 0xB8; //中斷優先級低位      PPCA  PLVD  PADC  PS   PT1  PX1  PT0  PX0   0000,0000
sfr IPH   = 0xB7; //中斷優先級高位       PPCAH  PLVDH  PADCH  PSH  PT1H  PX1H  PT0H  PX0H   0000,0000
#define ADC_POWER = 0X80;
#define ADC_FLAG = 0X10;
#define ADC_START = 0X08;
#define ADC_SET = 0X60;         //設置ADC_CONTR的其他參數
float temp;      //定義全局變量用於保存AD結果;
void Delay2ms()        //@27.000MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 53;
    j = 131;
    do
    {
        while (--j);
    } while (--i);
}


void ADC_Init()
{
    P1ASF = 0X01;        //允許P1^1 ADC
//    AURX1 = 0x00;
    ADC_RES = 0X00;
    ADC_RESL = 0X00;
    ADC_CONTR = ADC_SET|ADC_POWER;    //配置ADC轉換  上電但不啓動
    Delay2ms();          //等待輸入電壓達到穩定;
}
uint ADC_Result()
{
    ADC_CONTR = ADC_SET|ADC_POWER|ADC_START;   //打開ADC開關
       _nop_();                          //延時一個機器週期
          _nop_();                          //延時一個機器週期
             _nop_();                          //延時一個機器週期
                _nop_();                          //延時一個機器週期
                   _nop_();                          //延時一個機器週期
                      _nop_();                          //延時一個機器週期
                         _nop_();                          //延時一個機器週期
                            _nop_();                          //延時一個機器週期
    while(!(ADC_CONTR&ADC_FLAG));  //等待ADC轉換結束;
    ADC_CONTR &= ~ADC_FLAG;         //關閉ADC標誌位;??這裏的關ADC爲什麼不把start關掉??
    return (ADC_RES*4+ADC_RESL);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章