【TB作品】MSP430F149单片机,数字时钟万年历程序,滚动显示特效

news2025/4/9 5:52:17

一、 万年历
任务要求:
制作一个万年历,具有显示时间、日期、温度、湿度、闹钟功能。
1、OLED显示屏上显示日期和时钟(显示到秒,时间可走动);(20分)
2、通过开发板上的温度传感器采集当前环境温度并显示在显示屏上;(20分)
3、通过湿度传感器采集当前环境湿度并显示在显示屏上;(20分)
4、通过独立按键设置闹钟,并在OLED上显示设置的闹钟时间,到达闹钟时间时蜂鸣器发出声响并持续一段时间,同时D1~D8以流水灯形式亮起;(20分)
5、日期为滚动特效;(20分)

附加题:
1、可以通过按键修改日期和时间(类似于手动调电子手表时间一样)。

【注释】
1、湿度传感器(需要领取)需要根据其使用手册和单片机原理图,由学生接到开发板上并编写湿度采集函数,更多湿度传感器信息请参考说明书或网络资料;
2、温度传感器DS18B20已焊接在手柄板上,其引脚连接查看手柄板原理图;
基本任务中,设置闹钟时,使用按键A4进行时间的上调,使用按键A5进行时间的下调,步进值为10s,即每按一次按键时间上调或下调10s。上调达到60s时,时间“分”加1;时间下调小于0s时,时间“分”减1,时间“时”的调节依此类推。
3、附加任务中,通过按键A1进行日期、时间、闹钟设置功能的切换,按键A4、A5仍为上调和下调按键,设置时间和闹钟时调节对象是“秒”,步进值为10s;设置日期时调节的对象是“日”,步进值是1日,大于一个月的最大日时,月份自动加一。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在嵌入式系统的世界里,单片机的应用几乎无处不在。今天,我将与大家分享一个利用单片机制作的万年历项目,它不仅是一个时间日期的显示工具,还具有温度、湿度显示,以及闹钟功能。通过这个项目,你将了解到如何在单片机上实现这些常见的功能。

技术细节

1. OLED 显示屏控制

项目中使用了128x64的OLED显示屏,用来显示时间、日期、温湿度等信息。通过编写相应的驱动代码,OLED显示屏可以完美地展示这些内容。显示时间与日期的功能利用了单片机的定时器来更新显示,实现了动态的秒表功能。

void UpdateDisplay(void) {
    // 显示当前时间
    sprintf(displayBuffer, "Time:%02d:%02d:%02d", nowTime.hour, nowTime.minute, nowTime.second);
    OLED_ShowString(0, 2, displayBuffer, 16, 1);

    // 显示温湿度
    if (sensorStatusOK) {
        sprintf(displayBuffer, "R:%02d%% T:%02d.%dC", humidityDataHigh, temperature / 10, temperature % 10);
        OLED_ShowString(0, 4, displayBuffer, 16, 1);
    }
}
2. 温度与湿度采集

项目使用了两种传感器来分别获取温度和湿度。DS18B20用于温度采集,DHT11用于湿度采集。通过对传感器的初始化与数据读取,成功将实时数据展示在OLED显示屏上。

unsigned int GetTemperature(void) {
    unsigned int temp = 0;
    DS18B20_Init();
    DS18B20_WriteByte(SKIP_ROM);
    DS18B20_WriteByte(CONVERT_TEMP);
    temp = DS18B20_ReadByte() + (DS18B20_ReadByte() << 8);
    return (int)(temp * 0.0625 * 10); // 返回实际温度值
}
3. 闹钟功能

在这个项目中,闹钟功能是一个亮点。当设定的时间到达时,蜂鸣器响起,LED灯以流水形式点亮,为提醒功能增添了视觉和听觉的双重效果。使用了简单的按键交互来设置闹钟时间,极大地方便了用户。

void HandleAlarm(void) {
    if (nowTime.hour == alarmTime.hour && nowTime.minute == alarmTime.minute && nowTime.second == alarmTime.second) {
        TriggerAlarmBeep();
    }
}
4. 用户交互

项目实现了通过按键的方式来调整时间、日期以及设置闹钟。这个功能模拟了电子手表的操作体验,用户可以通过不同的按键来切换设置模式并进行时间的上调或下调操作。

void ProcessKeyInput(int key) {
    if (key == 7) {  // 上调时间或日期
        nowTime.second += 10;
        // 处理分钟、小时、日期的自动进位
        UpdateDisplay();
    }
}

实验报告:万年历项目

一、实验目的

本实验旨在通过单片机开发制作一个具有多功能的万年历系统,包括显示时间、日期、温度、湿度和闹钟功能。通过完成此项目,学生将能够掌握基本的单片机编程技术、传感器数据采集、OLED显示屏控制以及闹钟功能的实现。

二、实验原理

万年历项目的核心是通过单片机采集时间、日期、温度和湿度信息,并在OLED显示屏上进行实时显示。通过使用按键可以设置时间、日期和闹钟,当时间到达设定的闹钟时间时,蜂鸣器将发出警报声,并通过流水灯形式提示用户。

项目的关键模块包括:

  1. 时间和日期管理:通过定时器中断更新时间和日期,并通过算法计算当前的星期。
  2. 温度和湿度采集:使用DS18B20温度传感器和DHT11湿度传感器采集环境数据。
  3. OLED显示屏控制:通过SPI通信接口向OLED发送数据,显示当前的时间、日期、温度和湿度。
  4. 闹钟功能:用户可以通过按键设置闹钟时间,闹钟到时蜂鸣器发声提示并通过LED流水灯进行视觉提示。
三、实验设备
  • MSP430单片机开发板
  • DS18B20温度传感器
  • DHT11湿度传感器
  • OLED显示屏
  • 蜂鸣器
  • 按键
  • LED指示灯
四、实验步骤
  1. 硬件连接

    • 将DS18B20温度传感器连接到开发板的指定引脚。
    • 根据DHT11湿度传感器的使用手册,将其接线与开发板连接。
    • 将OLED显示屏通过SPI接口与开发板相连。
    • 按照电路图连接蜂鸣器和LED。
  2. 软件设计

    • 初始化系统时钟、GPIO口、ADC模块和中断。
    • 编写DS18B20和DHT11的数据采集函数,通过定时器中断定期读取传感器数据。
    • 实现时间和日期管理功能,包括闰年判断、月份天数计算和星期计算。
    • OLED显示屏的驱动程序编写,包括字符和字符串的显示、中文显示和滚动显示特效。
    • 实现闹钟功能,通过按键设置闹钟时间,并在到达设定时间时触发蜂鸣器和LED提示。
    • 编写按键扫描函数,检测用户的按键输入,并处理日期、时间、闹钟设置。
  3. 调试与验证

    • 编写测试程序,检查温度和湿度传感器的读数是否正确显示在OLED屏上。
    • 调试时间、日期的显示与更新,确保系统能够正常滚动显示日期并正确切换月份和年分。
    • 通过按键设定闹钟,检查闹钟是否能够在设定时间响铃并亮起流水灯。
五、实验结果

在实验过程中,成功实现了以下功能:

  • 时间和日期能够准确显示在OLED屏幕上,且时间可以走动。
  • 温度传感器DS18B20和湿度传感器DHT11能够准确采集环境数据并实时显示。
  • 通过按键成功设置了闹钟,闹钟到达设定时间时,蜂鸣器发出警报声并亮起LED流水灯。
  • OLED显示屏能够正确滚动显示日期信息,且通过附加功能可以通过按键修改时间和日期。
六、实验总结

通过本次实验,熟悉了MSP430单片机的基本操作以及外设驱动编程,特别是对OLED显示屏、温度和湿度传感器的使用有了深入理解。同时,掌握了闹钟功能的实现原理,了解了如何通过按键进行时间和闹钟的设定与调整。整个项目增强了对单片机综合应用能力的认识,为日后进一步开发和优化嵌入式系统奠定了良好的基础。

code

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

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

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

相关文章

Java小白一文简单普及Java中的String关键字

String类 String对象用于保存字符串&#xff0c;也就是一组字符序列 字符串常量对象是用双引号括起的字符序列&#xff0c;例如 “Kerwin” 字符串的字符使用Unicode字符编码&#xff0c;一个字符&#xff08;不区分字母还是汉字&#xff09;占两个字节 String类较常用构造方…

婚宴座位号怎样查?

在婚宴的温馨氛围中&#xff0c;快速准确地找到座位是每位宾客的期待。本文将带您领略如何通过一系列简单步骤&#xff0c;在电脑端和小程序中查询座位号&#xff0c;确保每位宾客都能享受到这场庆典的每一个细节。 第一章&#xff1a;电脑端查询信息上传 1. 官网登录&#x…

基于状态机实现的按键释放、消抖、单击、双击、长按等功能

状态机理论&#xff1a; 每次只能执行状态机中的一个状态 注意&#xff1a;状态转移时有时会根据需要发生不同的动作(可根据不同条件发生不同的动作)&#xff0c;此处的发生动作指返回按键码值&#xff08;代表那个按键的对应状态&#xff09; 如果是在长按状态在向释放状态迁…

分享一个基于python的内蒙古旅游景点数据分析与采集系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【算法进阶1】贪心算法、背包问题(0-1背包、分数背包)、拼接最大数字问题、活动选择问题

1 贪心算法 2 背包问题 2.1 0-1背包问题 2.2 分数背包 3 拼接最大数字问题 4 活动选择问题 1 贪心算法 贪心算法(又称贪婪算法)是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。 也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出…

基于虚拟下垂控制的分布式电源并网建模仿真

针对并联逆变器间的环流和功率分配不均的问题&#xff0c;提出了一种基于改进虚拟阻抗的微电网逆变器下垂控制策略&#xff0c;对传统下垂控制算法的有功功率和无功功率进行分析&#xff0c;虚拟阻抗引入到电压电流双环控制策略。 在MATLAB中建立了逆变器并联运行的分布式仿真模…

【Qt】贪吃蛇

目录 贪吃蛇小游戏 一.项目介绍及演示 1. 项目介绍 2. 项目演示 3. 窗口介绍 3.1 游戏大厅窗口 3.2 游戏关卡选择窗口 3.3 游戏房间窗口 二、创建项目及资源配置 1. 创建项目&#xff08;QWidget&#xff09; ​编辑 2. 资源配置&#xff08;图片声音素材&#xff0…

文心快码助力项目实战开发

文章目录 前言支持的编程语言 Language安装方法使用方法 项目实践代码运行流程出行方案查询JSP 指令与标签库指令页面上下文路径设置表单部分查询结果显示部分 使用感受优点改进建议 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 文心快码Baidu Comat…

《黑神话:悟空》爆火,作为普通人,该怎么抓住这波风口赚到钱?

目录 一、游戏视频 1.1、游戏教程视频 1.2、游戏剧情视频 二、游戏直播 三、游戏视频出海 四、AI黑神话悟空 大家好&#xff0c;我是小奇&#xff0c;一名热衷于分享AI副业项目的普通博主。不管你是AI小白还是老手&#xff0c;我都能帮你轻松上手&#xff0c;用AI技术赚钱…

【C++ Primer Plus习题】4.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Pizza {string companyName;float diameter;float wieght; }Pizza;int main() {Pizza p;cout << "请输入披萨的公司名: ";getline(cin, p.companyName);…

uniapp+vue3的ifdef实现多端配置客服消息

在微信小程序预览&#xff0c;实现客服消息&#xff0c;因是个人版&#xff0c;不支持 button | uni-app官网 (dcloud.net.cn) 条件编译处理多端差异 | uni-app官网 (dcloud.net.cn) uni.makePhoneCall(OBJECT) | uni-app官网 (dcloud.net.cn) //my.vue <template> &l…

10大国产AI绘画软件,每一款都挺好用 ,你用过吗?

在这个科技与艺术交织的时代,AI绘画软件正以惊人的速度改变着我们的创作方式。今天,就让我们一起探索那些你绝不能错过的10大国产AI绘画神器,它们不仅让创作变得前所未有的简单高效,更让每一位艺术家和爱好者都能享受到创作的无限乐趣! 1️⃣触站A🎨——语音创作,未…

循环结构程序设计-找出指定数量学生的最高分

**7-1-1 #include <stdio.h>int main(){int n,score,max;scanf("%d",&n);max 0;for(int i0;i<n;i){scanf("%d",&score);if(score>max){max score;}}printf("%d",max);return 0; }

一文迅速上手 ESP32 bluedroid 蓝牙从机开发

前言 个人邮箱&#xff1a;zhangyixu02gmail.com该博客主要针对希望迅速上手 ESP32 蓝牙从机开发人员&#xff0c;因此&#xff0c;很多蓝牙技术细节知识并不会进行介绍&#xff0c;仅仅介绍我认为需要了解的 API 函数和回调内容。本文主要是基于gatt_server demo来微调进行进…

# ‘telnet‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘telnet’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 一、报错描述&#xff1a; 1、当使用 telnet 命令&#xff0c;连接本地 tomcat 的 8005 端口时报错。 2、报错解释 这个错误表明系统无法识别telnet命令&#xff0c;因为它不是内置命令&#xff0c;也没有…

跳马(华为od机考题)

一、题目 1.原题 马是象棋(包括中国象棋和国际象棋)中的棋子&#xff0c; 走法是每步直一格再斜一格&#xff0c; 即先横着或直着走一格&#xff0c;然后再斜着走一个对角线&#xff0c; 可进可退&#xff0c;可越过河界&#xff0c;俗称“马走‘日’字。 给顶m行n列的棋盘&…

人工智能在专业领域的斗争

介绍 ChatGPT 等大型语言模型 (LLM) 在用自然语言讨论一般话题的能力方面令人印象深刻。然而&#xff0c;他们在医学、金融和法律等专业领域却举步维艰。这是由于缺乏真正的理解&#xff0c;并且注重模仿而不是智力。 大语言模型正处于炒作的顶峰。由于能够用自然语言回答和讨…

“Docker中部署Kibana:步骤与指南“

博主这篇文章是跟Elasticsearch那篇文章是有关系的&#xff0c;建议大家先去看&#xff1a; 轻松上手&#xff1a;Docker部署Elasticsearch&#xff0c;高效构建搜索引擎环境_docker 启动 es-CSDN博客 这篇博文&#xff0c;还有镜像下载不下来的情况&#xff0c;大家可以去看…

攻破:重定向 缓冲区

文章目录 前言&#xff1a;认识读文件read认识重定向&&缓冲区重定向现象及分析&#xff1a;dup2的介绍&#xff1a; 缓冲区的引入&#xff1a;缓冲区的理解&#xff1a; 前言&#xff1a; ​ 从上一章开始&#xff0c;我们进入了文件IO的学习&#xff0c;认识了文件描…

浅谈C# RabbitMQ

一、基本介绍 RabbitMQ——Rabbit Message Queue的简写&#xff0c;但不能仅仅理解其为消息队列&#xff0c;消息代理更合适。 RabbitMQ 是一个由 Erlang 语言开发的AMQP&#xff08;高级消息队列协议&#xff09;的开源实现&#xff0c;其内部结构如下&#xff1a; RabbitMQ作…