STC自带ADC多路采样问题,以及如果获得结果,请帮忙看看...
我用的是STC12C5A60S2,自带的ADC,有些疑惑程序如下的一部分:
#define ADC_POWER 0x80
#define SPEEDHH 0x60
#define SPEEDH 0x40
#define SPEEDL 0x20
#define SPEEDLL 0x00
#define ADC_START 0x08
#define ADC_FLAG 0x10
uchar ADC_CH[]={0x00,0x01,0x020,0x30,0x04,0x05,0x06,0x07};
uchar ADC_CHresult
uchar ADC_data;
void ADC_Init()
{
P1ASF=0xff;//选择ADC通道
ADC_CONTR=ADC_POWER|SPEEDHH;
ADC_RES=0;
ADC_RESL=0;
}
void GET_ADCresult(uint i)
{
ADC_CONTR=ADC_POWER|SPEEDHH|ADC_START|ADC_CH;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=!ADC_FLAG;
ADC_CHresult=???
}
想知道该怎么样获得结果。10位的。而且这个函数可以用来做8路顺序采样吗?求指导 /*********************************************************************
函数名称:InitADC()
函数功能:初始化AD
返 回 值:无
入 参:无
**********************************************************************/
void InitADC(void)
{
ADC_RES = 0;
ADC_RESL = 0; //clear previous result
P1ASF |= 0x13; //Open P10,P11 and P14 channels ADC function
AUXR1 |= 0x04; //0000,0100, 令 ADRJ=1
//10位A/D转换结果的高2位存放在ADC_RES中低2位中,低8位存放在ADC_RESL中
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
dlms(1); //使输入电压达到稳定
}
/********************************************************t*************
函数名称:g_AD_result()
函数功能:A/D转换
返 回 值:有
入 参:有
**********************************************************************/
uint g_AD_result(uchar Channel1)
{
uchar ADC_finished=0; //Define A/D conversion flag
P1M0 = 0X00;
P1M1 = 0X13; //P1.X口做A/D使用,现将其设置成高阻输入
ADC_CONTR = AD_SPEED;
_nop_(); //空操作,延迟一个机器周期
if(Channel1==1)
{
s=0;
//Choose the P1.0 channel of A/D inupt
_nop_();
}
else if(Channel1==0)
{
s=1; //Choose the P1.1 channel of A/D inupt
_nop_();
}
else if(Channel1==2)
{
s=4; //Choose the P1.4 channel of A/D inupt
_nop_();
}
ADC_CONTR = (ADC_CONTR &0xf8)|s;
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
dlms(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 启动A/D转换
ADC_finished = 0;
while(ADC_finished == 0) //等待A/D转换完成
{
ADC_finished =(ADC_CONTR & 0X10); //判断A/D转换是否结束
}
ADC_CONTR = 0XE7; //转换完成后,ADC_FLAG=1,软件清零;关闭A/D转换
return(ADC_RES<<8 | ADC_RESL); //返回 A/D 10位转换结果
}
格式有点乱,自己在结合datasheet看一下吧 可以。只要读高8位。转换完后读取出来就好。
下面有段参考
void get_adc()
{ unsigned int temp1,temp2;
unsigned char i;
for(i=0;i<64;i++)
{
ADC_CONTR=0xa8;
delay_nop();
delay_nop();
delay_nop();
delay_nop();
while (!(ADC_CONTR&0x10))
temp1=ADC_RES;
temp1=temp1<<2;
temp1=temp1|ADC_RESL;
delay_nop();
delay_nop();
delay_nop();
ADC_CONTR=0xa9;
delay_nop();
delay_nop();
delay_nop();
delay_nop();
while (!(ADC_CONTR&0x10))
temp2=ADC_RES;
temp2=temp2<<2;
temp2=temp2|ADC_RESL;
//////////////////////////////////
datas=temp2+temp1;
// (float)datas;
}
}
记号一下,以后慢慢看
页:
[1]