烟雾报警 发光二极管 程序

我的想法是 通过51单片机,实现烟雾报警功能。主要器件有:MQ-2烟雾传感器、ADC0832模块、发光二极管等!
目前遇到的问题是:我希望通过一位发光二极管来表示ADC0832转换出来的数据。
我设想的解决办法是:adc转换模块照常工作,照常将烟雾传感器的电压进行转换,在输出的时候,进行一下比较。可以与一个固定值进行比较(这个可以是报警的下限电压!!)通过比较数值的大小,从而输出0或者1。这不就是正好可以外接一个发光二极管和蜂鸣器弄成声光报警器吗?(这是我不成熟的想法 !!)
程序:说干就干,我根据adc模块的工作原理,编写了程序。后面也加入了一段if语句,用于比较。
结果:我在程序里调节固定值,led能亮能灭。但是我调节那个滑动变阻器(代替mq-2)的阻值大小 ,led没有变化。
下面是我的程序,请大家帮帮忙,指点指点。

#include<reg51.h>
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit LED=P1^3;
void ADC0832_Init()
{
    CS=1;
    CLK=0;
}
unsigned char ADC0832_Read()
    {
        unsigned char i,dat=0;
        CS=0;
        CLK=0;
        DIO=1;
        CLK=1;
        CLK=0;
        for(i=0;i<8;i++)
        {
            CLK=1;
            dat<<=1;
            dat|=DIO;
            CLK=0;
        }
        CS=1;
        return dat;
    }
void main()
    {
        unsigned char smokedat;
        unsigned int threshold=160;
        ADC0832_Init();
        while(1)
            {
        smokedat=ADC0832_Read();
        if(smokedat>threshold)
            {
                LED=1;
            }
            else
                {
                    LED=0;
                }
            }
    }
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/871918425096172.png "#left")


这题我不会,但是我觉得给你的代码加上注释会更容易得到解答

读到的AD结果有变化吗?感觉是读取AD结果有问题

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

根据您提供的程序和描述,我注意到几个问题可能导致您的LED没有变化:

  • 1.您的ADC0832_Init()函数似乎没有正确初始化ADC0832模块。请确保您正确设置了CS、CLK和DIO引脚,并将其配置为适当的的状态。
  • 2.在ADC0832_Read()函数中,您将DIO引脚设置为1,但根据ADC0832的时序图,DIO引脚在读取转换结果时应该被设置为0。
  • 3.在main()函数中,您将threshold变量设置为160,但根据您的描述,您希望将其设置为烟雾报警的下限电压。请确保将该值设置为适当的的目标值。
  • 4.在if语句中,您只改变了LED的状态,但没有进行任何输出操作。您需要添加代码来控制声光报警器或进行其他操作。

我建议您检查以上问题,并根据您的需求进行相应的更改和调整。如果您需要更详细的的信息或帮助,请提供更多细节或代码的部分,我将尽力为您提供帮助。

我修改了一下adc的代码,但是现在p0定义有问题 求解决!

#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define led p0
 
//ADC0832
sbit cs = P1^0;//片选使能,低电平有效
sbit clk = P1^1;//芯片时钟输入
sbit dio = P1^2;//数据输入DI与输出DO
 
//延时2us
void Delay_2us(void)
{
    _nop_();
    _nop_();
}

函数简介:获取ADC0832数据
函数名称:ADC_read_data(bit channel)
参数说明:ch为入口参数,ch=0选择通道0,ch=1选择通道1
函数返回:返回读取到的二进制ADC数据,格式为unsigned char
          当返回一直0时,转换数据有误
******************************************/
uchar ADC_read_data(bit channel)
{
    uchar i,dat0=0,dat1=0;
  //------第1次下降沿之前di置高,启动信号---------
 
    cs=0;            //片选信号置低,启动AD转换芯片
    clk=0;            //时钟置低平
    
    dio=1;          //开始信号为高电平
    Delay_2us();
    clk=1;            //产生一个正脉冲,在时钟上升沿,输入开始信号(DI=1)
    Delay_2us();
      clk=0;            //1个时钟下降沿
    dio=1;
    Delay_2us();
    
    clk=1;            //2个下降沿输入DI=1,表示双通道单极性输入
    Delay_2us();     
  //------在第2个下降沿,模拟信号输入模式选择(1:单模信号,0:双模差分信号)---------        
    clk=0;    
    dio=channel;         //3个下降沿,设置DI,选择通道;
    Delay_2us();
    clk=1;
    Delay_2us();
 
   //------在第3个下降沿,模拟信号输入通道选择(1:通道CH1,0:通道CH0)------------    
    
    clk=0;
    dio=1;          //第四个下降沿之前,DI置高,准备接收数 
    Delay_2us();    
    for(i=0;i<8;i++)                 //4~118个下降沿读数据(MSB->LSB)
    {
        clk=1;
        Delay_2us();
        clk=0;
        Delay_2us();
        dat0=dat0<<1|dio;
    }
    for(i=0;i<8;i++)                 //11~188个下降沿读数据(LSB->MSB)
    {
        dat1=dat1|((uchar)(dio)<<i);
        clk=1;
        Delay_2us();
        clk=0;
        Delay_2us();
    } 
    cs=1;                  
    return (dat0==dat1)?dat0:0;        //判断dat0与dat1是否相等
}
 
void main()
{
    uchar adc = 0;
    uint voltage = 0;
        led = 0;
    while(1)
    {
        adc = ADC_read_data(0);//读取adc值
        voltage = 160;//固定值
        if(adc>voltage)
                {
                   led = 1;
                   delay(200);
                 }
                 else
                 {
                  led = 0;
                  delay(200);
                  }
         }
}