大家有没有遇到使用AI8G1J08A这款芯片在使用查询方式读取两个通道ADC电压时,只能正确读取一个通道电压值,另一个通道读取的不是输入电压值,甚至如:通道2输入5V,数值没有变化,如将5V接入通道3那么通道2显示(1020)数值,通道2输入接地,在通道3输入接5V通道2也会显示正确读数,使用一个ADC通道就没问题,如使用两个通道则会出现前面的问题。奇怪了!
unsigned int Tvuer=0;
unsigned int sum=0,Set_Sum=0;
void Delay(unsigned int z)
{
unsigned int y,x;
for(y=0;y<z;y++)
for(x=0;x<1140;x++);
}
void Uart1_Init(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE0; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
TI=1;
TR1 = 1; //定时器1开始计时
EA=1;
}
/****************Io设置**************/
void IO_init(void)
{
P3M0=0X03;
P3M1=0XfC;
P5M0=0XDF;
P5M1=0X20;
}
/*************ADC初始化************/
void ADC_Init(void)
{
// P3M0=0x03;
// P3M1=0xfc;
ADC_RES=0;
ADC_RESL=0;
P_SW2|=0x80;
ADCTIM=0x3f; //??????
P_SW2&=0x7f;
ADCCFG=0x0f; //????????2/16
ADC_CONTR=0x80;
Delay(1);
}
/**************ADC处理*************/
unsigned int Get_adc_tep(unsigned char channel)
{
ADC_CONTR|=0x40|channel;
_nop_();
_nop_();
while(!(ADC_CONTR&0x20)); //????
ADC_CONTR&=~0x20; //??
return (ADC_RES<<2)|ADC_RESL;//??+??????
}
void fighting_1(void)
{
u8 f;
u16 volue=0;
for(f=0;f<20;f++)
{
volue+=Get_adc_tep(3);
}
Tvuer=volue/20;
ZKB=(unsigned char)Tvuer;
volue=0;
}
void fighting_2()
{
u8 t;
u16 Imst=0;
for(t=0;t<10;t++)
{
Imst+=Get_adc_tep(2);
}
sum=Imst/10;
Imst=0;
}
/***************主程序*****************/
void main(void)
{
IO_init();
ADC_Init();
Uart1_Init();
while(1)
{
fighting_1();
fighting_2();
printf("读取ADC5的值=%x\n",sum);
Delay(1000);
}
}
|