while(1)
{
AD = Get_AD_Result();
// vt = 0.4*AD/255*10;
vt = (500.0/256.0)*AD;//得到输出电压
x=(vt-3)/2.778;//酒精浓度
y=vt/10;
OLED_ShowNum(40,0,x,3,16);//显示整数
OLED_ShowNum(72,0,y,1,16);//显示小数
OLED_ShowString(64,0,".",16);//显示小数点
OLED_ShowNum(40,2,boundaries,3,16);//显示设定值
if(x>=boundaries)//烟雾浓度大于等于设定,蜂鸣器响
{
Beep=0;
}
else//烟雾浓度小于设定值,蜂鸣器不响,红灯不亮
{
Beep=1;
}
}
}
//------------------------------
// 获取AD转换结果(0通道)
//------------------------------
uchar Get_AD_Result() //包含11个CLK下降沿
{
uchar i, dat;
CS = 1; //ADC0832未工作时,CS端为高电平,此时芯片禁用
_nop_; //对于延时很短的,要求在us级的,采用“_nop_”函数
CLK =1;
CS = 0;
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二个下降沿
DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三个下降沿,发送1,0选择通道cho
DIDO = 1; //释放总线
for(i = 0; i < 8; i++) //第4个下降沿到第11个下降沿
{
CLK = 0; //clk处于下降沿,每一个下降沿DO端输入下一个
_nop_; //对于延时很短的,要求在us级的,采用_nop_函数
if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
CLK = 1; _nop_; //clk处于上升沿
dat <<= 1; //数据左移
}
return (dat);
CS = 1; //ADC0832停止工作
}
程序如上 ,问什么采集的数值不变呢
|