#define ADC_DIS 0 #define ADC_ENB 1 //ADC通道号定义 #define ADC_Chanel0 (unsigned char)(0x00<<1) #define ADC_Chanel1 (unsigned char)(0x01<<1) #define ADC_Chanel2 (unsigned char)(0x02<<1) #define ADC_Chanel3 (unsigned char)(0x03<<1) #define ADC_Chanel4 (unsigned char)(0x04<<1) #define ADC_Chanel5 (unsigned char)(0x05<<1) #define ADC_Chanel6 (unsigned char)(0x06<<1) #define ADC_Chanel7 (unsigned char)(0x07<<1) //************************************* // 函数名称:Init_AD // 函数功能:对AD初始化,开启或关闭ADC电路 // 入口参数:ADC电路使能参数 // 出口参数:无 /***************************************/ void Init_AD(uint8 Mode) { // 0 1 2 3 4 5 6 7 对应转换时钟为 //Fsys/2 /4 /6 /8 /12 /16 /24 /32 Bank0; if(Mode == ADC_ENB) { ADCON = 0X80 ; //打开ADC模块 ADT = 0 ; ADT |= (2<<5) ; //Fsys/6 转换时钟 ADT |= 5 ; //采样时间设置 0-15 } else { ADCON &= ~0x80 ; //关闭ADC模块 } } //************************************* // 函数名称:AdcSwitch // 函数功能: 在单通道模式下转换某一通道的AD值 // 在(扫描模式下)连续转化1-Chanel的 AD值 // 入口参数:要转换的AD通道号 // 出口参数:无 /***************************************/ void AdcSwitch(uint8 Chanel) { uint8 i = 0 ; for(i=20;i>0;i--) ; Bank0; ; // ADCON = 0X80 ; //打开ADC模块 ADCON = (ADCON & ~(7<<1)) | Chanel ; //选择通道 ADCON |= 0x01 ; //开始转换AD while(ADCON & 0x01); //等待转换结束 return ; } //************************************* // 函数名称:INIT_AD // 函数功能: AD初始化 // 入口参数:要转换的AD通道号 // 出口参数:无 /***************************************/ void INIT_AD(void) { Init_AD(ADC_ENB) ; ADCH = (SETB0) ; //P4.1作为AD输入 } //************************************* // 函数名称:ReadAD // 函数功能: 读AD // 入口参数:要转换的AD通道号 // 出口参数:无 /***************************************/ uint16 ReadAD(void) { AdcSwitch(ADC_Chanel0) ;//选择通道0 并进行AD转换 return (uint16)(ADDH<<8+ADDL);//返回AD值 }
原文地址:http://blog.csdn.net/chuangwu2009/article/details/30470859