stc12c5a60s2 + GP2Y1010AU 嘗試
從傳感器一直讀不出正確的數值,總是拿到3.7-3.8v的電壓。。。向傳感器吹煙測試也不管用。。。折騰一天了。。。
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
//POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
P1M1=0x20; //P1^5僅高阻輸入//100000//AD口
P1M0=0x10; //P1^4推挽輸出(強上拉輸出,可達20mA,要加限流電阻)//10000//LED控制IO
P1ASF=0x20;// P1^5作為模擬功能AD使用//P1^2,P1^3預留給串口2//10000
ADC_RES=0; //清零轉換結果寄存器高8位
ADC_RESL=0; //清零轉換結果寄存器低2位 //清除結果寄存器
ADC_CONTR = ADC_POWER;
AD_delay(2); //等待1ms,讓AD電源穩定
}
/*** 嘗試中斷方式,未果 ***
PM_LED=0;//傳感器的輸入信號
TMOD=0x11;//設置定時器0為工作方式1
TH0=(65536-40)/256;
TL0=(65536-40)%256;
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
EA=0; //開總中斷
void timer0() interrupt 1 {
//TH0=(65536-37)/256;
//TL0=(65536-37)%256;
AUXR &= 0x7F; //定時器時鐘12T模式
TL0 = 0xDB; //設置定時初值
TH0 = 0xDB; //設置定時重載值
N++;
if(N==7)
dustResult[i] = GetADCResult(ADC_CH_5);
if(N==8)
PM_LED=1;
if(N==250)
{
PM_LED=0;
N=0;
}
}
*** 中斷方式 嘗試 End *****/
/****************
*Get ADC result
*****************/
U8 GetADCResult(U8 ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ch|ADC_START;
_nop_();//Must wait before inqurity
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));//Wait complete flag
ADC_CONTR&=~ADC_FLAG;//Close ADC
return ADC_RES;
}
/* **** Read PM2.5 value *****/
void Get_PM25()
{
U8 i;
for(i=0;i<10;i++)
{
//POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
/* 延時方式 嘗試 start */
PM_LED = 1; //打開PM傳感器LED
Delay280us();//0.28ms
dustResult[i] = GetADCResult(ADC_CH_5);
Delay40us();
PM_LED = 0;//關閉PM傳感器LED
Delay9680us();
/* 延時方式 嘗試 end */
/* 01/12/2017 - 嘗試用中斷方式,未果//
PM_LED = 0; //打開PM傳感器LED
//TMOD=0x11;//設置定時器0為工作方式1
//TH0=(65536-37)/256;
//TL0=(65536-37)%256;
//ET0=1;//開定時器0中斷
//TR0=1;//啟動定時器0
//EA=0; //開總中斷
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0xDB; //設置定時初值
TH0 = 0xDB; //設置定時重載值
TF0 = 0; //清除TF0標志
//ET0=1;//開定時器0中斷
TR0 = 1; //定時器0開始計時
//EA=0; //開總中斷
/中斷方式 嘗試 end */
}
result = Get_Average();
VAL = result * 5000 / 256;// 將上面的數字量轉換成電壓值-mV
dust_density = (int)(VAL * 0.17 - 100);//固體懸浮顆粒濃度計算 Y=0.17*X-0.1 // X 采樣電壓
}