|
大家有沒有遇到使用AI8G1J08A這款芯片在使用查詢方式讀取兩個通道ADC電壓時,只能正確讀取一個通道電壓值,另一個通道讀取的不是輸入電壓值,甚至如:通道2輸入5V,數(shù)值沒有變化,如將5V接入通道3那么通道2顯示(1020)數(shù)值,通道2輸入接地,在通道3輸入接5V通道2也會顯示正確讀數(shù),使用一個ADC通道就沒問題,如使用兩個通道則會出現(xiàn)前面的問題。奇怪了!
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位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時器時鐘1T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
TMOD &= 0x0F; //設(shè)置定時器模式
TL1 = 0xE0; //設(shè)置定時初始值
TH1 = 0xFE; //設(shè)置定時初始值
ET1 = 0; //禁止定時器中斷
TI=1;
TR1 = 1; //定時器1開始計時
EA=1;
}
/****************Io設(shè)置**************/
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);
}
}
|
|