基于STM32的多功能秒表

news/2024/11/7 17:00:25/

基于STM32的多功能秒表

当上电运行后,按下KEY1,秒表开始正计时,再次按下KEY1秒表停止计时,按下KEY2秒表清零,按下KEY3,手动调节秒表时间递增,按下KEY4手动调节秒表时间递减,按下KEY5秒表倒计时,倒计时到0时蜂鸣器响起来。

#include "stm32f10x.h"
#include "sys.h"
#define FM PBout(10)
#define uint unsigned int
#define KEY1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
#define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
#define KEY5 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
void Smg_Init(void);
void Key_Init(void);
void FM_Init(void);  //蜂鸣器初始化
void Delay(void);
void TIM3_Init(u16 arr,u16 psc);
void TIM2_Init(u16 arr,u16 psc);
uint arr1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//没有小数点数码管
uint arr2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//小数点数码管
uint disp1[2],disp2[2];
uint ID=0;
uint b=0;
uint a,temp1,temp2,flag=0;
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置2位抢占优先级2位响应优先级Smg_Init();Key_Init();FM_Init();TIM3_Init(220,7199);   //时钟参数配置TIM2_Init(220,7199);while(1){if(KEY1==0){Delay();if(KEY1==0){ID++;if(ID==3)         ID=1;          }     switch(ID){case 1:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能时钟,允许更新中断TIM_Cmd(TIM3,ENABLE);  //使能时钟break;case 2:TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); //关闭更新中断TIM_Cmd(TIM3,DISABLE); //关闭时钟break;}while(KEY1==0);}if(KEY2==0)  //清空秒表{a=0;b=0;GPIO_Write(GPIOA,0x3fbf);GPIO_Write(GPIOC,0x3f3f);while(KEY2==0);}if(KEY3==0)  //手动加数{a++;disp1[0]=arr1[a%10];disp1[1]=arr1[a/10];disp2[0]=arr2[b%10];disp2[1]=arr1[b/10];temp1=(disp1[1]<<8)|(disp1[0]&0x00ff);temp2=(disp2[1]<<8)|(disp2[0]&0x00ff);GPIO_Write(GPIOC,temp1);GPIO_Write(GPIOA,temp2);while(KEY3==0);} if(KEY4==0)  //手动减数{a--;disp1[0]=arr1[a%10];disp1[1]=arr1[a/10];disp2[0]=arr2[b%10];disp2[1]=arr1[b/10];temp1=(disp1[1]<<8)|(disp1[0]&0x00ff);temp2=(disp2[1]<<8)|(disp2[0]&0x00ff);GPIO_Write(GPIOC,temp1);GPIO_Write(GPIOA,temp2);while(KEY4==0);}  if(KEY5==0)  //倒计时{TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能时钟,允许更新中断TIM_Cmd(TIM2,ENABLE);  //使能时钟flag=1;while(KEY5==0);}         }       
}
void Smg_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=0xffff;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_Write(GPIOA,0x3fbf);GPIO_Write(GPIOC,0x3f3f);
}
void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void FM_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_10);
}
void TIM3_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseStructure.TIM_Period=arr;  //周期TIM_TimeBaseStructure.TIM_Prescaler=psc;  //分频系数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;// 抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;       //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);
}
void TIM2_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;NVIC_InitTypeDef NVIC_InitStructure1;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseStructure1.TIM_Period=arr;  //周期TIM_TimeBaseStructure1.TIM_Prescaler=psc;  //分频系数TIM_TimeBaseStructure1.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;//计数模式TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure1);NVIC_InitStructure1.NVIC_IRQChannel=TIM2_IRQn;//TIM2中断NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority=0;// 抢占优先级NVIC_InitStructure1.NVIC_IRQChannelSubPriority=3;       //响应优先级NVIC_InitStructure1.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure1);
}
void TIM3_IRQHandler(void)  //TIM3中断服务程序
{a++;disp1[0]=arr1[a%10];disp1[1]=arr1[a/10];disp2[0]=arr2[b%10];disp2[1]=arr1[b/10];temp1=(disp1[1]<<8)|(disp1[0]&0x00ff);temp2=(disp2[1]<<8)|(disp2[0]&0x00ff);GPIO_Write(GPIOC,temp1);GPIO_Write(GPIOA,temp2);if(a==60){a=0;b++;}  if(b==60){b=0;a=0;}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
void TIM2_IRQHandler(void)  //TIM2中断服务程序
{a--;disp1[0]=arr1[a%10];disp1[1]=arr1[a/10];disp2[0]=arr2[b%10];disp2[1]=arr1[b/10];temp1=(disp1[1]<<8)|(disp1[0]&0x00ff);temp2=(disp2[1]<<8)|(disp2[0]&0x00ff);GPIO_Write(GPIOC,temp1);GPIO_Write(GPIOA,temp2);if(a==0){if(b!=0){b--;a=60;}}if((a==0)&&(b==0)&&(flag==1)){flag=0;a=0;b=0;GPIO_Write(GPIOA,0x3fbf);GPIO_Write(GPIOC,0x3f3f);     while(1){FM=~FM;Delay();}}     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}            
void Delay(void)
{uint i,j;for(i=0;i<50;i++)for(j=0;j<80;j++);
}

硬件电路原理图
电路图

STM32多功能秒表


http://www.ppmy.cn/news/615611.html

相关文章

stm32倒计时秒表proteus_倒计时秒表 单片机

目录 一、设计目的 ........................................................................................................ 1 二、设计任务及要求 ............................................................................................ 2 三、总体方案设计 …

MSP430 G2553 单片机 口袋板 日历 时钟 闹钟 万年历 电子时钟 秒表显示

一、实验目的本次实验使用 MSp430G2553 以及 GZ 扩展版的 LCO 显示、蜂鸣器、机械按键&#xff0c;实现具有多功能电子钟的设计。功能包括&#xff0c;按键切换工作界面、设置时间、秒表计时、闹钟的设定、闹钟的暂停与休眠。二、实验内容与设计思路电子钟功能综述本次电子表设…

Python 内置模块tkinter —— 秒表计时器

# 秒表计时器""" 思考&#xff1a;1、怎么创建一个最简单的窗口&#xff1f;2、怎么保持窗口一直运行&#xff1f;3、不用方法mainloop&#xff08;&#xff09;怎么实现窗口一直运行&#xff1f;4、请问窗口的宽度*高度默认值为多少个像素点&#xff1f;5、利用…

stm32倒计时秒表proteus_单片机课程设计倒计时秒表

精品文档 。 1 欢迎下载 一、设计目的 此次设计是我们更进一步了解基本电路的设计流程&#xff0c;提高自己的设计理念&#xff0c; 丰富自己的理论知识&#xff0c;巩固所学知识&#xff0c;使自己的动手动脑能力有更进一步提高&#xff0c; 为自己今后的学习和工作打好基础&a…

基于单片机的秒表计时器系统设计(#0400)

当今社会在很多比赛中&#xff0c;都要用到时间的长短来衡量比赛的结果。本设计是一个利用单片机控制的多功能秒表系统。 功能描述 1、采用51单片机作为控制芯片&#xff1b; 2、数码管前两位显示分钟&#xff0c;后两位显示秒&#xff1b; 2、正计时、倒计时可以切换&#…

axios请求、 Excel 表格导出

import axios from axios;//用于导出excel表格 export const exportExcel ({ method get, url, data {}, fileName }) > {const field method get ? params : data;axios({method,url,[field]: data,responseType: blob}).then((res) > {//导出接口失败 返回的也是…

上海EMBA项目|上国会-美国亚利桑那州立大学合办金融财务EMBA

上海EMBA项目|上国会-美国亚利桑那州立大学合办金融财务EMBA 项目愿景 21世纪注定是一个颠覆的时代。技术和基础设施的嬗变正在催生新的大众生活方式和新经济模式。数字化触动了每个人的神经&#xff0c;互联网浪潮将带来社会经济的指数级增长。在这一变革的时代&#xff0c;转…

《英雄连》导致机器诡异死机……

这半个月&#xff0c;天天晚上玩《英雄连》&#xff08;不是《兄弟连》&#xff0c;不要再有人搞错了&#xff01;&#xff09;&#xff0c;玩了数十场《英雄连》 &#xff0c;带领第三帝国的士兵们横扫欧洲大陆&#xff0c;那一个“爽”啊…… 可是&#xff0c;看来是开了太高…