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