找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 696|回复: 1
打印 上一主题 下一主题
收起左侧

MQ-2+ADC0832采集问题

[复制链接]
跳转到指定楼层
楼主
ID:419045 发表于 2024-3-19 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   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停止工作
}


程序如上 ,问什么采集的数值不变呢


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2024-3-19 16:23 | 只看该作者
输入一个合理范围的AD值,代替AD = Get_AD_Result();,验证显示部分有没有问题。能正常显示说明问题在AD转换,可以用下面函数替换试试。
uchar Get_AD_Result(bit ch)
{
        uchar i=0,value=0,value1=0;               
        CLK=0; //时钟置低平
        DO=1;  //开始信号为高电平
        CS=0;  //片选信号置低,启动AD转换芯片
        CLK=1; //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
        CLK=0; //时钟下降沿
        DO =1; //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
        CLK=1; //时钟上升沿,输入开始信号
        CLK=0; //时钟下降沿
        DO=ch; //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
        CLK=1; //时钟上升沿,输入开始信号
        CLK=0; //时钟下降沿
        DO =1; //数据线置高,准备接收数据
        for(i=0;i<8;i++) //从高位移入数据
        {
                CLK=1;
                CLK=0; //时钟下降沿,AD0832输出数据,高位(MSB)先
                value<<=1;
                if(DO)
                        value++;
        }
        for(i=0;i<8;i++) //从低位移入数据
        {                //接收校验数据
                value1>>=1;
                if(DO)
                        value1+=0x80;
                CLK=1;
                CLK=0;
        }
        CLK=1;        //数据线置高,释放总线,完成一次转换
        DO =1;
        CS =1;        
        if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
                return value;
        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表