STC12C5A60S2单片机AD,为什么只能用一路?

这是我的程序,网上找的,改了端口,还是只能用P1.0口。
#include <STC12C5A60S2.H>
#include <intrins.h>
#include <basic.h>

void init_adc(void)
{
P1ASF=0x02; //AD功能寄存器,设置I/O口作为AD转换实用。使用P1.1口。
ADC_RES=0; //清理结果寄存器的值
ADC_RESL=0; //清理结果寄存器的值
ADC_CONTR=0x81; //开启AD电源并设置转换周期为540个时钟周期转换一次。
//ADC_POWER=1; CHS2,1,0为0,0,1用p1.1作为输入。SPEED1,0为0,540个时钟,
delayms(100);
}

uint Get_AD_Result()
{
uint d=0;
ADC_CONTR =0x88;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & 0X10));
ADC_CONTR &= ~0X10;
d |= ADC_RES;
d <<= 2;
d |= ADC_RESL;
return d;
}

STC12C5A60S2单片机有8路AD输入,但是它的AD核只有一个,1次只能进行一个输入端的AD转换,你可以看一下它的DataSheet上面是有相关的说明的,在STC官网上也有代码,进入www.stcmcu.com/网站,按下Ctrl键+F键就可以查询你想要的代码了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-07
ADC_CONTR这个寄存器是控制adc转换功能引脚寄存器,你要将这个寄存器的低三位修改为你所使用的引脚号 000 p0.0
001 p0.1
010 p0.2
……

111 p0.7追问

不是已经改了么。。。。

追答

Get_AD_Result()函数里的没改

本回答被网友采纳
第2个回答  2018-12-13
遇到了我以前的问题,首先确认你的程序没问题,我说的是控制字ADC_CONTR和P1ASF的赋值。如果没问题。重点来了,多通道用笨办法给ADC_CONTR赋值,如ch==0,ADC_CONTR直接等于0Xxx,不要用与,或赋值,这样程序比以前多几行判断赋值语句。我知道你看的很多例程和视频是用与/或 给ADC_CONTR赋值的,这些在单通道没有问题,多通道就会不成功。我也是用课程里的例程但其他通道就是没有数据。
STC有提示赋值不要用与或,所以尝试用笨办法,结果真的就解决了。判断通道号直接给ADC_CONTR赋值,测试就成功,7个通道采集不同的电压值,完全没问题。
第3个回答  2014-09-07
可用8路,找找官方的手册看看,上面有代码追问

我有官网手册,改了对应的口,感觉不对,有大神帮看看程序么?

相似回答