stm32练手项目之震动感应灯

Led相关初始化:

void LED_init(void)	
{	
	GPIO_InitTypeDef led_init;
	//使能APB2 的时钟RCC
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//结构体配置	,led 低电平亮
	led_init.GPIO_Pin=GPIO_Pin_13;
	led_init.GPIO_Mode=GPIO_Mode_Out_PP;
	led_init.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&led_init);	
}

中断初始化(可以节省CPU):

void Exti_init(void)
{
		GPIO_InitTypeDef Shake_init;
	//使能GPIOA 的时钟RCC
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//GPIOA是GPIO输出端口,又要当外部中断源
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);	
	GPIO_EXTILineConfig( GPIO_PortSourceGPIOA,  GPIO_PinSource1);
	//结构体配置
	Shake_init.GPIO_Pin=GPIO_Pin_1;
	Shake_init.GPIO_Mode=GPIO_Mode_IPD;   
	Shake_init.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&Shake_init);	
	//配置外部中断
	EXTI_InitTypeDef Exti_init;
	Exti_init.EXTI_Line=EXTI_Line1;
	Exti_init.EXTI_Mode=EXTI_Mode_Interrupt;  //中断模式
	//因为震动传感器没有发生震动时是高电平,发生震动是低电平,选择下降沿触发
	Exti_init.EXTI_Trigger=EXTI_Trigger_Falling;    
	Exti_init.EXTI_LineCmd=ENABLE;
	EXTI_Init(&Exti_init);
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断分组	
	NVIC_InitTypeDef nvic_init;
	nvic_init.NVIC_IRQChannel=EXTI_Line1;
	nvic_init.NVIC_IRQChannelPreemptionPriority=1;
	nvic_init.NVIC_IRQChannelSubPriority=1;
	nvic_init.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&nvic_init);
}

继电器相关配置:

使继电器连接stm32f103的GPIOA端口的GPIO_Pin_3;

void Relay_init(void)
{
	//使能GPIOA 的时钟RCC
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);	
	//结构体配置	
	GPIO_InitTypeDef Relay_init;
	Relay_init.GPIO_Pin=GPIO_Pin_3;
	Relay_init.GPIO_Mode=GPIO_Mode_Out_PP;
	Relay_init.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&Relay_init);	
}

震动传感器相关配置:

震动传感器没有发生震动时是高电平,发生震动时是低电平

震动传感器接stm32f103的GPIOA端口的GPIO_Pin_1;

void Shake_init(void)
{
	GPIO_InitTypeDef Shake_init;
	//使能GPIOA 的时钟RCC
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//结构体配置
	Shake_init.GPIO_Pin=GPIO_Pin_1;
/*
只是做初始化电平的作用,下拉输入模式:电平默认为低电平,可以检测由低到高的电平变化
*/
	Shake_init.GPIO_Mode=GPIO_Mode_IPD;                                           
	Shake_init.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&Shake_init);
	
}

主函数逻辑及代码:

震动传感器因为没震动的时候 ,震动传感器输出的是高电平,所以可以通过去读引脚的电平来判断它是否发生震动,如果发生震动,亮灯持续一秒,关灯,如果没有发生震动则为关灯状态。

	LED_init();
	Relay_init();
	Shake_init();
    Exti_init();	
	GPIO_SetBits(GPIOA, GPIO_Pin_3);  //初始化继电器为关闭状态,关灯状态
	
	while(1)
	{		
		/*
		震动传感器:没有发生震动是高电平,发生震动是低电平     GPIOA  GPIO_Pin_1
		震动传感器:因为没震动的时候,震动传感器是输出高电平
		*/
		//使用了中断,下面这段代码就选择可以注释	
     if(GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_1)==0)  //如果发生震动
		 {
			 GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //亮灯
			 delay(1000);    //持续一秒
			 GPIO_SetBits(GPIOA, GPIO_Pin_3);
			 
		 }else{			 
			 			 GPIO_SetBits(GPIOA, GPIO_Pin_3);
			  }	
	
}

void EXTI1_IRQHandler(void)
{
	if(EXTI_GetITStatus( EXTI_Line1)  !=RESET)     //判断是否发生了中断,//发生中断则进入
	{
		
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //亮灯
		delay(1000);
		GPIO_SetBits(GPIOA, GPIO_Pin_3);
		
	}
	EXTI_ClearITPendingBit( EXTI_Line1);	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值