一、系统方案
1、本设计采用51单片机作为主控器。
2、MQ5采集气体值送到液晶1602显示。
3、按键设置报警阀值,声光报警。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
void init_1602() //初始化
{
lcdwc(0x01);
lcdwc(0x38);
lcdwc(0x0c);
lcdwc(0x06);
}
2、液晶显示程序
void lcdwc(uchar lcd_cmd) //液晶命令
{
lcden=0;
lcdrs=0;
lcdrw=0;
datlcd=lcd_cmd;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcdwd(uchar lcd_data) //液晶数据
{
lcden=0;
lcdrs=1;
lcdrw=0;
datlcd=lcd_data;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcdxy(uchar hlcd,uchar addlcd,uchar dtlcd) //定位写数据
{
if (hlcd1)
{
lcdwc(0x80+addlcd);
lcdwd(dtlcd);
}
else
{
lcdwc(0xc0+addlcd);
lcdwd(dtlcd);
}
}
3、按键程序
void key()//按键扫描
{
if(key10)//手动开关灯
{
delay(10);//延时消除按键抖动
if(key10)// 再次判断
{
while(!key1);// 等待按键释放
led=!led;
}
}
if(key20)//报警值加1
{
delay(10);
if(key20)
{
while(!key2);
MAX=MAX+1;
if(MAX>100)
MAX=0;
}
}
if(key30)//报警值减1
{
delay(10);
if(key30)
{
while(!key3);
if(MAX>=1)
MAX–;
}
}
if(key40)//取消报警
{
delay(10);
if(key4==0)
{
while(!key4);
flag=1;
}
}
}
4、核心算法程序
//
// 获取指定通道的A/D转换结果
//
uchar Get_ADC0832()
{
uchar i;
uchar dat1=0;
uchar dat2=0;
ADC_CLK = 0; // 电平初始化
ADC_DAT = 1;
_nop_();
ADC_CS = 0;
WavePlus(); // 起始信号
ADC_DAT = 1;
WavePlus(); // 通道选择的第一位
ADC_DAT = 0;
WavePlus(); // 通道选择的第二位
ADC_DAT = 1;
for(i=0;i<8;i++) // 第一次读取
{
dat1<<=1;
WavePlus();
if(ADC_DAT)
dat1=dat1|0x01;
else
dat1=dat1|0x00;
}
for(i=0;i<8;i++) // 第二次读取
{
dat2>>= 1;
if(ADC_DAT)
dat2=dat2|0x80;
else
dat2=dat2|0x00;
WavePlus();
}
_nop_(); // 结束此次传输
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS = 1;
if(dat1==dat2) // 返回采集结果
return dat1;
else
return 0;
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。