• 基于51单片机的二氧化碳(CO2)气体浓度监测报警系统


    基于51单片机的二氧化碳(CO2)气体浓度监测报警系统( proteus仿真+程序+演示视频)

    仿真图proteus 8.9

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:C0073

    主要功能:

    结合实际情况,基于51单片机设计一个二氧化碳(CO2)监测报警系。该系统应满足的功能要求为:

    二氧化碳传感器,运行状态LED显示、独立键盘、蜂鸣器报警。

    演示视频:

    C0073 51单片机二氧化碳(CO2)气体浓度监测报警系统

    具体功能:

    ①二氧化碳传感器测得二氧化碳数据后经过单片机处理,由LCD1602实时显示,第一行显示测得的浓度值,第二行显示报警阈值;

    ②可通过按键设置二氧化碳报警阈值,开始之后预设值闪烁,按键+预设值+10,按键减按下预设值-10;

    ③测得的二氧化碳浓度在正常范围时,绿灯亮,超过报警阈值时,红灯亮,蜂鸣器响,开始声光报警。

    以下为本设计展示图:

    仿真(提供源文件)

    主图

    img

    开始仿真

    img

    开始仿真显示检测值C02为1260ppm,初始化报警值为1500ppm。

    img

    img

    按下调整按键后,系统暂停工作,报警值十位数闪烁,按下报警上限+按键,报警值+10,按下按下报警上限-按键,报警值-10。设置完成后,再按一下调整按键,确定调整的报警值,系统正常工作。

    img

    在仿真中,可以通过箭头调整CO2气体传感器数值,图示设置为2050ppm,超出了设置的报警值1480,超出上限开始报警,蜂鸣器持续短鸣,红灯闪烁。

    程序(提供源文件源码):

    img

    img

    AD转换子程序

    /****************************************************************************
    函数功能:AD转换子程序
    入口参数:CH
    出口参数:dat
    ****************************************************************************/
    unsigned char adc0832(unsigned char CH)
    {
    	unsigned char i,test,adval;
    	adval = 0x00;
    	test = 0x00;
    	Clk = 0;       //初始化
    	DATI = 1;
    	_nop_();
    	CS = 0;
    	_nop_();
    	Clk = 1;
    	_nop_();
    	
    	
    	if ( CH == 0x00 )      //通道选择
    	{
    		Clk = 0;
    		DATI = 1;      //通道0的第一位
    		_nop_();
    		Clk = 1;
    		_nop_();
    		Clk = 0;
    		DATI = 0;      //通道0的第二位
    		_nop_();
    		Clk = 1;
    		_nop_();
    	} 
    	else
    	{
    		Clk = 0;
    		DATI = 1;      //通道1的第一位
    		_nop_();
    		Clk = 1;
    		_nop_();
    		Clk = 0;
    		DATI = 1;      //通道1的第二位
    		_nop_();
    		Clk = 1;
    		_nop_();
    	}
    	
    	Clk = 0;
    	DATI = 1;
    	for( i = 0;i < 8;i++ )      //读取前8位的值
    	{
    		_nop_();
    		adval <<= 1;
    		Clk = 1;
    		_nop_();
    		Clk = 0;
    		if (DATO)
    		adval |= 0x01;
    		else
    		adval |= 0x00;
    	}
    	for (i = 0; i < 8; i++)      //读取后8位的值
    	{
    		test >>= 1;
    		if (DATO)
    		test |= 0x80;
    		else 
    		test |= 0x00;
    		_nop_();
    		Clk = 1;
    		_nop_();
    		Clk = 0;
    	}
    	if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
    	dat = test;
    	nop_();
    	CS = 1;        //释放ADC0832
    	DATO = 1;
    	Clk = 1;
    	return dat;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    获取的值需要进行校准

    void AlcoholCalibration(void)     //CO2浓度初始化校准函数
    {
    	sum = 0;
    	for(m=0;m<50;m++)			//读50次AD值
    	{
    		sum = adc0832(0)+sum;		//读到的AD值,将读到的数据累加到sum
    	}
    	temp=sum/50;				//跳出上面的for循环后,将累加的总数除以50得到平均值temp
    	K_ZERO = 500 * temp / 256;        //8位ADC,首先得到电压值,单位10毫伏
    	Display_1602(0,WARNING);	 //显示AD数值和报警值
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    主函数

    void main()				//主函数
    {
    	Init1602();						 //初始化液晶函数
    	init();							 //初始化定时器
    	while(1)						 //进入循环
    	{
    		for(m=0;m<50;m++)			//读50次AD值
    		sum = adc0832(0)+sum;		//读到的AD值,将读到的数据累加到sum
    		temp=sum/50;				//跳出上面的for循环后,将累加的总数除以50得到平均值temp
    		if (temp > K_ZERO) 
    				temp = temp - K_ZERO;              //首先减去零点漂移,一般是130mV
    		else
    				temp= 0; 
    		sum=0; 						//平均值计算完成后,将总数清零
    		if(set==0)					 //set为0,说明现在不是设置状态
    		Display_1602(temp,WARNING);	 //显示AD数值和报警值
    		if(temp<WARNING&&set==0)	 //AD数值小于报警值
    		{
    			flag=0;					 //关闭报警
    		}
    		else if(temp>WARNING&&set==0)//AD值大于报警值
    		{
    			flag=1;					 //打开报警
    		}
    		Key();						 //调用按键函数
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    资料清单(提供资料清单所有文件):

    资料下载链接
    搜索设计编号:C0073
    img

  • 相关阅读:
    2024年,Rust开发语言,现在怎么样了?
    Linux编译器——gcc/g++的使用
    Elasticsearch实战(二十一)---ES相关度分数评分优化及FunctionScore 自定义相关度分数算法
    Java“白皮书”的关键术语
    使用UiPath和AA构建的解决方案 5. 使用UiPath ReFramework处理采购订单
    Linux常用命令总结
    大数据时代,数据治理
    深入理解ThreadLocal
    torch中tensor的相关操作
    项目实战:修改水果库存系统特定库存记录
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/127916560