蓝桥杯STM32F103RB数码管计时(秒表)

news/2024/11/7 14:40:39/

STM32F103RB数码管定时(秒表)

    • 硬件单路
    • `配置TIM2及其中断代码片如下(示例)`
    • `中断执行函数代码片如下(示例)`
    • `seg.c(数码管)代码片如下(示例)`
    • 完整工程下载>>[GitHub](https://github.com/HDJ1839822/Github.git)

实验功能:三位数码管实现十分钟计时,最左边数码管显示分钟数,中间和右边的数码管显示秒数。


硬件单路

在这里插入图片描述

配置TIM2及其中断代码片如下(示例)

void TIM2_NVIC(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//设置TIM2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断源NVIC_Init(&NVIC_InitStructure);}void TIM2_Init(void) // 1S
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseInitStruct.TIM_Prescaler = (2000-1);//预分频系数    2000-1s  TIM_TimeBaseInitStruct.TIM_Period = (36000-1);//自动重载计数周期值TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置为向上计数方式TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能TIM2的更新中断TIM_Cmd(TIM2, ENABLE);//使能TIM2定时器
}  

中断执行函数代码片如下(示例)

int num=0;
void TIM2_IRQHandler(void) 
{ if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET){num++;s++; if(s==10)s=0;  if(num%10==0) m++;if(m==6)m=0;if(num%60==0)h++;if(h==10)h=0;}TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

seg.c(数码管)代码片如下(示例)

#include "seg.h"void SEG_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStruct);
}void SEG_Disp(unsigned char ucData1, unsigned char ucData2,unsigned char ucData3, unsigned char ucDot)
{unsigned char i;
//  unsigned char code[17]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
//    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; //直接定义好了0123——15unsigned char code[17]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f};//0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; unsigned long ulData = (code[ucData3] << 16) + (code[ucData2] << 8)+ code[ucData1];ulData += (ucDot&1)<<23; //个位ulData += (ucDot&2)<<14; //十位ulData += (ucDot&4)<<5;  //百位/*SER(串行数据输入)--PA1 SCK(移位时钟)    --PA3 RCK(输出锁存)   --PA2*/for(i=0; i<24; i++){if(ulData & 0x800000)						//0x800000   24  三个八位GPIO_SetBits(GPIOA, GPIO_Pin_1);			// PA1(SER)=1elseGPIO_ResetBits(GPIOA, GPIO_Pin_1);		// PA1(SER)=0ulData <<= 1;GPIO_SetBits(GPIOA, GPIO_Pin_3);			// PA3(SCK)=1GPIO_ResetBits(GPIOA, GPIO_Pin_3);			// PA3(SCK)=0}GPIO_SetBits(GPIOA, GPIO_Pin_2);				// PA2(RCK)=1GPIO_ResetBits(GPIOA, GPIO_Pin_2);			// PA2(RCK)=0
}

说明:void SEG_Init(void) 此函数初始化锁存器的三个引脚分别对应

SER(串行数据输入)SCK(移位时钟)RCK(输出锁存)
PA1PA3PA2

SEG_Disp() 函数中code[17]数组中直接定义好了数码管的数字显示,直接调用

ucData1 ucData2 ucData3 分别对应数码管最左边,中间,最右边位的数码管
ucDot 定义了数码管右下角的小数点,按照二进制的思想取数可取数0-7

完整工程下载>>GitHub

选择第3个工程

作者:江多多(在校学生)
版权所有,欢迎保留原文链接进行转载:)

不忘初心,牢记使命,励志成为一名优秀的嵌入式工程师! (我的第三篇博客)


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

相关文章

51单片机0-99秒表计数器+60秒倒计时(数码管两位数)

51秒表计数器倒计时&#xff08;数码管两位数&#xff09; 一&#xff1a;简介 我们实践的效果是用数码管显示0~99并在按下“转换键”后&#xff0c;实现60秒倒计时&#xff0c;并用蜂鸣器报警提示&#xff0c;兼并计数器和倒计时两种功能。 主要内容包括&#xff1a; 1.认识数…

使用定时器按键扫描数码管制作一个可存储数据的秒表

目录 1.前言 1.1实验现象 1.2 项目资源 2.主要程序及解释 2.1中断中进行按键扫描 2.2 中断中进行数码管扫描 2.3中断中进行秒表的驱动 2.4主函数 1.前言 1.1实验现象 实验现象&#xff1a;按下K1并松开按键秒表开始计时&#xff0c;按下K2并松开按键秒表停止计时&…

【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。

LCD1602显示字符和时间是最基本的实验&#xff0c;在综合前面所学知识并结合c语言程序设计&#xff0c;就可以通过独立按键&#xff0c;来对时间进行校准&#xff0c;计时等功能、或者通过矩阵键盘的按键进行输入&#xff0c;进而让LCD屏上显示的出我们想要的内容和效果。应实验…

KST-51单片机:c语言编程实现数码管动态显示秒表的倒计时

/*60S倒计时*/ /*个位每1S变一次&#xff0c;从0&#xff5e;9*/ /*十位,个位为0的下一秒十位发生变化*/#include<reg52.h>sbit ADDR0P1^0; sbit ADDR1P1^1; sbit ADDR2P1^2; sbit ADDR3P1^3; sbit ENLEDP1^4;unsigned char code LedChar[] { 0xC0,0xF9,0xA4,0xB0,0x99,0…

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

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

android手机时钟、闹钟、计时器、秒表app源码

简 介 此多功能闹钟界面采用TabHost框架&#xff0c;头部包含分别用LinearLayout水平布局显示四个标签闹钟&#xff0c;时钟&#xff0c;计时器和秒表&#xff0c;FrameLayout框架内部采用LinearLayout垂直布局。功能事件的基本实现分别有AlarmView类&#xff0c;AlarmReceiver…

60秒倒计时器 秒表 c语言程序,用单片机设计一个两位LED显示的秒表,按下计时键时,进行60s倒计时显示...

满意答案 w86586tk3y 2017.09.25 采纳率&#xff1a;57% 等级&#xff1a;8 已帮助&#xff1a;214人 #include sbit P3_5 P3^5; unsigned char code dispcode[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; unsigned char …

verilog秒表计时器

本设计是使用verilog实现秒表计时器。 秒表指示的时间由nexys4 DDR开发板的8个数码管显示,从左到右数码管的前两个显示小时(范围0-24),第3-4个数码管显示分(范围0-59,计数到60,向小时位进1),第5-6个数码管显示秒(范围0-59,计数到60向分位进1),第7-8个数码管显示毫…