如题 测试AIN0时正常 程序的AIN改为123时便会出现 即使AIN123悬空也会有变化的数据输出。。求解答
#define PRSC_EN 1 //允许预分频
#define PRSCVL 19 //预分频值
#define STDBM 0 //正常工作模式
#define READ_START 0 //读数时不进行A/D转换 2种启动方式之一
#define Adc_Start() {ADCCON|=1;}
/***********************************************
*函数名称:void ADC_Init(unsigned char channel)
*参数说明:channel:通道
*返 回 值:无
*全局变量: 无
*功 能:ADC初始化,手动启动ADC,ADC输入时钟为1MHz
************************************************/
void ADC_Init(unsigned char channel)
{
ADCCON&=(~((1<<14)|(0xff<<6)|(0x7<<3)|(1<<2)|(1<<1)|(1<<0))); //14-0 bit清零
ADCCON|=(PRSC_EN<<14)|(PRSCVL<<6)|(channel<<3)|(STDBM<<2)|(READ_START<<1);
// [14:] 1 开启预分频,预分频值19,模拟通道(0),不待机, 手动启动
}
/***********************************************
*函数名称:int ADC_Read(void)
*参数说明:无
*返 回 值:寄存器ADCDAT0中的ADC转换数据值
*全局变量: 无
*功 能:返回普通ADC转换数据值
************************************************/
int ADC_Read(void)
{
Adc_Start(); //启动A/D转换
while(ADCCON&(1<<0)); //因为成功启动A/D转换后,该位会
//自动清零,因此在这里检查ADC是否真正启动
while(!(ADCCON&(1<<15))); //使用查询方式等待ADC转换结束
return ((int)(ADCDAT0&0x3ff)); //ADC转换结束后,从寄存器
//ADCDAT0中读取A/D转换值。注意,低10位才是A/D
//转换值,所以需要将高位屏蔽掉
}
------解决思路----------------------
悬空理论上应该是随机数字,悬空就像天线一样,更容易受到电磁波影响。
------解决思路----------------------
要么开启中断,AD转换完成会触发中断,还有就是在loop中循环读取转换完成标志位,然后再读取。请仔细阅读手册,操作对应的寄存器即可。
------解决思路----------------------
AD转换完成会触发中断,还有就是在loop中循环读取转换完成标志位,然后再读取。请仔细阅读手册,操作对应的寄存器即可。