/* A/D转化初始化 ADSEL //ANS7,ANS6,ANS5,ANS4,ANS3,ANS2,ANS1,ANS0 //After POR:1,1,1,1,1,1,1,1;默认为模拟输入 //RE2, RE1, RE0, RA5, RA3, RA2, RA1, RA0 //1,1,1,1,0,0,1,1 ADCON0 //ADFM,VCFG1, VCFG0,CHS2,CHS1,CHS0,GO/DONE,ADON //After POR:0,0,0,0,0,0,0,0 //1,right justify,0,vss,0,vdd ADCON1 //-,ADCS2,ADCS1,ADCS0,-,-,-,- //0,1, 0, 1, 0,0,0,0 */ //ADIF=0; ANSEL=0xff; //8个通道都打开;但程序中,尚未对chn2、3,进行处理 ADCON0=0X81; //右对齐,VSS,VDD,ADON=1 ADCON1=0x50; // 16Tosc, Tad=4us,@4MHz
/******************************************************************** Function Name :Collect_Data Input : Return : Access Register: Description :最底层的按通道采集程序 Subroutine : stack Layers :0 Run Time(us) : ***********************************************************************/
/* A/D数据采集 注:在ADC采样通道转换时,要注意有一个延时 每一bit的AD转换时间为Tad,在下一次采集前,至少需要等待2Tad的时间. */ void Collect_Data (UC8 chn) { ADCON0 &=0x81; // clear current channel select ADCON0 |=(chn<<2);// apply the new channel select /* 延时至少2Tad时间 */ DelayUs(8); GODONE =1; while(GODONE)continue;// 等待转换结束,转换结束GODONE自动被硬件清零 ADIF=0; //虽然没用中断,但是标志位还是要清零 ADC_Data.c[0]=ADRESL; ADC_Data.c[1]=ADRESH & 0x03;//取10位A/D转换数据
}
/* ADC,10Bit,右对齐,9..0,ADRESH[1..0]+ADRESL[7..0] */ union ADC_Value{ UC8 c[2]; INT16 i; }ADC_Data; //全局变量
|
|