【单片机】msp430f5529 万年历,数字时钟,矩阵键盘修改时间,7针OLED显示,内部温度读取

文章目录

  • 功能
  • 实物图
  • 原理图
  • 一些程序片段
    • 矩阵键盘
    • 内部温度读取
    • 将年月日转为星期

功能

1 显示万年历,利用内部RTC模块
2 按键修改时间
3 显示芯片内部的温度数值

实物图

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

原理图

在这里插入图片描述

一些程序片段

矩阵键盘

https://qq742971636.blog.csdn.net/article/details/131650521

内部温度读取

这段代码是用来初始化一个模拟-数字转换器(ADC)的函数。它的作用是配置ADC的参数和寄存器,以便进行模拟信号的采样和转换。

具体解释如下:

首先,设置ADC12CTL0寄存器的位操作。将ADC12ON置1,表示打开ADC;将ADC12SHT0_12设置为1,表示设置采样保持时间为1024个时钟周期。

然后,配置ADC12CTL1寄存器的位操作。将ADC12SHP置1,表示使用脉冲采样模式;将ADC12SSEL_1置1,表示选择ACLK作为时钟源;将ADC12DIV_1置1,表示时钟分频系数为1。

接下来,设置ADC12IE寄存器的值为0x01,表示允许中断使能。这样当ADC转换完成时,将会触发中断。

清除REFCTL0寄存器的REFMSTR位,将参考电压控制权交给ADC12。这是为了确保ADC使用内部参考电压。

设置ADC12CTL0寄存器的ADC12REFON位为1,表示打开参考电压。此时参考电压被设置为1.5V。

设置ADC12MCTL0寄存器的ADC12SREF_1位为1,表示ADC的正输入端连接到参考电压(VREF)。这是为了使用内部参考电压来测量。

设置ADC12MCTL0寄存器的ADC12INCH_10位为1,表示ADC的输入通道选择为内部温度传感器。

最后,设置ADC12CTL0寄存器的ADC12ENC位为1,表示使能ADC12_A转换。这样配置完成后,即可开始进行ADC转换。

总结起来,这段代码的作用是初始化ADC,设置采样保持时间、选择时钟源、配置输入通道等参数,并打开ADC使能,以便进行模拟信号的采样和转换。

#define CALADC12_15V_30C *((unsigned int *)0x1A1A)  //6682
#define CALADC12_15V_85C *((unsigned int *)0x1A1C)  //6684

void ADC_Init(void) {
    ADC12CTL0 |= ADC12ON + ADC12SHT0_12;              /* 打开AD,设置采样保持时间为1024个时钟周期 */
    ADC12CTL1 = ADC12SHP + ADC12SSEL_1 + ADC12DIV_1;  /* 脉冲采样模式 ACLK 2分频 */
    ADC12IE = 0x01;                                 /* 中断使能 */

    REFCTL0 &= ~REFMSTR;                            /* 参考电压控制权交给ADC12 */
    ADC12CTL0 |= ADC12REFON;                          /* REF_ON REF=1.5V */
    ADC12MCTL0 |= ADC12SREF_1;                         /* V+ = REF  V- = AVSS */

    ADC12MCTL0 |= ADC12INCH_10;                        /* ADC输入为内部温度传感器 */
    ADC12CTL0 |= ADC12ENC;                            /* 开启ADC12_A转换 最后写 */
}
unsigned int temperature = 0;

void main(void){
    double tmp;
    int temp_k;
	WDTCTL = WDTPW + WDTHOLD;       /* Stop WDT */
	
	ADC_Init();
	
	while(1){
	
	ADC12CTL0 |= ADC12SC;
    tmp = (float) (((long) temperature - CALADC12_15V_30C) * (85 - 30))
          / (CALADC12_15V_85C - CALADC12_15V_30C) + 30.0f;
    temp_k = tmp * 100;
    //显示温度
    oled_cnt = 0;
    oled_disp[oled_cnt++] = 'T';
    oled_disp[oled_cnt++] = 'E';
    oled_disp[oled_cnt++] = 'M';
    oled_disp[oled_cnt++] = ':';

    oled_disp[oled_cnt++] = temp_k / 1000 + '0';
    oled_disp[oled_cnt++] = temp_k % 1000 / 100 + '0';
    oled_disp[oled_cnt++] = '.';
    oled_disp[oled_cnt++] = temp_k % 100 / 10 + '0';
    oled_disp[oled_cnt++] = temp_k % 10 + '0';
    oled_disp[oled_cnt++] = 'C';
    oled_disp[oled_cnt++] = 0;
    OLED_ShowString(0, 6, oled_disp, 0);


	}	
}

#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void) {
    switch (__even_in_range(ADC12IV, 34)) {
        case 6: // Vector 6: ADC12IFG0
            temperature = ADC12MEM0;
            //__bic_SR_register_on_exit(LPM0_bits); // Exit active CPU
        default:
            break;
    }
}


将年月日转为星期

这段代码是一个函数,用于根据给定的年月日计算对应的星期几。

代码以输入参数 iY、iM 和 iD 代表年、月和日。然后,根据公式计算出一个数值 iWeekDay 来表示星期几。

首先,代码检查给定的月份是否为1月或2月,如果是,则将传入的月份 iM 增加12,并将年份 iY 减去1。这是因为在公式中,一月和二月被认为属于前一年的13月和14月。

然后,使用如下公式计算星期几的数值:(iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7

最后,如果计算出的星期几数值为0,则将其转换为7,以符合星期数值的范围。

函数返回计算得到的星期几数值,范围在1到7之间,分别代表星期一到星期天。


/*
 * 由年月日获取星期 https://www.cnblogs.com/fengbohello/p/3264300.html
 * 返回1到7 代表星期一到星期天
 *
 */
int getWeekdayByYearday(int iY, int iM, int iD) {
    int iWeekDay = -1;
    if (1 == iM || 2 == iM) {
        iM += 12;
        iY--;
    }
    iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;
    if (iWeekDay == 0)
        iWeekDay = 7;
    return (iWeekDay);
}

源码:http://dt4.8tupian.net/2/28880a12b16800.pg3

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

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

相关文章

OpenCV使用ellipse()函数来绘制一个椭圆

/*** void ellipse(* InputOutputArray img, // 图像* Point center, // 椭圆原心* Size axes, // 椭圆x轴长度的一半,y轴长度的一半* double angle, // 椭圆旋转角度* double startAngle, // 起始角度* double endAngle, // 终止角度* const Scalar& color, // 椭圆颜色*…

Hexo博客部署腾讯云服务器

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Cisyam-Shark的博客 💞当前专栏: 前端相关 ✨特色专栏&…

华为Harmony应用开发初探

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体…

<Linux开发>驱动开发 -之- Linux I2C 驱动

<Linux开发>驱动开发 -之- Linux I2C 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细…

springboot服务端接口公网远程调试,并实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

三个视频怎么合成一个视频?分享简单好用的合并方法

通过将多个视频合并成一个,可以将分散的内容整合在一起,形成一个连贯的故事或主题。这对于制作影片、剧集、纪录片或视频日志等需要综合多个片段的项目非常有用,可以产生更连贯和流畅的观看体验。那么怎么将视频进行合并呢?给大家…

外部中断实验(stm32)

目录 EXIT的相关代码exit.cexit.h LED的相关代码KEY的相关代码BEEP的相关代码main.cGPIO 跟中断线的映射关系图 说明:以下内容参考正点原子资料 EXIT的相关代码 exit.c void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitS…

pycharm如何给一串中文快捷加引号(方法二)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 商人重利轻别离,前月浮梁买茶去。 大家好,我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

数据结构--哈夫曼树

数据结构–哈夫曼树 带权路径长度 结点的 权 \color{red}权 权:有某种现实含义的数值(如:表示结点的重要性等) 结点的带权路径长度 \color{red}结点的带权路径长度 结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积 树的…

【玩转循环】探索Python中的无限可能性

前言 循环可能是每个编程语言中使用比较多的语法了,如果能合理利用好循环,就会出现意想不到的结果,大大地减少代码量,让机器做那些简单枯燥的循环过程,今天我将为大家分享 python 中的循环语法使用。🚗&am…

Neo4j图数据库的使用笔记

Neo4j图数据库的使用笔记 win系统安装Neo4j图数据库 安装准备: neo4j-3.4.0版本的zip包 找个目录解压安装zip包 启动neo4j 下载neo4j-3.4.0版本的zip包 可以去neo4j官网下载,也可以去微云数聚官网下载。 微云数聚是neo4j在国内的代理商。 解压到…

满汉楼项目

满汉楼项目 1. 满汉楼介绍 满汉楼是一个综合餐饮管理系统,其主要分为: 人事登记:各部门人员信息登录管理:员工号、姓名、职位、密码菜谱价格:菜谱及价格报表统计:统计销售额成本及库房:名称注…

flutter聊天界面-聊天气泡长按弹出复制、删除按钮菜单

flutter聊天界面-聊天气泡长按弹出复制、删除按钮菜单 在之前实现了flutter聊天界面的富文本展示内容,这里记录一下当长按聊天气泡的时候弹出复制、删除等菜单功能 一、查看效果 当长按聊天气泡的时候弹出复制、删除等菜单,可新增更多按钮 二、代码实现…

2023/7/8总结

Tomcat 启动:双击bin目录下的startup.bat文件停止:双击bin目录下的shutdown.bat 文件访问 :http://localhost:8080(默认是8080,可以修改) git的使用 打开git bash git config --global user.name "名…

OpenCV读取一张深度图像并显示

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include

服务端研发提测模板

test环境分支自测通过 提测邮件标注test环境分支 【xxxxxx需求】服务端研发提测了&#xff0c;快去测试吧!

第十二章 elk

1、ELK可以帮助我们解决哪些问题 日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志 单个日志文件巨大,无法使用常用的文本工具分析,检索困难; 2、架构设计分析 Filebeat和Logstash ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、i…

简述JMeter实现分布式并发及操作

为什么要分布式并发&#xff1f; JMeter性能实践过程中&#xff0c;一旦进行高并发操作时就会出现以下尴尬场景&#xff0c;JMeter客户端卡死、请求错误或是超时等&#xff0c;导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发&#xff1a; …

【ELK企业级日志分析系统】部署Filebeat+ELK详解

部署FilebeatELK详解 1. 部署Filebeat节点&#xff08;CentOS 7-4&#xff09;1.1 部署Apache服务1.2 部署Filebeat服务 2. filter插件2.1 grok正则捕获插件2.1.1 内置正则表达式调用2.1.2 自定义表达式调用2.1.3 设置正则表达式过滤条件 2.2 mutate数据修改插件2.2.1 Mutate过…

抖音seo矩阵系统源码|需求文档编译说明(二)

目录 1.抖音seo矩阵系统文档开发流程 2.各平台源码编译方式说明 3.底层技术功能表达式 1.抖音seo矩阵系统文档开发流程 ①产品原型 ②需求文档 ③产品流程图 ④部署方式说明 ⑤完整源码 ⑥源码编译方式说明 ⑦三方框架和SDK使用情况说明和代码位置 ⑧平台操作文档 ⑨程序架…