基于STM32程序万年历液晶1602显示-proteus仿真-源程序

news2024/10/6 14:36:06

一、系统方案
本设计采用STM32单片机作为主控器,液晶1602显示,按键设置万年历。
在这里插入图片描述
二、硬件设计
原理图如下:
在这里插入图片描述
三、单片机软件设计
1、首先是系统初始化
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //仿真必须加
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

//定时器TIM3初始化  C 语言结构体Struct、指针*  ->  &、类型定义typedef

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

// TIM_Cmd(TIM1, ENABLE); //使能TIMx
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
2、液晶显示程序
void LCD1602_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
GPIO_InitTypeDef LCD1602_GPIOStruct;
LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
LCD1602_GPIOStruct.GPIO_Pin = LCD1602_E | LCD1602_RS | LCD1602_RW ;
GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
LCD1602_GPIOStruct.GPIO_Pin = DB0 | DB1 | DB2 |DB3 | DB4 | DB5|
DB6 | DB7 ; //设置为开漏输出
GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}

void LCD1602_WaitReady(void) //检测忙状态
{
uint8_t sta;

GPIOB->ODR =0x00FF;
RSO(0);
RWO(1);
EO(1);
SysTick_Delay_Us(1);
do{
	sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
	EO(0);
}while(sta);

}

void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
LCD1602_WaitReady();
RSO(0);
RWO(0);
EO(0);
SysTick_Delay_Us(1);
EO(1);
LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
EO(0);
SysTick_Delay_Us(400);
}

void LCD1602_WriteDat(uint8_t dat) //写数据
{
LCD1602_WaitReady();
RSO(1);
RWO(0);
SysTick_Delay_Us(30);
EO(1);
LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
EO(0);
SysTick_Delay_Us(400);
}

3、按键程序
void KEY_Scan( void )
{

 if(KEY1==0)			//读取K1按键状态
	{
		SysTick_Delay_Ms(10);
		if(KEY1==0)
		{
			while(KEY1==0);
		 	KEY_num++;
			 TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);   //禁止TIM3中断
			TIM_Cmd(TIM3,DISABLE);        
			if( KEY_num >=8 )
			{
				KEY_num = 0;
				
			  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启定时器
			  TIM_Cmd(TIM3,ENABLE);
			} 
		
		}
	}
	if(KEY2==0)			//读取K2按键状态,加
	{
		SysTick_Delay_Ms(10);
		if(KEY2==0)
		{
			while(KEY2==0);
				if( KEY_num == 1 )
			{
				nian++;
				if( nian > 2999 )
				{
					nian = 0;
				}
			}
			if( KEY_num == 2 )
			{
				yue++;
				if( yue > 12 )
				{
					yue = 1;
				}
			}
			if( KEY_num == 3 )
			{
				ri++;
				if( ri > 30 )
				{
					ri = 1;
				}
			}
			if( KEY_num == 4 )
			{
				shi++;
				if( shi > 23 )
				{
					shi = 0;
				}
			}
			if( KEY_num ==5 )
			{
				fen++;
				if( fen > 59 )
				{
					fen = 0;
				}
			}
			if( KEY_num == 6 )
			{
				miao++;
				if( miao > 59 )
				{
					miao = 0;
				}
			}
			if( KEY_num == 7 )
			{
				week++;
				if( week > 7 )
				{
					week = 1;
				}
			}
			Display_Time();
		
		}
	}
	if(KEY3==0)			//读取K3按键状态,减
	{
		SysTick_Delay_Ms(10);
		if(KEY3==0)
		{
			while(KEY3==0);
		 	if( KEY_num == 1 )
			{
				nian--;
				if( nian < 2000 )
				{
					nian = 2999;
				}
			}
			if( KEY_num == 2 )
			{
				yue--;
				if( yue <= 0 )
				{
					yue = 12;
				}
			}
			if( KEY_num == 3 )
			{
				ri--;
				if( ri <= 0 )
				{
					ri = 30;
				}
			}
			if( KEY_num == 4 )
			{
				shi--;
				if( shi <= 0 )
				{
					shi = 23;
				}
			}
			if( KEY_num == 5 )
			{
				fen--;
				if( fen <= 0 )
				{
					fen = 59;
				}
			}
			if( KEY_num == 6 )
			{
				miao--;
				if( miao <= 0 )
				{
					miao = 59;
				}
			}
			if( KEY_num == 7 )
			{
				week--;
				if( week <= 0 )
				{
					week = 7;
				}
			}
		Display_Time();
		
		}
	}

}
4、核心算法程序
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
miao++;
if( miao==60)
{
miao = 0;
fen++;
if( fen 60)
{
fen=0;
shi++;
if( shi
24 )
{
shi = 0;
week++;
if(week>7) week=1;
ri++;
if( ri > 30 )
{
ri = 0;
yue++;
if( yue > 12 )
{
yue = 0;
nian++;
if( nian > 2999 )
{
nian = 0;
}
}
}
}

	}
}

TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); //TIM_IT_Update=0
//清除TIM3更新中断标志 进中断1(硬件),为保证下次再产生中断软件清中断标志

}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

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

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

相关文章

官方YOLOV5的torch模型->ONNX模型->RKNN模型

1、环境配置 1.1 RKNN Toolkit2的环境配置 下载RKNN Toolkit2 git clone https://github.com/rockchip-linux/rknn-toolkit2.git打开一个终端命令行窗口,安装 Python3.6 和 pip3 sudo apt-get install python3 python3-dev python3-pip安装所需的依赖包 sudo apt-get inst…

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾&#xff1a;线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法&#xff1a;坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇&#xff08;十二&#xff09;&#xff1a;用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

Unity中Shader的变体shader_feature

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性&#xff0c;用于配合shader_feature来控制…

解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

deepspeed存在一个bug&#xff0c;即在训练时不保存调度器状态&#xff0c;因此如果训练中断后再重新开始训练&#xff0c;调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出&#xff1a;https://github.com/mic…

清理Maven仓库中下载失败的文件

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【SpringBoot】统一功能处理

目录 &#x1f383;1 拦截器 &#x1f380;1.1 拦截器的代码实现 &#x1f3a8;1.2 拦截器的实现原理 &#x1f9f6;2 拦截器应用——登录验证 &#x1f9ba;3 异常统一处理 &#x1f3ad;4 统一数据返回格式 &#x1f9e4;4.1 为什么需要统一数据返回格式 &#x1f9e3;4.2 统…

Cisco Packet Tracer入门篇

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Python中的文件I/O操作:常见问题与解决方案

在Python编程中&#xff0c;文件I/O操作是常见的任务。本文将介绍一些关于Python文件I/O操作的常见问题及其解决方案&#xff0c;并提供详细的代码示例。 1、问题&#xff1a;如何正确地打开和关闭文件&#xff1f; 解决方案&#xff1a;使用with语句可以确保文件在操作完成后…

查漏补缺 - ES6

目录 1&#xff0c;let 和 const1&#xff0c;会产生块级作用域。2&#xff0c;如何理解 const 定义的变量不可被修改? 2&#xff0c;数组3&#xff0c;对象1&#xff0c;Object.is()2&#xff0c;属性描述符3&#xff0c;常用API4&#xff0c;得到除某个属性之外的新对象。 4…

华为云云服务器评测|使用Docker可视化Portainer部署Yolov5项目进行AI识别

目录 初始化配置使用Xshell连接 项目准备 docker-compose Dockerfile .dockerignore 在服务器中启动Docker项目 初始化配置使用Xshell连接 因为我比较喜欢用xshell来操作服务器&#xff0c;如果你是使用华为在线的CloudShell或其他方式&#xff0c;可以跳过第一步的连接…

【Redis专题】Redis持久化、主从与哨兵架构详解

目录 前言课程目录一、Redis持久化1.1 RDB快照&#xff08;Snapshot&#xff09;&#xff1a;二进制文件基本介绍开启/关闭方式触发方式bgsave的写时复制&#xff08;COW&#xff0c;Copy On Write&#xff09;机制优缺点 1.2 AOF&#xff08;append-only file&#xff09;&…

Git—版本控制系统

git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱&#xff08;用户标识&#xff0c;必…

数学建模--逻辑回归算法的Python实现

首先感谢CSDN上发布吴恩达的机器学习逻辑回归算法任务的各位大佬. 通过大佬的讲解和代码才勉强学会. 这篇文章也就是简单记录一下过程和代码. CSDN上写有关这类文章的大佬有很多,大家都可以多看一看学习学习. 机器学习方面主要还是过程和方法. 这篇文章只完成了线性可分方面的任…

Mac Homebrew中常用的 Brew 命令

Mac 中常用的 Brew 命令集 Brew&#xff08;Homebrew&#xff09;是一个强大的包管理器&#xff0c;用于在 macOS 上安装、更新和管理各种软件包。它使得在 Mac 上安装开发工具、应用程序和库变得轻松和便捷。本博客将介绍一些在 Mac 中常用的 Brew 命令&#xff0c;以帮助您更…

SpringMVC_SSM整合

一、回顾SpringMVC访问接口流程 1.容器加载分析 容器分析 手动注册WebApplicationContext public class ServletConfig extends AbstractDispatcherServletInitializer {Overrideprotected WebApplicationContext createServletApplicationContext() {//获取SpringMVC容器An…

UDP的可靠性传输

UDP系列文章目录 第一章 UDP的可靠性传输-理论篇&#xff08;一&#xff09; 第二章 UDP的可靠性传输-理论篇&#xff08;二&#xff09; 文章目录 UDP系列文章目录前言1.TCP 和UDP格式对比2.UDP分片原理3.UDP 传输层应该注意问题4.MTU5.UDP 分片机制设计重点 一、ARQ协议什么…

华为OD机考算法题:食堂供餐

目录 题目部分 解析与思路 代码实现 题目部分 题目食堂供餐题目说明某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0&#xff0c;食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达成排队时间为0的最低供餐速度。…

PPO算法

PPO算法 全称Proximal Policy Optimization&#xff0c;是TRPO(Trust Region Policy Optimization)算法的继承与简化&#xff0c;大大降低了实现难度。原论文 算法大致流程 首先&#xff0c;使用已有的策略采样 N N N条轨迹&#xff0c;使用这些轨迹上的数据估计优势函数 A ^ …

算法做题记录

一、递推 95.费解的开关 #include<iostream> #include<cstring> using namespace std;const int N 8;char a[N][N],s[N][N]; int T; int ans20,cnt; int dir[5][2]{1,0,-1,0,0,1,0,-1,0,0};void turn(int x,int y) {for(int i0;i<5;i){int xx xdir[i][0];in…