我的想法是 通过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;
}
}
}

这题我不会,但是我觉得给你的代码加上注释会更容易得到解答
读到的AD结果有变化吗?感觉是读取AD结果有问题
不知道你这个问题是否已经解决, 如果还没有解决的话:根据您提供的程序和描述,我注意到几个问题可能导致您的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~11共8个下降沿读数据(MSB->LSB)
{
clk=1;
Delay_2us();
clk=0;
Delay_2us();
dat0=dat0<<1|dio;
}
for(i=0;i<8;i++) //第11~18共8个下降沿读数据(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);
}
}
}