功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前温度和甲烷浓度
2.超过甲烷浓度阈值,蜂鸣器报警
3.按键可更改甲烷浓度阈值上限和启动/暂停检测
4.0`20%浓度,绿色LED点亮
20%~阈值上限,黄色LED点亮,电机启动
超过阈值上限,红色LED点亮,电机启动,蜂鸣器报警
5.每隔2天,电机转动10分钟(为了方便演示,演示视频为间隔20秒)
6.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include "18b20.h"
#include "tlc0832.h"
#include "lcd1602.h"
#include "delay.h"sbit KEY_SUB = P3^6;
sbit KEY_ADD = P3^4;
sbit KEY_ALARM = P3^5;sbit BUZZER = P2^2;
sbit MOTOR = P3^7;sbit LED_RED = P1^5;
sbit LED_YELLOW = P1^4;
sbit LED_GREEN = P1^3;#define ON 0
#define OFF 1#define BUZZER_ON (BUZZER = 0)
#define BUZZER_OFF (BUZZER = 1)#define MOTOR_ON (MOTOR = 0)
#define MOTOR_OFF (MOTOR = 1)unsigned char dispFlag = 0; //更新显示标志
bit setFlag = 0; //设置参数标志
bit sendFlag = 0; //串口发送标志
bit alarmSwitch = 1; //报警开关
bit alarmFlag = 1; //报警标志
bit motorFlag = 0; //报警开启电机标志
bit motorFlag1 = 1; //定时开启电机标志
unsigned int second = 0;
unsigned char hour = 0;int tempBuf = 0;                   //读取温度值
float temperature;              //实际温度值
int temperatureMax = 50;              //温度阈值
bit readTempFlag = 0; //定义读温度标志int Conc = 0;
unsigned int ConcMax = 50;char dis0[18]; //定义显示区域临时存储数组void SendData(void);
void CheckKey(void);
void Timer0_Init(void); //定时器初始化
void UART_Init(void); //串口初始化
void UART_SendByte(unsigned char dat); //串口发送单字节数据
void UART_SendStr(unsigned char *s, unsigned char length); //发送定长度字符串void main(void)
{bit ack = 0;Timer0_Init();LCD_Init();   //初始化液晶DelayMs(200); //延时有助于稳定LCD_Clear();  //清屏LCD_DispStr(0, 0, "T:      C S:   %");LCD_DispOneChar(7, 0, 0xdf); //写入温度右上角点sprintf(dis0, "SS:%3d%%", ConcMax); //打印温度值LCD_DispStr(0, 1, dis0);             //显示第二行UART_Init(); //初始化串口while (1) //主循环{CheckKey();            //检测按键if (readTempFlag == 1) //读取温度标志{readTempFlag = 0;DS18B20_Start();ack  = DS18B20_GetTemp(&tempBuf);if (ack == 1){temperature = (float)tempBuf * 0.0625; //温度值转换}else {temperature = 0;}}if (dispFlag == 1){dispFlag = 0;sprintf(dis0, "%5.1f", temperature); //打印温度值LCD_DispStr(2, 0, dis0);             //显示第二行Conc = ReadADC(AIN0_GND);if (Conc <= 29){Conc = 29;}Conc = (100 * (Conc - 29)) / 227; //计算有害气体浓度百分比sprintf(dis0, "%3d", Conc); //打印温度值LCD_DispStr(12, 0, dis0);             //显示第二行if (alarmSwitch){if (Conc > ConcMax) //浓度超过最大设定则报警{BUZZER_ON;motorFlag = 1;LED_RED = ON;LED_YELLOW = OFF;LED_GREEN = OFF;alarmFlag = 1;}else if (Conc > 20 && Conc <= ConcMax) //浓度处于中间范围{BUZZER_OFF;motorFlag = 1;LED_RED = OFF;LED_YELLOW = ON;LED_GREEN = OFF;alarmFlag = 0;}else //浓度正常范围{BUZZER_OFF;motorFlag = 0;LED_RED = OFF;LED_YELLOW = OFF;LED_GREEN = ON;alarmFlag = 0;}}if (motorFlag == 1 || motorFlag1 == 1){MOTOR_ON;}else{MOTOR_OFF;}}if (sendFlag == 1){sendFlag = 0;SendData();}}
}/************************* 串口发送数据 *************************/
void SendData(void)
{sprintf(dis0, "T:%5.1f'C S:%3d%%\r\n", temperature, Conc); //串口发送UART_SendStr(dis0, 18); //发送数据DelayMs(100);if (alarmFlag == 1){UART_SendStr("Warning!!!\r\n", 12); //发送数据DelayMs(100);}
}void CheckKey(void)
{if (KEY_SUB == 0) //减键按下{DelayMs(200);if (KEY_SUB == 0) //减键按下{if (ConcMax > 20){ConcMax = ConcMax - 1;}sprintf(dis0, "SS:%3d%%", ConcMax);LCD_DispStr(0, 1, dis0);}}if (KEY_ADD == 0) //加键按下{DelayMs(200);if (KEY_ADD == 0) //加键按下{if (ConcMax < 99){ConcMax = ConcMax + 1;}sprintf(dis0, "SS:%3d%%", ConcMax);LCD_DispStr(0, 1, dis0);}}if (KEY_ALARM == 0) //取消报警按键{DelayMs(20);if (KEY_ALARM == 0) //取消报警按键{if (alarmSwitch){alarmSwitch = 0;BUZZER_OFF;LED_RED = OFF;LED_YELLOW = OFF;LED_GREEN = OFF;}else{alarmSwitch = 1;}}while (KEY_ALARM == 0);}
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;EA = 1;  //总中断打开ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开
}
/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{static unsigned char time20ms  = 0;TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;time20ms++;if (time20ms > 50){time20ms = 0;readTempFlag = 1; //读标志位置1sendFlag = 1;if (motorFlag1 == 0) //电机停止状态{if (second >= 20 - 1) //1小时{second = 0;hour++;if (hour >= 2 - 1) //48小时{hour = 0;motorFlag1 = 1; //电机启动标志}}else{second++;}}else{if (second >= 20 - 1) //10分钟{second = 0;motorFlag1 = 0;}else{second++;}}}if (time20ms % 10 == 0){dispFlag = 1;}
}/************************* 串口配置 *************************/
void UART_Init(void)
{SCON = 0x50;TH2 = 0xFF;TL2 = 0xFD;RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200RCAP2L = 0xFD;/*****************/TCLK = 1;RCLK = 1;C_T2 = 0;EXEN2 = 0;/*****************/TR2 = 1;ES   = 0; //关闭串口中断EA   = 1; //打开总中断}/************************* 串口发送字节 *************************/
void UART_SendByte(unsigned char dat) //串口发送单字节数据
{unsigned char time_out;time_out = 0;SBUF = dat;                        //将数据放入SBUF中while ((!TI) && (time_out < 100)) //检测是否发送出去{time_out++;DelayUs10x(2);}      //未发送出去 进行短暂延时TI = 0; //清除ti标志
}/************************* 串口发送字符串 *************************/
void UART_SendStr(unsigned char *s, unsigned char length)
{unsigned char num;num = 0x00;while (num < length) //发送长度对比{UART_SendByte(*s); //放松单字节数据s++;            //指针++num++;            //下一个++}
}

仿真演示视频:
https://www.bilibili.com/video/BV1514y1h7eT/

实物演示视频:
https://www.bilibili.com/video/BV1uN4y1A7B5/

基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB相关推荐

  1. 基于51单片机的三路超声测距仪设计wifi通信proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时循环显示3路超声波探测距离,同时WIFI串口上报 2.带有WiFi模块,可与手机实现数据交互,WiFi模块型号采用是常见 ...

  2. 基于51单片机的万年历(带温湿度)带闹钟功能proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶显示当前时间和温湿度 2.按键可切换页面,显示农历,显示闹钟设置 3.当时间到达设定闹钟时间时,蜂鸣器报警 原理图: PCB ...

  3. 基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示当前的设定温度/实际温度/水龙头状态和水流量 2.按键可开关水龙头,当温度低于设定温度时,启动加热控制继电器,给水加热, 当加热到(设 ...

  4. 基于51单片机的数字电容容值测量仪proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统支持15pF~450uF电容测量 2.按键可更改测量量程 3.除了采用LCD1602可以实时显示测量参数,同时具有LED可以显示各个档位 ...

  5. 基于51单片机NRF24L01的远程水压监控及控制proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统分为主机和从机. 2.从机负责设定压力阈值.屏幕显示及蜂鸣器报警. 3.从机负责检测当前的水压值,并通过对比设定压力阈值,控制水泵继电器 ...

  6. 基于51单片机的汽车超声波防撞声光报警系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时距离阈值/测试距离 2.低于距离阈值将声光报警 3.按键可更改距离阈值 原理图: PCB: 主程序: #include ...

  7. 基于51单片机PM2.5空气质量检测系统(源程序+仿真+原理图+PCB+论文)

    资料编号:208 功能介绍:(全套毕设资料齐全) 本电路是由51单片机为控制核心,另外主要通过5个模块的电路设计实现功能,他们分别是LCD显示模块.粉尘传感器.A/D转换.蜂鸣器电路.LED指示电路. ...

  8. 基于51单片机的贪吃蛇小游戏8X8点阵 proteus仿真原理图程序

    硬件设计 基于C51作为MCU 一块8X8点阵作为游戏的显示器 四个按键作为操控按键 仿真图: 程序设计 #include <at89x51.h> #include "18b20 ...

  9. 基于51单片机的MQ-5天然气监测报警系统设计

    基于51单片机的天然气监测报警系统设计 基于51单片机的天然气监测报警系统设计 视频 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7 ...

最新文章

  1. CSS中对字体进行设置
  2. ajax hapi上传文件,javascript – hapi.js Cors Pre-flight不返回Access-Control-Allow-Origin标头...
  3. 架构师之路 — API 经济 — 权限管理系统(分权分域设计)
  4. 论文公式编号右对齐_word技能之添加样式以及公式自动编号
  5. html的!DOCTYPE标签初窥
  6. ASP非模板生成静态页
  7. 前端防抖和节流合二为一
  8. 深度解析javascript中的浅复制和深复制
  9. 前后端分离实现excel批量导入导出功能
  10. DVWA-SQL Injection
  11. 强子对撞机下午3时半开始一次全轨道试验,如果产生黑洞,人类将在今日消失
  12. 站在巨人的肩膀上还是站在巨人的脚底下
  13. 虚拟化做快照需要停服务器么,如何创建VMware虚拟化快照和快照删除的方法
  14. Android 点击图片全屏预览 -——ZoomPreviewPicture默认预览使用
  15. GIS开发中常用几何算法原理图解
  16. Windows: Ctrl,Alt, Shift等快捷键的含义
  17. SEO——搜索引擎优化
  18. 二建《机电》案例 100 问
  19. pycharm安装-社区版
  20. SSC 扩频时钟技术(4):基于systemverilog语言实现ssc扩频时钟模型设计

热门文章

  1. 29个省市,364个门店,新飘柔营销背后,是一场80天的AR狂欢
  2. 【无标题】灵遁者相观天下,相学培训书籍
  3. Codeforces633C Spy Syndrome 2 (单词Trie)
  4. 不平衡分类之逻辑回归,基于python,SMOTE和RFE
  5. Java-异常处理(编译时异常、运行时异常及处理机制,自定义异常)
  6. fiilt1左耳无法同步_【FIIL T1 蓝牙耳机使用总结】功能|操作|闪连|防水|音质_摘要频道_什么值得买...
  7. android毗邻(Pilin)即时聊天应用源码
  8. 广数928te_广数928te使用教材
  9. 科目三考试项目分类评判标准
  10. C#Aspose操作Word Excel简版(后会研究补充更多功能)