【TB作品】msp430g2553单片机,家用可燃气体监测报警器,MQ-2,MQ5,PWM风扇

功能

//家用可燃气体监测报警器
//硬件:MQ-2 MQ5 OLED 蜂鸣器 按键 风扇
//1 OLED显示天然气、液化气浓度
//2 OLED显示可燃气体报警临界值
//3 2个按键用于修改可燃气体报警临界值
//4 MQ2检测到的浓度或者MQ7检测到的浓度 高于临界值时,蜂鸣器报警+风扇打开

//line:
//mq2 vcc-3.3v gnd-gnd data-p6.0
//mq5 vcc-3.3v gnd-gnd data-p6.1
//oled vcc-3.3v gnd-gnd scl-p2.0 sda-p2.2
//buzzer vcc-3.3v gnd-gnd data-p3.6
//fan vcc-3.3v gnd-gnd data-p3.5
//key1-p1.1 key2-p2.1 nocare

部分程序


int main(void)
{
    unsigned char dis[10];
    unsigned char time_cyc = 0;
    int set_value = 50;  //设置临界值
    int adc_prec[4];  //adc结果的百分比结果

    WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */

    /* 初始化显示 */
    OLED_Init(); /* OLED初始化 */
    OLED_ShowString(0, 0, "MQ-2:");
    OLED_ShowString(0, 2, "MQ-5:");
    OLED_ShowString(0, 4, " SET:");
    dis[0] = set_value % 100 / 10 + '0';
    dis[1] = set_value % 10 + '0';
    dis[2] = 37;                     //这表示百分号
    dis[3] = 0;
    OLED_ShowString(8 * 6, 4, dis);

    /*按键端口 */
    P1DIR &= ~BIT1;
    P1SEL &= ~BIT1;
    P1REN |= BIT1;
    P1OUT |= BIT1;

    P2DIR &= ~BIT1;
    P2SEL &= ~BIT1;
    P2REN |= BIT1;
    P2OUT |= BIT1;

    /* 风扇端口 P35 */
    P3DIR |= BIT5;

    /* 蜂鸣器端口P3.6  PWM 频率是(1MHZ/1000)   占空比是TBCCR6/TBCCR0 */
    P3SEL |= BIT6;                       // P3.5-7.6 option select



    _EINT();
    while (1)
    {

        //显示MQ2 MQ5
        delay_ms(10);
        time_cyc = (time_cyc + 1) % 10;
        if (time_cyc == 1) /* 10 个10ms执行一次 */
        {
            adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
            dis[0] = adc_prec[0] % 100 / 10 + '0';
            dis[1] = adc_prec[0] % 10 + '0';
            dis[2] = 37;                     //这表示百分号
            dis[3] = 0;
            OLED_ShowString(8 * 6, 0, dis);//第一排显示MQ2

            adc_prec[1] = (int) ((float) (ADCresults[1]) * 1.0 / 4096.0 * 100); //结果转化成百分比
            dis[0] = adc_prec[1] % 100 / 10 + '0';
            dis[1] = adc_prec[1] % 10 + '0';
            dis[2] = 37;                     //这表示百分号
            dis[3] = 0;
            OLED_ShowString(8 * 6, 2, dis);//第一排显示MQ5

        }

        //按键1检测处理
        if (!(P1IN & BIT1))
        {
            while (!(P1IN & BIT1))
                ;
            if (set_value < 95)
                set_value += 1;                     //临界值加1

            adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
            dis[0] = set_value % 100 / 10 + '0';
            dis[1] = set_value % 10 + '0';
            dis[2] = 37;                     //这表示百分号
            dis[3] = 0;
            OLED_ShowString(8 * 6, 4, dis);
        }

        //按键2检测处理
        if (!(P2IN & BIT1))
        {
            while (!(P2IN & BIT1))
                ;
            if (set_value > 5)
                set_value -= 1;                     //临界值-1

            adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
            dis[0] = set_value % 100 / 10 + '0';
            dis[1] = set_value % 10 + '0';
            dis[2] = 37;                     //这表示百分号
            dis[3] = 0;
            OLED_ShowString(8 * 6, 4, dis);
        }

        //临界值判断
        if (adc_prec[0] > set_value || adc_prec[1] > set_value) //MQ2>临界值  或者 MQ7>临界值
        {
            TBCCR6 = 500; //打开蜂鸣器
            P3OUT &= ~BIT5;//打开风扇
        }
        else
        {
            TBCCR6 = 0; //关闭打开蜂鸣器
            P3OUT |= BIT5;//关闭风扇
        }

    }
}

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{

    switch (__even_in_range(ADC12IV, 34))
    {
    case 12:                                  // Vector 12:  ADC12IFG3
        ADCresults[0] = ADC12MEM0;         // Move A0 results, IFG is cleared
        ADCresults[1] = ADC12MEM1;         // Move A1 results, IFG is cleared
        ADCresults[2] = ADC12MEM2;         // Move A2 results, IFG is cleared
        ADCresults[3] = ADC12MEM3;         // Move A3 results, IFG is cleared

    default:
        break;
    }
}




在这里插入图片描述

在这里插入图片描述

全部程序

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/680505.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI Agent(人工智能代理)是一种能够感知环境、进行决策和执行动作的智能实体

在大模型平台中&#xff0c;“Agent”通常指的是基于大型预训练模型构建的一种智能实体或软件系统&#xff0c;它能够执行一系列复杂的任务。这些任务可能包括但不限于理解和生成自然语言、决策制定、交互式对话、执行具体操作&#xff08;如在GUI环境中操作&#xff09;、数据…

Java 垃圾回收

文章目录 1 Java 垃圾回收1.1 JVM1.2 Java 对象生命周期 2 如何判断一个对象可被回收2.1 引用计数算法2.2 可达性分析算法 3 垃圾回收过程3.1 总体过程3.2 为什么要进行世代垃圾回收&#xff1f;3.3 分代垃圾回收过程 在 C 和 C 中&#xff0c;许多对象要求程序员声明他们后为其…

微电子加速迈向后摩尔时代!复旦大学梅永丰课题组集成 DNN 与纳米薄膜技术,精准分析入射光角度

「二维纳米膜自组装成三维微结构」被认为是制造下一代微电子器件的重要途径&#xff0c;对于即将到来的先进电子和光电子应用至关重要。然而&#xff0c;二维纳米膜最终几何形状的形成受到蚀刻轨迹、化学反应、高宽比以及其他复杂因素影响&#xff0c;导致自组装器件在制造过程…

【调试笔记-20240604-Linux-为 OpenWrt LuCI 界面添加多语言支持】

调试笔记-系列文章目录 调试笔记-20240604-Linux-为 OpenWrt LuCI 界面添加多语言支持 文章目录 调试笔记-系列文章目录调试笔记-20240604-Linux-为 OpenWrt LuCI 界面添加多语言支持 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、调试步骤预…

【机器学习】GBDT (Gradient Boosting Decision Tree) 深入解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 GBDT (Gradient Boosting Decision Tree) 深入解析引言一、GBDT基础理论1.1 梯度…

SpringBoot整合Skywalking

下载Java Agent 官网&#xff1a;https://skywalking.apache.org/downloads/ 提示&#xff1a;Agent最好到网上找一找之前的版本&#xff0c;新版本可能有bug&#xff0c;如果出现了并且网上也几乎没有这个版本的解决方法那么就切换之前的版本 本地启动时 -javaagent:d:\opt\…

全志D1s软件入门之Tina Linux编译教程

编译 Tina Linux 在搭建好编译环境并下载好源码后&#xff0c;即可对源码进行编译&#xff0c;编译打包好后&#xff0c;即可将打包好的固件烧写到设备中去。本文主要介绍编译和烧写的方法。 Tina Linux 编译 Tina Linux 的编译大致分为以下流程&#xff1a; (1) source bu…

php7.3安装phalcon扩展

php7安装3.4版本的phalcon扩展 适用于Centos6.x和Centos7.x系统&#xff0c;php使用7.1版本&#xff0c;wlnmp一键包已支持该扩展 phalcon扩展包地址&#xff1a;https://github.com/phalcon/cphalcon &#xff08;git clone 有可能连接不上&#xff09; 1、安装所需依赖&a…

《深入浅出存储引擎》不同数据库背后的数据存储方案

在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库中的数据依赖存储引擎进行管理&#xff0c;包括数据的存储、查询、更新和删除等。因此&#xff0c;在设计系统时&#xff0c;选择正确的数据库存储引擎方案变得尤为重要。这篇文章将以关系型、…

Intersection Observer API---交叉观察器 API

Intersection Observer API 交叉观察器 API&#xff08;Intersection Observer API&#xff09;提供了一种异步检测目标元素与祖先元素或顶级文档的视口相交情况变化的方法,例如&#xff0c;可以观察判断一个div&#xff08;有大小的&#xff09;盒子在是否出现在窗口&#xff…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

uniadmin引入iconfont报错

当在uniadmin中引入iconfont后&#xff0c;出现错误&#xff1a; [plugin:vite:css] [postcss] Cannot find module ‘E:/UniAdmin/uniAdmin/static/fonts/iconfont.woff2?t1673083050786’ from ‘E:\UniAdmin\uniAdmin\static\fonts\iconfont.css’ 这是需要更改为绝对路径…

线性代数|机器学习-P2 A的列向量空间

文章目录 1. Ax矩阵的形式2. ACR 矩阵分解2.1 rank1 矩阵分解2.2 rank2 矩阵分解2.3 ACMR,求M 3. Ax 向量 1. Ax矩阵的形式 假设我们有如下矩阵A&#xff1a; A x [ 2 1 3 3 1 4 5 7 12 ] [ x 1 x 2 x 3 ] \begin{equation} Ax\begin{bmatrix} 2&1&3\\\\ 3&1&am…

Java 还能不能继续搞了?

金三银四招聘季已落幕&#xff0c;虽说行情不是很乐观&#xff0c;但真正的强者从不抱怨。 在此期间&#xff0c;我收到众多小伙伴的宝贵反馈&#xff0c;整理出132道面试题&#xff0c;从基础到高级&#xff0c;有八股文&#xff0c;也有对某个知识点的深度解析。包括以下几部…

5 种技术,可用于系统中的大数据模型,而不会使系统崩塌

文章目录 一、说明二、第一种&#xff1a;批量大小三、第二种&#xff1a;主动学习四、第三种&#xff1a;增加代币数量五、第四种&#xff1a; 稀疏激活六、第五种&#xff1a;过滤器和更简单的模型后记 一、说明 以下是本文重要观点的摘要。阅读它以获取更多详细信息/获取原…

自动装车系统车辆定位-激光雷达解决方案

在自动装车系统中&#xff0c;激光雷达为车辆定位提供了一种高效且精确的解决方案。以下是关于这一解决方案的详细分析&#xff1a; 一、解决方案概述 激光雷达解决方案在自动装车系统中&#xff0c;通过发射激光束并接收目标反射回来的信号&#xff0c;来探测车辆的位置、状…

新手如何正确使用代理IP,一篇文章学会,包含实战案例

前言 一、代理IP1.1 什么是代理IP&#xff1f;1.2 代理ip分类1.3 代理IP的作用和优势 二、更换代理IP的方法2.1 重启路由器或光猫2.2 用拨号 vps 重拨更换动态IP代理。2.3 使用浏览器更换IP 三、IPIDEA代理的优势四、提取代理IP4.1 提取步骤4.2 浏览器使用代理IP 五、使用代理I…

【Redis数据库百万字详解】数据持久化

文章目录 一、持久化1.1、什么是持久化1.2、持久化方式1.3、RDB优缺点1.4、AOF优缺点 二、RDB持久化触发机制2.1、手动触发2.2、自动触发 三、RDB持久化配置3.1、配置文件3.2、配置查询/设置3.3、禁用持久化3.4、RDB文件恢复 四、RDB持久化案例4.1、手动持久化4.2、自动持久化案…

Hive3.1.2分区与排序(内置函数)

Hive3.1.2分区与排序&#xff08;内置函数&#xff09; 1、Hive分区(十分重要&#xff01;&#xff01;) 分区的目的&#xff1a;避免全表扫描&#xff0c;加快查询速度&#xff01; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成…

【二进制部署k8s-1.29.4】十三、metrics-server的安装部署

文章目录 简介 一.metrics-server的安装 简介 本章节主要讲解metrics-server的安装&#xff0c;metrics-server主要是用于采集k8s中节点和pod的内存和cpu指标&#xff0c;在观察几点和pod的实时资源使用情况还是比较有用的&#xff0c;如果需要记录历史信息&#xff0c;建议采用…