stm32 2位数码管动态显示实现30秒倒计时
时间: 2023-06-20 07:05:30 浏览: 1724
以下是基于STM32的2位数码管动态显示实现30秒倒计时的代码:
```c
#include "stm32f10x.h"
#include "delay.h"
#define DIG1 GPIO_Pin_0
#define DIG2 GPIO_Pin_1
#define SEG_A GPIO_Pin_2
#define SEG_B GPIO_Pin_3
#define SEG_C GPIO_Pin_4
#define SEG_D GPIO_Pin_5
#define SEG_E GPIO_Pin_6
#define SEG_F GPIO_Pin_7
#define SEG_G GPIO_Pin_8
#define SEG_DP GPIO_Pin_9
void GPIO_Config(void);
void TIM_Config(void);
void Display(uint8_t num);
void Delay_us(uint32_t nTime);
volatile uint16_t counter = 3000; // 30秒,每个计数器时间间隔为10ms
int main(void)
{
GPIO_Config();
TIM_Config();
while (1)
{
Display(counter / 100); // 显示百位数码管
GPIO_SetBits(GPIOB, DIG1); // 打开百位数码管
GPIO_ResetBits(GPIOB, DIG2); // 关闭十位数码管
Delay_us(5000);
GPIO_ResetBits(GPIOB, DIG1); // 关闭百位数码管
GPIO_SetBits(GPIOB, DIG2); // 打开十位数码管
Display(counter % 100); // 显示十位数码管
Delay_us(5000);
if (counter == 0) // 计数器倒计时完毕,退出循环
{
break;
}
}
while (1); // 程序结束
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = DIG1 | DIG2 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999; // 计时器最大计数值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 计时器预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能计时器更新中断
TIM_Cmd(TIM3, ENABLE); // 启动计时器
NVIC_EnableIRQ(TIM3_IRQn); // 使能TIM3中断
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
counter--; // 计数器每10ms减1
}
}
void Display(uint8_t num)
{
switch (num)
{
case 0:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F);
GPIO_ResetBits(GPIOB, SEG_G);
break;
case 1:
GPIO_SetBits(GPIOB, SEG_B | SEG_C);
GPIO_ResetBits(GPIOB, SEG_A | SEG_D | SEG_E | SEG_F | SEG_G);
break;
case 2:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_D | SEG_E | SEG_G);
GPIO_ResetBits(GPIOB, SEG_C | SEG_F);
break;
case 3:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_G);
GPIO_ResetBits(GPIOB, SEG_E | SEG_F);
break;
case 4:
GPIO_SetBits(GPIOB, SEG_B | SEG_C | SEG_F | SEG_G);
GPIO_ResetBits(GPIOB, SEG_A | SEG_D | SEG_E);
break;
case 5:
GPIO_SetBits(GPIOB, SEG_A | SEG_C | SEG_D | SEG_F | SEG_G);
GPIO_ResetBits(GPIOB, SEG_B | SEG_E);
break;
case 6:
GPIO_SetBits(GPIOB, SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G);
GPIO_ResetBits(GPIOB, SEG_B);
break;
case 7:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C);
GPIO_ResetBits(GPIOB, SEG_D | SEG_E | SEG_F | SEG_G);
break;
case 8:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G);
break;
case 9:
GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G);
GPIO_ResetBits(GPIOB, SEG_E);
break;
default:
break;
}
}
void Delay_us(uint32_t nTime)
{
while (nTime--)
{
__NOP(); // 空操作,用于消耗时间
}
}
```
具体实现方法是借助STM32的TIM3计时器,每隔10ms触发一次计时器中断,计数器减1,倒计时30秒。在主函数中,通过动态显示百位和十位数码管,实现倒计时的效果。每个数码管的动态显示时间间隔为5ms,通过Delay_us函数实现延时。
阅读全文