【TB作品】MSP430F5529 单片机,数字时钟设计与实现,整点时通过蜂鸣器播放音乐进行报时

基于单片机的数字时钟设计与实现

作品名称

基于MSP430单片机的OLED显示数字时钟

作品功能

本作品实现了一个具有时间显示和整点报时功能的数字时钟。通过OLED屏幕显示当前时间,用户可以通过按键设置时间,并在整点时通过蜂鸣器播放音乐进行报时。

作品的硬件材料

  1. MSP430 单片机
  2. OLED 显示屏
  3. 蜂鸣器
  4. 按键(4个)
  5. 电阻和电容若干
  6. 面包板和连接线

电子元器件连接

以下是各电子元器件与MSP430单片机的连接方式:

OLED 显示屏

  • VCC 接 3.3V
  • GND 接 GND
  • SCL 接 P2.0
  • SDA 接 P2.2

按键

  • KEY1 接 P1.2(共GND)
  • KEY2 接 P1.3(共GND)
  • KEY3 接 P1.4(共GND)
  • KEY4 接 P1.5(共GND)

蜂鸣器

  • VCC 接 3.3V
  • GND 接 GND
  • DAT 接 P4.3

部分程序功能简介

本程序主要包括初始化时钟、设置RTC、按键读取、显示更新和整点报时等功能。

初始化时钟

通过以下函数设置系统时钟为8MHz:

void initClock(void) {
    UCSCTL3 = SELREF_2; // 设置DCO FLL参考为REFO
    UCSCTL4 |= SELA_2;  // 设置ACLK为REFO
    UCSCTL0 = 0x0000;   // 设置最低可能的DCOx, MODx
    do {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);  // 清除XT2,XT1,DCO故障标志
        SFRIFG1 &= ~OFIFG;  // 清除故障标志
    } while (SFRIFG1 & OFIFG); // 检测振荡器故障标志
    __bis_SR_register(SCG0); // 禁止FLL控制环路
    UCSCTL1 = DCORSEL_5; // 设置DCO范围为16MHz操作
    UCSCTL2 |= 249; // 设置DCO倍增器为8MHz
    __bic_SR_register(SCG0); // 启用FLL控制环路
    __delay_cycles(250000); // 延时以稳定DCO
}

设置RTC

通过以下函数设置RTC(实时时钟)模块:

void SetupRTC(void) {
    RTCCTL01 = RTCHOLD + RTCMODE + RTCTEV_0; // 关闭RTC
    RTCYEAR = 2024; // 设置年份
    RTCMON = 5; // 设置月份
    RTCDAY = 13; // 设置日期
    RTCHOUR = 23; // 设置小时
    RTCMIN = 12; // 设置分钟
    RTCSEC = 12; // 设置秒数
    RTCDOW = 1; // 设置星期
    RTCCTL0 |= RTCRDYIE; // 使能RTC就绪中断
    RTCCTL01 &= ~RTCHOLD; // 打开RTC
}

按键读取

通过以下函数读取按键状态:

unsigned char read_key(void) {
    unsigned char key = 0;
    if ((P1IN & BIT2) == 0) {
        key = 1; // 按键1按下
    } else if ((P1IN & BIT3) == 0) {
        key = 2; // 按键2按下
    } else if ((P1IN & BIT4) == 0) {
        key = 3; // 按键3按下
    } else if ((P1IN & BIT5) == 0) {
        key = 4; // 按键4按下
    }
    return key;
}

显示更新

通过以下函数更新OLED显示内容:

void display_all(void) {
    memset(buf, 0, sizeof(buf));
    sprintf(buf, "%04d-%02d-%02d", nian, yue, ri); // 格式化日期
    OLED_ShowString(16, 2, buf, 0); // 显示日期
    memset(buf, 0, sizeof(buf));
    sprintf(buf, "%02d:%02d:%02d", shi, fen, miao); // 格式化时间
    OLED_ShowString(16, 4, buf, 0); // 显示时间
    // 高亮显示根据mode的值选择的部分
    if (mode == 1) {
        sprintf(buf, "%04d", nian);
        OLED_ShowString(16, 2, buf, 1);
    } else if (mode == 2) {
        sprintf(buf, "%02d", yue);
        OLED_ShowString(16 + 5 * 8, 2, buf, 1);
    } else if (mode == 3) {
        sprintf(buf, "%02d", ri);
        OLED_ShowString(16 + 8 * 8, 2, buf, 1);
    } else if (mode == 4) {
        sprintf(buf, "%02d", shi);
        OLED_ShowString(16, 4, buf, 1);
    } else if (mode == 5) {
        sprintf(buf, "%02d", fen);
        OLED_ShowString(16 + 3 * 8, 4, buf, 1);
    } else if (mode == 6) {
        sprintf(buf, "%02d", miao);
        OLED_ShowString(16 + 6 * 8, 4, buf, 1);
    }
}

整点报时

当达到整点时,通过蜂鸣器播放音乐:

if (integral_point == 1) { // 如果到达整点
    integral_point = 0;
    u = 0, t = 0;
    while (music0[u] != 0xff) { // 播放音乐
        TA0CCR0 = SYSCLK / music0[u] / 2;
        TA0CTL = TASSEL_2 + MC_1 + TACLR + ID_3;
        for (t = 0; t < music0_JP[u]; t++) {
            delay1();
        }
        u++;
    }
}

总结

通过本项目,熟悉了MSP430单片机的基础功能,如时钟设置、按键读取和OLED显示。同时,结合蜂鸣器实现了整点报时功能,为单片机应用提供了实用案例。这个数字时钟不仅展示了基本的电子设计和编程能力,还提供了可扩展的基础,适合进一步添加更多功能。

全部代码下载

咨询问询请访问:

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

在这里插入图片描述

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

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

相关文章

vue处理json数据

背景&#xff1a;后端返回的数据不是我想要的&#xff0c;现在需要把 name 替换为title&#xff08;小声蛐蛐&#xff1a;又让我处理数据&#xff09; 后端返回数据格式 修改字段操作&#xff1a;&#xff08;使用递归遍历的方式将title属性赋了name的值&#xff09; renderT…

八、【源码】细化XML语句构建器,完善静态SQL解析

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/08-optimize-xml-parse 细化XML语句构建器&#xff0c;完善静态SQL解析 这一节主要是优化XML解析SQL部分&#xff0c;流程大概为&#xff…

【Java】解决Java报错:NumberFormatException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…

认识Java中的String类

前言 大家好呀&#xff0c;本期将要带大家认识一下Java中的String类&#xff0c;本期注意带大家认识一些String类常用方法&#xff0c;和区分StringBuffer和StringBuilder感谢大家收看 一&#xff0c;String对象构造方法与原理 String类为我们提供了非常多的重载的构造方法让…

通过抑制治疗上调的环氧化酶-2来改善光动力性能的肿瘤归巢嵌合肽菱形体

引用信息 文 章&#xff1a;Tumor Homing Chimeric Peptide Rhomboids to Improve Photodynamic Performance by Inhibiting Therapy‐Upregulated Cyclooxygenase-2. 期 刊&#xff1a;Smal&#xff08;影响因子&#xff1a;13.3&#xff09; 发表时间&#xff1a…

Point-LIO:鲁棒高带宽激光惯性里程计

1. 动机 现有系统都是基于帧的&#xff0c;类似于VSLAM系统&#xff0c;频率固定&#xff08;例如10Hz)&#xff0c;但是实际上LiDAR是在不同时刻进行顺序采样&#xff0c;然后积累到一帧上&#xff0c;这不可避免地会引入运动畸变&#xff0c;从而影响建图和里程计精度。此外…

Duilib多标签选项卡拖拽效果:添加动画特效!

动画是小型界面库的“难题”、“通病” 几年前就有人分享了如何用direct UI制作多标签选项卡界面的方法。还有人出了一个简易的浏览器demo。但是他们的标签栏都没有Chrome浏览器那样的动画特效。 如何给界面添加布局是的动画特效呢&#xff1f; 动画使界面看起来高大上&#…

C++笔试强训day41

目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj &#xff08;简单题&#xff09;对题意进行简单模拟即可&#xff1a; class Solution { public:int dx[…

2024年政治经济学与社会科学国际会议(ICPESS 2024)

2024年政治经济学与社会科学国际会议 2024 International Conference on Political Economy and Social Sciences 会议简介 2024年政治经济学与社会科学国际会议是一个致力于探讨政治经济学与社会科学交叉领域前沿问题的国际盛会。本次会议汇聚了全球顶尖的专家学者、研究人员和…

lubuntu / ubuntu 配置静态ip

一、查看原始网络配置信息 1、获取网卡名称 ifconfig 2、查询网关IP route -n 二、编辑配置文件 去/etc/netplan目录找到配置文件&#xff0c;配置文件名一般为01-network-manager-all.yaml sudo vim /etc/netplan/01-network-manager-all.yaml文件打开后内容如下 # This …

【优化过往代码】关于vue自定义事件的运用

【优化过往代码】关于vue自定义事件的运用 需求说明过往代码优化思路优化后代码&#xff08;Vue2&#xff09;遇到问题记录 Vue2官方自定义指令说明文档 Vue3官方自定义指令说明文档 需求说明 进入某些页面需要加载一些外部资源&#xff0c;并在资源加载完后进行一些处理&…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要&#xff1a;本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富&#xff0c;本文分享终篇状态报错与启停慢篇&#xff0c;主要分为以下四个部分&#xff1a; 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

图解支付系统全自动化渠道开关设计与实现

大家好&#xff0c;我是隐墨星辰&#xff0c;前几天在渠道路由章节中提到过自动化渠道开关&#xff0c;今天聊聊支付系统中全自动化渠道开关的设计与实现。主要讲清楚在什么情况下需要考虑建设自动化渠道开关&#xff0c;以及如何设计并实现一个平衡灵敏度和噪音的自动化渠道开…

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面&#xff0c;主要包括“查询”、“添加”、“删除”、“更新”&#xff0c;四个功能模块。 查询&#xff1a;从数据库中查找所有数据的所有内容&#xff0c;并显示在左边的QListWidget控件上。 添加&#xff1a;在右边的QLineEdit标签上输入需…

分享一个按钮代码,主要有html,svg及css动画实现

按钮展示: Switch by Galahhad made with CSS | Uiverse.io 源代码: css .theme-switch {--toggle-size: 30px;/* the size is adjusted using font-size,this is not transform scale,so you can choose any size */--container-width: 5.625em;--container-height: 2.5em;-…

Linux安装Qt5.14.2

下载 qt 5.14.2下载网址 下载qt-opensource-linux-x64-5.14.2.run Linux系统下载.run文件&#xff08;runfile文件&#xff09;&#xff0c;windows系统下载.exe文件&#xff0c;mac系统下载.dmg文件。 md5sums.txt中是各个文件对应的MD5校验码。 验证MD5校验码 md5sum是li…

UE4 使用样条线做鱼儿封闭路径动画

描述&#xff1a;鱼儿的游动动画的特点 1.通常是始终保持Y (Pitch)轴角度不变 2.调头的时候改变的是Z轴角度 效果&#xff1a;调头的时候比较自然 蓝图&#xff1a; 为了让鱼儿有恒定的游动速度&#xff0c;增加以下蓝图节点&#xff0c;游动速度为50 最后&#xff0c;让鱼…

Day53 动态规划part12

LC309买卖股票的最佳时机含冷冻期 与LC122类似&#xff0c;都是可无限次购买股票&#xff0c;只不过引入了冷冻期的概念dp[i][0] 第i天持有股票收益&#xff1b;dp[i][1] 第i天不持有股票收益;情况一&#xff1a;第i天是冷静期&#xff0c;不能以dp[i-1][1]购买股票,所以以dp[…

019、有序集合_命令

它保留了集合不能有重复,有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。如图 该有序集合包含kris、mike、frank、tim、martin、tom,它们的分数分别是1、91、200、220、250、251,有序集合提…