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 采样电压
}