//文件名 p33adc.h #ifndef _P33ADC_H_ #define _P33ADC_H_ //#include "p33adc.h" //--AD1CON1 #define ADON (1<<15) #define MAUTO (7<<5) //采样后 自动转换模式 #define SAMP (1<<1) #define DONE (1<<0) //ADC时钟选择--时钟分频 #define ADC_DIV1 (1-1) #define ADC_DIV5 (5-1) #define ADC_DIV10 (10-1) #define ADC_DIV25 (25-1) #define ADC_DIV50 (50-1) #define ADC_DIV100 (100-1) #define ADC_DIV250 (250-1) //--AD通道选择------ #define ADC_Chanel0 (0x00<<0) #define ADC_Chanel1 (0x01<<0) #define ADC_Chanel2 (0x02<<0) #define ADC_Chanel3 (0x03<<0) #define ADC_Chanel4 (0x04<<0) #define ADC_Chanel5 (0x05<<0) #define ADC_Chanel6 (0x06<<0) #define ADC_Chanel7 (0x07<<0) #define ADC_Chanel8 (0x08<<0) #define ADC_Chanel9 (0x09<<0) #define ADC_Chanel10 (0x0A<<0) #define ADC_Chanel11 (0x0B<<0) #define ADC_Chanel12 (0x0C<<0) #define ADC_Chanel13 (0x0D<<0) #define ADC_Chanel14 (0x0E<<0) #define ADC_Chanel15 (0x0F<<0) //================================ extern void Init_Adc(uint16 ClkDiv) ; extern uint16 AdcSwitch(uint16 Adc_Ch) ; #endif //文件名 p33adc.c #include "global.h" //#include "p33adc.h" //*************************************** // 函数名称:Init_Adc // 函数功能:初始化ADC模块 // 入口参数: // 出口参数:无 // 返回值:无 // ADC时钟来源于Fcpu //*************************************** void Init_Adc(uint16 ClkDiv) { AD1CON1 = 0X0000|MAUTO; //设置为自动模式 10位4通道模式 数据右对齐 AD1CON2 = 0X0000 ; AD1CON3 = 0X0000 | ClkDiv |0X8000; //ADC时钟分频 AD1CON4 = 0X0000 ; //不使能DMA 每个通道分一个字的缓存 AD1CHS123 = 0X0000 ; AD1CHS0 = 0X0000 ; AD1CSSH = 0X0000 ; AD1CSSL = 0X0000 ; AD1CON1 |= ADON ; //开启ADC模块工作 asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时 asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ; } //*************************************** // 函数名称:AdcSwitch // 函数功能:选择AD通道转换 // 入口参数: // 出口参数:无 // 返回值:无 //*************************************** uint16 AdcSwitch(uint16 Adc_Ch) // ADRESH ADRESL { uint16 wTmp ; AD1CON1 |= ADON ; //开启ADC模块工作 AD1CHS0 = (AD1CHS0 & 0XFFE0)|Adc_Ch ;//选择通道 asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时 asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ; AD1CON1 &= ~DONE ; //ADC空闲 AD1CON1 |= SAMP ; //开始转换 while(!(AD1CON1 & DONE)) ; //等待转换完成 // AD1CON1 &= ~DONE ; //ADC空闲 wTmp = ADC1BUF0 & 0X03FF ; //读取转换结果 return wTmp ; } //应用实例 void main(void) { uint16 g_wTmp1 ; //初始化ADC Init_Adc(ADC_DIV25) ;//AD模块时钟输入频率 10BIT AD while(1) { g_wTmp1 = AdcSwitch(ADC_Chanel0) ;//读取转换结果 } }