【单片机】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)  //6684void 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: ADC12IFG0temperature = ADC12MEM0;//__bic_SR_register_on_exit(LPM0_bits); // Exit active CPUdefault: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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【新版系统架构】第十八章-安全架构设计理论与实践

信息安全体系架构设计 信息系统安全设计重点考虑:系统安全保障体系,信息安全体系架构 系统安全保障体系: 安全区域策略的确定,根据安全区域的划分,主管部门应制定针对性的安全策略统一配置和管理防病毒系统&#xff…

【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

文章目录 1. 概念2. gcc 的使用2.1 预处理(预编译)2.2 编译2.3 汇编2.4 链接 3. 动态库和静态库3.1 动静态库的理解3.2 默认是动态链接,我们如何进行静态 这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下…

数据备份与恢复

目录 数据备份 1、备份单个数据库中的所有表 2、备份数据库中的某些表 3、备份所有数据库 4、只备份emp表结构 数据库恢复 方法1:使用mysql 命令恢复 方法2:进入数据库,使用source加载备份文件恢复 MySQL表的导入导出 数据备份 MySQLdump备份数据库语句的…

对RAM和ROM的理解

什么是RAM、ROM? RAM(Random Access Memory)随机存取存储器 ROM(Read Only Memory)只读存储器 先记住一件事 RAM断电将失去数据 ROM断电仍会保留数据 RAM、ROM、Flash、内存条、硬盘、SD卡到底怎么归类? 我们先来看下计算机的原理和计算机的需求 …

国网技术学院MySQL课堂练习

一、数据库的安装和配置 在虚拟机中安装WINDOWS7操作系统 正常安装,查询安装教程即可安装必备组件和MYSQL5.7数据库 正常安装,查询安装教程即可修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可,作用为设置默认的内…

SpringBoot集成Flowable工作流

SpringBoot集成Flowable工作流 Flowable是什么?一、添加依赖二、flowable配置三、定义流程文件1.使用流程文件定义工作流2.idea使用插件来定义流程图1.安装插件2.创建bpmn文件并画流程图3.右击流程用模型设计器打开文件 四、测试controller Flowable是什么&#xff…

数据结构 - 线性表(C语言版)

线性表分为顺序表和单链表 线性表的操作主要是查询、插入、删除 1、顺序表 首先,定义一个顺序表的结构体 #define MAX_SIZE 10 typedef struct {int data[MAX_SIZE];int length; }SqList, * PsqList;创建一个顺序表 //创建顺序表 void createSqList(PsqList pSq…

【Excel】csv乱码

原因 CSV用UTF-8编码 Excel用ANSI编码 解决 1 创建一个新的Excel 2 数据 > 从文本/CSV 3 选择文件 4 选择 文件原始格式 和 分隔符 (根据自己文件进行选择,如果不知道编码,可以一个一个的试,直到不出现乱码)

CCLINK转MODBUS-TCP网关cclink利modbus区别

大家好,今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议,它们的不同使得数据互通比较困难,但远创智控YC-CCLK-TCP网关的出现改变了这一切。 1, 远创智控YC-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关&#xff…

Blender初学者入门:做一个魔方

文章目录 安装和使用基本操作物体属性材质 安装和使用 由于Blender是开源免费的,所以可直接在官网下载,正常安装,没有坑点。 在打开Blender后,创建新文件,选择General,就会得到一个立方体,而界…

hadoop -Unable to start failover controller. Parent znode does not exist

Unable to start failover controller. Parent znode does not exist 问题描述 今天使用星环的TDH集群时,HDFS服务宕掉,在后台查看namenode 始终起不来 kubectl get pod -o wide | grep hdfs 如上图,k8s pod 起来又crash 掉,然后…

手机外壳缺陷视觉检测软硬件方案

单独使用一种光源效果图 同轴光会出现亮度不够的情况;回形面光因为光源中间的圆孔会使图像有阴影,造成图像效果不均衡,所以不采用单独光源打光 使用同轴回形面光源效果图 回形光源照亮产品要寻找的边缘,同轴光源起到补光的作用&a…