单片机倒计时
时间: 2023-07-24 14:04:59 浏览: 47
单片机倒计时可以通过定时器来实现。以下是基于STM32单片机的示例代码:
```c
#include "stm32f4xx.h"
void Delay_ms(uint32_t nTime);
int main(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; //使能GPIOD时钟
GPIOD->MODER &= ~(GPIO_MODER_MODE15_1 | GPIO_MODER_MODE14_1 | GPIO_MODER_MODE13_1 | GPIO_MODER_MODE12_1); //清零PD15~12的位
GPIOD->MODER |= (GPIO_MODER_MODE15_0 | GPIO_MODER_MODE14_0 | GPIO_MODER_MODE13_0 | GPIO_MODER_MODE12_0); //PD15~12设置为输出模式
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2时钟
TIM2->PSC = 8399; //预分频系数
TIM2->ARR = 999; //自动重装值
TIM2->DIER |= TIM_DIER_UIE; //使能更新中断
NVIC_EnableIRQ(TIM2_IRQn); //使能TIM2中断
TIM2->CR1 |= TIM_CR1_CEN; //使能TIM2
while(1) {}
}
void Delay_ms(uint32_t nTime)
{
uint32_t i;
SysTick->LOAD = 168000; //10ms中断一次
SysTick->VAL = 0;
SysTick->CTRL = 0x01;
for(i=0; i<nTime; i++)
{
while(!(SysTick->CTRL & 0x10000));
}
SysTick->CTRL = 0;
}
void TIM2_IRQHandler(void)
{
static uint32_t cnt = 100; //倒计时100s
TIM2->SR &= ~TIM_SR_UIF; //清除更新中断标志位
if(cnt > 0)
{
cnt--;
GPIOD->ODR = cnt & 0x0F; //PD15~12显示倒计时的个位数字
}
else
{
TIM2->CR1 &= ~TIM_CR1_CEN; //关闭TIM2
}
}
```
该代码使用TIM2定时器,每隔1s触发一次更新中断,并通过PD15~12输出倒计时的个位数字。倒计时的总时间为100s,可以根据需要修改。同时,Delay_ms函数可以用于延时等操作。