#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);
}