STC12C5A60S2单片机AD,为什么只能用一路? 10
这是我的程序,网上找的,改了端口,还是只能用P1.0口。#include<STC12C5A60S2.H>#include<intrins.h>#include<basic...
这是我的程序,网上找的,改了端口,还是只能用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;
} 展开
#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;
} 展开
4个回答
展开全部
STC12C5A60S2单片机有8路AD输入,但是它的AD核只有一个,1次只能进行一个输入端的AD转换,你可以看一下它的DataSheet上面是有相关的说明的,在STC官网上也有代码,进入www.stcmcu.com/网站,按下Ctrl键+F键就可以查询你想要的代码了。
展开全部
ADC_CONTR这个寄存器是控制adc转换功能引脚寄存器,你要将这个寄存器的低三位修改为你所使用的引脚号 000 p0.0
001 p0.1
010 p0.2
……
111 p0.7
001 p0.1
010 p0.2
……
111 p0.7
追问
不是已经改了么。。。。
追答
Get_AD_Result()函数里的没改
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
遇到了我以前的问题,首先确认你的程序没问题,我说的是控制字ADC_CONTR和P1ASF的赋值。如果没问题。重点来了,多通道用笨办法给ADC_CONTR赋值,如ch==0,ADC_CONTR直接等于0Xxx,不要用与,或赋值,这样程序比以前多几行判断赋值语句。我知道你看的很多例程和视频是用与/或 给ADC_CONTR赋值的,这些在单通道没有问题,多通道就会不成功。我也是用课程里的例程但其他通道就是没有数据。
STC有提示赋值不要用与或,所以尝试用笨办法,结果真的就解决了。判断通道号直接给ADC_CONTR赋值,测试就成功,7个通道采集不同的电压值,完全没问题。
STC有提示赋值不要用与或,所以尝试用笨办法,结果真的就解决了。判断通道号直接给ADC_CONTR赋值,测试就成功,7个通道采集不同的电压值,完全没问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-09-07
展开全部
可用8路,找找官方的手册看看,上面有代码
追问
我有官网手册,改了对应的口,感觉不对,有大神帮看看程序么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询