本实验基于Blue博文与部分代码。
http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4298381.html
没有测试原博主的代码,但原博主的代码在我这里使用AIN0通道时读取数据有错误,原因是原博主忽视了ADCH的符号位(因ADCL与ACDH合起来为一个signed int,详情看下图,手册p135)
问题出在Oops处:
uint GetAdcValue(void)
{uint AdValue=0;ADCCON1 |= 0x40;while(!(ADCCON1 & 0x80));AdValue = ADCL >>4;//OopsAdValue |= ADCH <<4;//Oopsreturn AdValue;
}
经过修改后测试可用的代码如下:
int GetAdcValue(void)
{int AdValue=0;ADCCON1 |= 0x40;while(!(ADCCON1 & 0x80));AdValue = ADCL;AdValue |= ADCH<<8;AdValue >>= 4;//取12位有效(包括一位符号位),ADCL最后两位为00,保留位return AdValue;
}
完整代码放出:
void AdcInit(void)//内部温度传感器
{ADCCON1 = 0x33;//软件启动转换ADCCON3 = 0x70;//P0.7为参考电压,12位分辨率,选择AIN0通道输入APCFG = 0x01;//P0.0 使能P0SEL = 0x01;//P0.0 复用为其他功能P0DIR = 0x00;//P0 输入模式P0INP = 0x01;//P0.0 P0.0高阻态
}
int GetAdcValue(void)
{int AdValue=0;ADCCON1 |= 0x40;while(!(ADCCON1 & 0x80));AdValue = ADCL;AdValue |= ADCH<<8;AdValue >>= 4;return AdValue;
}
以上。