18.1  简单分析需求

1、检测酒精浓度显示在数码管上面

2、可以通过按键设置阈值

3、超过阈值开启报警

18.2  从硬件分析

1、首先需要监测酒精浓度,则需要使用ADC监测酒精浓度。

我们需要采用这个adc芯片以及U2,U2这里是酒精浓度传感器(MQ-3) ,通过监测CH0端口的数据就可以监测酒精浓度值,我们也可以利用单片机的处理能力将酒精浓度值处理一下,即可完成我们需要的数据。

2、监测出浓度之后我们需要显示屏显示出来,因为本次的设计显示数据不多,我们可以采用数码管显示

3、通过独立按键设置阈值,所以需要独立按键来进行人机交互

4、超过阈值开启报警,这里就需要采用我们的蜂鸣器模块,这里我们用的是PNP控制蜂鸣器。

18.3  软件的撰写

这里只放出main.c的程序,因为前面的驱动程序我们都已经完成了讲解。

/**********************************
包含头文件
**********************************/
#include "main.h"
#include "adc.h"
#include "smg.h"
#include "key.h"
/**********************************
变量定义
**********************************/
uint time_num=0;
uchar key_num=0;
uchar MQ_value=0;
uchar flag_mode=0;
uchar MQ_yu=100;
/**********************************
函数
**********************************/
void usleep(unsigned int us);
void msleep(unsigned int ms);
void Key_process(void);
void Monitor(void);
void Display(void);
void Logic(void);
/**********************************
函数名: main
传递参数:无
返回参数:无
函数作用:主函数
**********************************/
void main(void)
{
  while(1) 
  {
    Key_process();
    Monitor();
    Display();
    Logic();
    msleep(1);
    //延迟1ms,利用延迟来达到计时控制,不是很准确
    time_num++;
		if(time_num>5000)
      time_num=0;
  }
}
/**********************************
函数名: usleep
传递参数: us
返回参数: 无
函数作用: 延时10us函数
**********************************/
void usleep(unsigned int us)
{
  while(us--);	
}
/**********************************
函数名: msleep
传递参数: ms
返回参数: 无
函数作用: 延时1ms函数
**********************************/
void msleep(unsigned int ms)
{
  unsigned int m,n;
	for(m=ms;m>0;m--)
	for(n=110;n>0;n--);
}
/**********************************
函数名: Key_process
传递参数: 无
返回参数: 无
函数作用: 按键处理函数
**********************************/
void Key_process(void)
{
  //获取键值
  key_num=Chiclet_Keyboard_Scan();
  //判断键值,然后赋予功能
  if(key_num==1)
  {
    //三目运算符,相当于if else
    flag_mode==0?flag_mode=1:(flag_mode=0);
  }
  else if(key_num==2)
  {
    if(flag_mode==1)
      MQ_yu++;
  }
  else if(key_num==3)
  {
    if(flag_mode==1)
      MQ_yu--;
  }
}
/**********************************
函数名: Monitor
传递参数: 无
返回参数: 无
函数作用: 监测函数
**********************************/
void Monitor(void)
{
  //每隔500毫秒监测一次,只在模式0下监测
  if(time_num % 500==0 && flag_mode==0)
  {
    MQ_value = adc_read(0);
  }
}
/**********************************
函数名: Display
传递参数: 无
返回参数: 无
函数作用: 显示函数
**********************************/
void Display(void)
{
  //模式0下,显示监测的数值
  if(flag_mode==0)
  {
    LED=1;
    ThereDisplay(MQ_value);
  }
  //模式1显示阈值
  else if(flag_mode==1)
  {
    LED=0;
    ThereDisplay(MQ_yu);
  }
}
/**********************************
函数名: Logic
传递参数: 无
返回参数: 无
函数作用: 逻辑处理函数
**********************************/
void Logic(void)
{
  //判断阈值大小
  if(MQ_value>MQ_yu)
  {
    BEEP=0;
  }
  else
  {
    BEEP=1;
  }
}

发表回复

后才能评论