通过TIM2定时器中断控制LED流水灯的闪烁时间,并且增加两个按键PA1、PA2,其中PA1控制LED流水灯的启动,8个灯先依次闪烁,时间间隔1s,然后8个灯同时闪烁且时间间隔1s,PA2控制停止,使定时器不工作,将灯保持现在状态,过程非常简单,只需几分钟搞懂。
电路原理图如下:
单片机源程序如下:
- #include "stm32f10x.h"
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- void TIM2_Config(void);//定时器TIM2配置函数
- void EXTI1_EXTI2_Config(void);//按键PA1、PA2中断配置函数
- int main(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2| GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- TIM2_Config();
- EXTI1_EXTI2_Config();
- GPIOC->ODR=0x00ff;
- while (1)
- {
- }
- }
- void TIM2_Config(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//proteus中的bug,用其他定时器,必须先使能TIM1。
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
- TIM_TimeBaseStructure.TIM_Period = 1000;//基准为0.1ms,所以设置10000,刚好0.1ms乘以10000为1s。
- TIM_TimeBaseStructure.TIM_Prescaler = 799;//我们设置的proteus中系统时钟为8M,所以这里设置799,我们时间间隔为1s。
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
- // TIM_Cmd(TIM2, ENABLE);不是使能TIM2,因为用中断,所以在PA1、PA2中断函数中分别使能和不使能。
-
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//定时器中断使能。
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- void EXTI1_EXTI2_Config(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2);
-
- EXTI_InitStructure.EXTI_Line = EXTI_Line1|EXTI_Line2;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
复制代码
所有资料51hei附件下载:
Keil代码工程.7z
(3.64 MB, 下载次数: 20)
|