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;
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容