MSP430F5529单片机,万年历,闹钟,数字时钟,温湿度dht11,蜂鸣器音乐

news2024/11/25 20:40:44

文章目录

  • 功能
  • 硬件连接
  • 实物
  • 程序

功能

  • 功能
  • 1 万年历显示
  • 2 按键修改时间
  • 3 按键修改闹钟
  • 4 闹钟到达 蜂鸣器鸣叫10秒自动关闭 闹钟是音乐
  • 5 温湿度显示
  • 6 温度到达28度以上蜂鸣器鸣叫

采用单片机内部的RTC模块走时。
按键1 切换选择年月日时分秒,靠按键1退出时间不会保存
按键2 保存设置的万年历时间并退出
按键3 加1
按键4 减1
按键5 切换选择闹钟的时分秒

矩阵键盘的16个按键只用了5个。

温湿度依靠DHT11传感器。

闹钟到达后是鸣叫天空之城,最长10秒钟后自动关闭。

硬件连接

  • msp430f5529

  • 矩阵键盘

  • oled 4针

  • 蜂鸣器 无源 低电平触发

  • dht11温湿度传感器

  • OLED SCL–P3.0 SDA–P3.1 VCC–3.3V GND–GND

  • beep DAT–P2.4 VCC–3.3V GND–GND 无源 低电平触发

  • DHT11 DAT–P4.1 VCC–3.3 GND–GND

矩阵键盘

  • 列0 P8.2
  • 列1 P3.7
  • 列2 P4.0
  • 列3 P4.3
  • 行0 P1.2
  • 行1 P1.3
  • 行2 P1.4
  • 行3 P1.5
  • 行作为上拉输入 列作为输出

实物

在这里插入图片描述
在这里插入图片描述

程序

全部程序:https://github.com/xddun/blog_code_search

部分程序如下

主程序:

这段程序是一个基于MSP430F5529微控制器的嵌入式系统应用程序。它使用了一些外部设备库(oled、delay、keyboard、rtc、dht11、beep_music)来实现以下功能:

万年历显示:在OLED屏幕上显示日期和时间。
按键修改时间:通过矩阵键盘输入,可以修改系统的当前时间。
按键修改闹钟:通过矩阵键盘输入,可以修改系统的闹钟时间。
闹钟到达:当系统的当前时间和闹钟时间匹配时,触发蜂鸣器鸣叫10秒钟,并自动关闭。闹钟的声音由音乐驱动。
温湿度显示:通过DHT11温湿度传感器获取环境的温度和湿度数据,并在OLED屏幕上显示。
温度到达28度以上蜂鸣器鸣叫:当温度超过28度时,触发蜂鸣器鸣叫。
整个程序的主要逻辑在main()函数中,初始化各个外部设备并进入一个无限循环。循环中不断读取按键、更新时间、读取温湿度数据,并根据条件触发蜂鸣器的开关和音乐播放。此外,还有一个定时器中断函数Timer_A(),用于控制蜂鸣器音乐的播放。

整个程序的功能是实现一个具有时间显示、闹钟设置、温湿度检测和报警的系统。



#include <msp430.h>
#include "oled.h"
#include "delay.h"
#include "keyboard.h"
#include "rtc.h"
#include "oled_disp.h"
#include "do_key.h"
#include "dht11.h"
#include "beep_music.h"


int main( void )
{
    WDTCTL = WDTPW + WDTHOLD;       /* Stop WDT */
    init_clock_4mhz();
    OLED_Init();                    /* OLED初始化 */
    KEY_Init();
    SetupRTC();
    P1DIR   |= BIT0;
    P4DIR   |= BIT7;

    /* 温度湿度 */
    OLED_ShowCHinese( 16 * 0, 0, 0 );
    OLED_ShowCHinese( 16 * 1, 0, 1 );
    OLED_ShowCHinese( 16 * 4, 0, 2 );
    OLED_ShowCHinese( 16 * 5, 0, 3 );
    /* 闹钟 */
    OLED_ShowCHinese( 16 * 0, 6, 4 );
    OLED_ShowCHinese( 16 * 1, 6, 5 );


    rtc_time_alarm.shi  = 23;
    rtc_time_alarm.fen  = 12;
    rtc_time_alarm.miao = 15;

    _EINT();
    while ( 1 )
    {
        delay_ms( 5 );
        t++;
        if ( t > 50 )
        {
            t   = 0;
            P4OUT   ^= BIT7;
        }
        key = read_key_2( 0 );
        if ( key )
        {
            user_pro_key( key );
            disp_rtc();
            oled_cnt        = 0;
            oled_disp[oled_cnt++]   = key / 10 + '0';
            oled_disp[oled_cnt++]   = key % 10 + '0';
            oled_disp[oled_cnt++]   = 0;
            OLED_ShowString( 16*6, 2, oled_disp, 0 );
        }
        /* 显示时间 */
        if ( setting == 0 )
        {
            if ( sec != rtc_time.miao )
            {
                sec = rtc_time.miao;
                disp_rtc();
                /* 闹钟比对 */
                if ( beep_open_state == 1 )
                {
                    music_open_rtc_cnt++;
                }
                if ( (rtc_time_alarm.shi == rtc_time.shi)
                     && (rtc_time_alarm.fen == rtc_time.fen)
                     && (rtc_time_alarm.miao == rtc_time.miao) )
                {
                    beep_open_state     = 1; /* 0关闭蜂鸣器  1蜂鸣器音乐模式  2蜂鸣器pwm鸣叫模式 */
                    music_u         = 0;
                    new_music       = 0;
                    delay_music     = 0;
                    music_open_rtc_cnt  = 0;
                }
            }
        }

        /* 读取温湿度 */
        dht11_read_cnt++;
        if ( dht11_read_cnt > 400 ) /* 约2秒更新一次温湿度 */
        {
            dht11_read_cnt = 0;
            /* 如果读取到了 并且校验成功 */
            if ( receive_init() == 1 )
            {
                dht11_temp  = temph;
                dht11_humi  = humdh;
                if ( temph > 27 )
                {
                    P1OUT |= BIT0;                  /* 点亮 */
                    if ( beep_open_state == 0 )
                    {
                        beep_open_state = 2;    /* 0关闭蜂鸣器  1蜂鸣器音乐模式  2蜂鸣器pwm鸣叫模式 */
                    }
                }else  {
                    P1OUT &= ~BIT0;                 /* 熄灭 */
                    if ( beep_open_state == 2 )
                    {
                        beep_open_state = 0;
                    }
                }
                disp_rtc();
            }
        }

        /* 蜂鸣器控制 */
        if ( beep_open_state_previous != beep_open_state )
        {
            beep_open_state_previous = beep_open_state;
            if ( beep_open_state == 0 )             /* 0关闭蜂鸣器  1蜂鸣器音乐模式  2蜂鸣器pwm鸣叫模式 */
            {
                close_beep();
            }else if ( beep_open_state == 2 )       /* 0关闭蜂鸣器  1蜂鸣器音乐模式  2蜂鸣器pwm鸣叫模式 */
            {
                open_beep();
            }else if ( beep_open_state == 1 )       /* 0关闭蜂鸣器  1蜂鸣器音乐模式  2蜂鸣器pwm鸣叫模式 */
            {
                open_beep_music();
            }
        }
    }
}


/* Timer A0 interrupt service routine */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A( void )
{
    /* 100ms中断 */
    if ( beep_open_state == 1 )
    {
        if ( music_open_rtc_cnt < 11 )                                          /* 音乐响10秒 */
        {
            if ( (delay_music < music0_JP[music_u]) && (new_music == 0) )   /* 计时没结束 且第一次赋值 */
            {
                if ( music0[music_u] != 0xff )                          /* 只要不是最后一个音符 */
                {
                    set_pwm_freq( music0[music_u] );                /* 设置pwm频率 */
                }else  {
                    new_music       = 0;
                    delay_music     = 0;
                    music_open_rtc_cnt  = 0;
                    beep_open_state     = 0;
                    close_beep();
                }
                new_music = 1;
            }else if ( delay_music >= music0_JP[music_u] )  /* 计时结束 */
            {
                music_u     += 1;                   /*下一个音符 fgvb5 */
                new_music   = 0;                    /* 重新计时 */
                delay_music = 0;                    /* 重新计时 */
            }
            delay_music++;
        }else  {
            new_music       = 0;
            delay_music     = 0;
            music_open_rtc_cnt  = 0;
            beep_open_state     = 0;
            close_beep();
        }
    }
}


#pragma vector=RTC_VECTOR

__interrupt void RTC_ISR( void )
{
    switch ( __even_in_range( RTCIV, RTC_RT1PSIFG ) )
    {
    case RTC_NONE:
        break;
    case RTC_RTCRDYIFG:
    {
        if ( setting == 0 )
        {
            /* 读取时间 */
            rtc_time.nian   = RTCYEAR;
            rtc_time.yue    = RTCMON;
            rtc_time.ri = RTCDAY;
            rtc_time.shi    = RTCHOUR;
            rtc_time.fen    = RTCMIN;
            rtc_time.miao   = RTCSEC;
            rtc_time.zhou   = RTCDOW;
        }
        /* 闪烁灯 */
        P1OUT ^= BIT0;
    }
    break;
    case RTC_RTCTEVIFG:
        break;
    case RTC_RTCAIFG:
        break;
    case RTC_RT0PSIFG:
        break;  /* 分频器 0 */
    case RTC_RT1PSIFG:
        break;  /* 分频器 1 */
    default:
        break;
    }
    __no_operation();
}



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Openlayers实战:加载google地图

google地图在业界一直是标杆的存在, 其zoomlevel超级大,可看到非常精细的程度。 Openlayers中如何加载谷歌地图呢?同样是XYZ的挂载方式,根据参数的不同,可以显示不同状态的谷歌地图,如果矢量地图,瓦片遥感图片等。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuan…

36. 合并两个排序的链表

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 链接&#xff1a; 链接 题目&#xff1a; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的结点仍然是按照递增排序的。 数据范围 链表长度 [0,500][0,500]。 样例 输入&#x…

第五章 爬虫小程序-实例43-获取网页内容

1、准备工作 用Python编写的访问网页的程序中&#xff0c;有很多是调用 requests 库模块中的函数来进行操作&#xff0c;这个库模块把网页请求和操作等多项功能进行了高度封装&#xff0c;使其可以轻而易举完成浏览器的许多操作。 requests库是第三方模块&#xff0c;需要进行…

【算法与数据结构】239、LeetCode滑动窗口最大值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题我们如果用暴力破解法需要 O ( n ∗ k ) O(n*k) O(n∗k)的复杂度。思索再三&#xff0c;我们需要…

electron-vue 台称串口对接 SerialPort

大致流程 1.首先找一个串口工具&#xff08;sscom5.12.1&#xff09;试试读取串口是否成功连上&#xff1b; 2.创建electron-vue的项目&#xff1b; 3.安装依赖&#xff0c;调整版本&#xff0c;启动项目&#xff1b;&#xff08;在electron中使用串口_electron 串口_Jack_K…

Eclipse控制台输出log4j日志乱码解决

1. 出现乱码可能是编码格式对应不起来&#xff0c;主要是Eclipse控制台编码和log4j编码的匹配 log4j.properties 主要是查看这两个地方编码一致不一致&#xff0c;如果不一致则手动更改成一致编码&#xff0c;GBK或UTF-8

Ribbon 负载均衡服务调用

文章目录 1 SpringCloud Load Balance2 总结:3 Ribbon工作流程&#xff1a;4 自定义Ribbon 负载均衡算法&#xff1a;4.1 iRule接口&#xff1a;4.2 Ribbon自带的负载均衡算法&#xff1a;4.3 负载均衡算法替代&#xff1a;4.3.1、在非启动类包及子包下创建配置类4.3.2、定义4.…

LayUI动态选项卡的使用

目录 一、Tab选项卡 1.什么是Tab选项卡 2.Tab选项卡的作用 二、Tab选项卡的详细使用步骤 1.参考官网&#xff0c;选择自己喜欢的选项卡 ​ 2.将静态选项卡转换成动态选项卡 3.将选项卡的标签名变成实际菜单名 4.重名选项卡不能二次打开 5.切换到指定选项卡 6.iframe的…

Python示例解释观察者模式

观察者模式是一种常用的设计模式&#xff0c;用于在对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。下面通过一个简单的例子来解释观察者模式的概念。 假设我们有一个名为"主题"&a…

神经网络万能近似定理探索与实验

神经网络万能近似定理探索与实验 今天&#xff0c;我们来做神经网络万能近似定理的探索与实验。关于万能近似定理呢&#xff0c;就是说&#xff0c;对这个神经元的输出进行非线性激活函数处理&#xff0c;单层的神经网络就可以拟合任何一个函数。 下面先看我们搭建的第一个网…

docker部署达梦数据库

一、下载安装包 安装步骤&#xff1a; 先跟着网页走 注&#xff1a;第二步导入安装包&#xff0c;如果是在自己电脑上&#xff0c;就不一定要拷贝到/opt目录下&#xff0c;在安装包所在目录地址栏输入cmd&#xff0c;进入终端进行操作即可 操作到正常打印日志&#xff08;如…

java项目之房屋租赁系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的房屋租赁系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

尚硅谷Docker实战教程-笔记14【高级篇,Docker容器监控之CAdvisor+InfluxDB+Granfana、Docker终章总结】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…

centos7.9 连续登录失败处理

如果有人恶意破解你的服务器&#xff0c;下面的操作可以起到一定的作用&#xff0c;连续登录失败锁定账户一段时间&#xff0c;让攻击者的成本增加&#xff0c;从而降低服务器被恶意破解的风险。 参考博客 https://blog.csdn.net/hjxloveqsx/article/details/129004832 https…

MyBatis 中如何使用分页

MyBatis 中如何使用分页 在实际的项目开发中&#xff0c;我们经常需要对数据库中的数据进行分页查询&#xff0c;以提高数据查询的效率和用户体验。MyBatis 是一种流行的 Java 持久层框架&#xff0c;它提供了多种分页查询的方式&#xff0c;本文将介绍其中常用的两种方式&…

MySQL数据库详解

文章目录 引言1. SQL1.1 SQL通用语法1.2 SQL分类1.3 DDL1.3.1 数据库操作1.3.2 表操作1.3.2.1 表操作-查询创建1.3.2.2 表操作-数据类型1.3.2.3 表操作-修改1.3.2.3 表操作-删除 1.4 DML1.4.1 添加数据1.4.2 修改数据1.4.3 删除数据 1.5 DQL1.5.1 基本语法1.5.2 基础查询1.5.3 …

车载以太网之SOME/IP-SD专题篇

前言 首先,请问大家几个小小问题,你清楚: 你知道什么是SOME/IP SD吗?SOME/IP-SD报文是如何发送与接收的呢?SOME/IP-SD 存在哪几种Entry Type呢?SOME/IP-SD内部状态机转换又是如何?今天,我们就来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲: 目录…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…

代码随想录day1 | 704.二分查找 27.移除元素

一、二分 1、二分易错点 1、循环变量 while(left < right) 还是while(left <right)2、判断条件 if(num[mid] > tar) mid right 还是 mid right -12、循环不变量 [left, right] [left, right) (left, right]3、左闭右闭写法 当时左闭右闭时&#xff0c;while循…