本帖最后由 lankii35 于 2019-12-5 16:06 编辑
adc做温度采集也遇到问题,求解答
#define AD_PROT P2M3 //an11 通道11
#define AD_PIN P2_3
void ADC_IN(void)
{
AD_PROT=0x40;//P24设置为模拟输入
ADCC0 = 0x80; //打开ADC转换电源
delay(20); //延时20us,确保ADC系统稳定
ADCC1 = 0x0B; //选择外部通道11
// ADCC2 = 0x4B; //转换结果12位数据,数据右对齐,ADC时钟16分频
ADCC2 = 0xCB; //转换结果10位数据,右对齐D16 xxxxxx9876543210
// ADCIF=0; //0:无 ADC 转换中断标志
//VREFO=0; //0:VREF 不输出
ADCC0|=0x02;//内部参考电压4v//vref脚接vcc5v
SCANCON=0; //单次扫描转换
}
unsigned int get_adc1_v(void){
unsigned int ad_value=0;
ADCR=0;
ADCC0 &= ~0x40; //关闭ADC转换
ADCC0 |= 0x40; //启动ADC转换
while(!(ADCC0&0x20)); //等待ADC转换结束
ADCC0 &=~ 0x20; //清除标志位
ad_value = ADCR; //获取ADC的值
return ad_value;
}
//二分查找 adc数组 a[]
unsigned char binSearch(unsigned int x, unsigned int a[], unsigned char n)
{
unsigned char low, high, mid;
unsigned char res=0;
low = 0;
high = n-1;
//注意,这里必须用<=, 用<不对,一直返回-1
while(low <= high)
{
mid = (low + high) / 2;
if((x < a[mid])){
high = mid;
continue;
}
if((x >=a[mid]) && x<=a[mid+1] ){
res= ((a[mid]-x)<(a[mid+1]-x))?mid:mid+1;
break;
}
if(x >a[mid]) {
low = mid;
continue;
}
if((x <=a[mid]) && x>=a[mid-1] ){
res= ((a[mid]-x)<(a[mid-1]-x))?mid:mid-1;
break;
}
}
return res;
}
12脚是vref 做adc的时候需要外接电压3.v吗,还是不用管直接设定内部vref3v,这个12脚可以直接当io用
我是arm芯片用的多,51的芯片还是第一次
|