www.pudn.com > dsPIC33_CDROM.rar > AD2.c, change:2012-08-30,size:2847b


//例10.2 
/* 
用OC比较方式产生周期为10us的脉冲输出给INT0 
扫描方式对AN0,1,2,3,8进行ADC转换,5次转换结束产生ADC中断 
ADC缓存都从ADC1BUF0开始存放 
*/ 
 
#include "P33FJ32GP204.H" 
#include "PPS.H" 
//禁止时钟切换,禁止引脚多次配置,振荡引脚,主振荡器为XT 
_FOSC(FCKSM_CSDCMD & IOL1WAY_ON & OSCIOFNC_OFF & POSCMD_XT) 
//使用用户设定的振荡器启动,初始振荡器为带PLL的主(XT,HS或EC)振荡器 
_FOSCSEL(IESO_OFF & FNOSC_PRIPLL); 
_FICD(JTAGEN_OFF & ICS_PGD2); 
#define P1 _LATC0 
 
void __attribute__((__interrupt__, auto_psv)) _T1Interrupt(void); 
void __attribute__((__interrupt__, auto_psv)) _ADC1Interrupt(void); 
 
unsigned int AD[5]; 
int main(void) 
{	//外接4MHz晶振,通过PLL得到总振荡频率80MHz,Fcy=40MHz,Tcy=25ns 
	CLKDIVbits.PLLPRE=0;	// N1=2,此输出为4/2=2MHz,符合0.8MHz~8.0MHz的要求  
	PLLFBDbits.PLLDIV=78; 	// M=80,此输出为2×80≈160MHz,符合100MHz~200MHz的要求 
	CLKDIVbits.PLLPOST=0;	// N2=2,此输出为160/2=80MHz,符合12.5MHz~80MHz的要求 
	while(OSCCONbits.COSC != 0b011);	//等待时钟稳定 
	RCONbits.SWDTEN=0;	//禁止WDT 
	TRISA=0xFFFF; 
	TRISB=0xFEFF;	//除RB8外,其余B口为输入口 
	TRISC=0xFFFE;	//RC0为输出,其余C口为输入口 
	AD1PCFGL=0xFEF0;	//AN0,1,2,3,8为模拟口		 
  //AD1CON1设置,未设置位按默认值,下同	 
	_AD12B=1;		//12位 
	_FORM=0b00;		//整数格式 
	_SSRC=0b001;	//INT0启动ADC转换 
	_ASAM=1;		//ADC转换结束时立即自动采样,SAMP自动置1 
  //AD1CON2设置 
  	_VCFG=0b000;	//ADC参考电压为AVDD和AVSS即电源电压 
  	_CSCNA=1;		//扫描 
  	_SMPI=4;		//5次AD转换产生一次中断 
  	_BUFM=0;		//总是从ADC1BUF0开始填充 
  	_ALTS=0;		//只用A开关 
   //AD1CON3设置 
   	_ADRC=0;		//系统时钟作为ADC时钟 
   	_ADCS=4;		//TAD=5×TCY=125ns>117.6ns 
   //AD1CHS0设置 
   	_CH0NA=0;		//模拟电压负端输入接VRFEF-即地 
   	_CH0SA=8;		//模拟电压正端输入接AN8 
   //AD1CSSL设置 
   	AD1CSSL=0x010F;	//扫描AN0,1,2,3,8 
  //INT0设置 
  	_INT0EP=1;		//INT0下降沿有效 
  	_AD1IF=0; 
  	_AD1IE=1; 
  	_AD1IP=6; 
  //OC2设置 
  	PPSUnLock; 
	RPOR4bits.RP8R=0b10011;	//OC2连接到RP8/RB8 
	PPSLock; 
  //TMR2设置 
	T2CONbits.TSIDL=0; 
	T2CONbits.TGATE=0;	//门控关闭 
	T2CONbits.TCKPS=0b00;	//分频系数为1:1 
	T2CONbits.TCS=0;		//内部时钟为TMR2的时基 
	TMR2=0; 
  //翻转周期为5us,电平翻转时刻为定时器0,得到的脉冲周期为10us 
	OC2R=0;			//此值与本例无关	 
	PR2=199; 
	OC2CONbits.OCSIDL=0; 
	OC2CONbits.OCTSEL=0;	//TMR2为时钟 
	OC2CONbits.OCM=0b011;	//翻转模式 
  //在相关的寄存器均设置好后再使能定时器 
	T2CONbits.TON=1; 
			 
  	_IPL=4;		//CPU中断优先级为4 
	_IPL3=0;		//CPU中断优先级≤7 
	_NSTDIS=1;		//禁止嵌套中断 
	_ALTIVT=0;		//使用标准中断向量 
  	T1CONbits.TON=1;	//启动定时器 
  	AD1CON1bits.ADON=1;//启动ADC模块 
  	P1=1; 
	while(1); 
	return(0);	 
} 
 
void __attribute__((__interrupt__, auto_psv)) _ADC1Interrupt(void) 
{	volatile unsigned int *P; 
	unsigned char i; 
	P1=~P1; 
	_AD1IF=0; 
	P=&ADC1BUF0; 
	for (i=0;i<5;i++) 
		AD[i]=*P++;		//逐一读ADC缓冲区的内容 
	Nop(); 
}