对射式红外传感器计次
CountSensor.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | uint16_t CountSensor_Count; void CountSensor_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO外设 //EXTI和NVIC外设为默认开启,无需手动开启 //配置GPIO外设 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,默认高电平 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置AFIO外设 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line14; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发 EXTI_Init(&EXTI_InitStructure); //配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个芯片只执行一次,即整个工程只运行一次此代码 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure);} uint16_t CountSensor_Get(void){ return CountSensor_Count;} void EXTI15_10_IRQHandler(void){ if (EXTI_GetITStatus(EXTI_Line14) == SET) { CountSensor_Count++;//触发中断,加1 EXTI_ClearITPendingBit(EXTI_Line14);//清除中断 }} |
mian.c
123456789101112131415161718 | int main(void){ OLED_Init();//初始化OLED CountSensor_Init();//初始化传感器 OLED_ShowString(1,1,"Count:"); while(1) { OLED_ShowNum(1,7,CountSensor_Get(),5);//调用CountSensor_Get()函数,得到计次值 }} |
旋转编码器计次
Encoder.c
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | int16_t Encoder_Count; void Encoder_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO外设 //EXTI和NVIC外设为默认开启 //配置GPIO外设 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,默认高电平 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置AFIO外设 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure); //配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个芯片只执行一次,即整个工程只运行一次此代码 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&NVIC_InitStructure);} int16_t Encoder_Get(void){ int16_t Temp; Temp = Encoder_Count; Encoder_Count = 0; return Temp;} void EXTI0_IRQHandler(void)//反转{ if (EXTI_GetITStatus(EXTI_Line0) == SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0) { Encoder_Count--; } EXTI_ClearITPendingBit(EXTI_Line0); }} void EXTI1_IRQHandler(void)//正传{ if (EXTI_GetITStatus(EXTI_Line1) == SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0) { Encoder_Count++; } EXTI_ClearITPendingBit(EXTI_Line1); }} |