显示网站建设精美页面,网站关键词,html怎么制作网页,做AMC12的题的网站对射式红外传感器1.1 接线图VCC GND分别接电源的正负极DO数字输出端#xff0c;随意选择一个GPIO口1.2 硬件原理当挡光片或者编码盘在对射式红外传感器中间经过时#xff0c;DO就会输出电平变化信号#xff0c;电平跳变信号触发STM32 PB14号口中断#xff0c;在中断函数中执…对射式红外传感器1.1 接线图VCC GND分别接电源的正负极DO数字输出端随意选择一个GPIO口1.2 硬件原理当挡光片或者编码盘在对射式红外传感器中间经过时DO就会输出电平变化信号电平跳变信号触发STM32 PB14号口中断在中断函数中执行变量程序并在主循环里调用OLED中显示变量。1.3 设计思路本次设计采用模块化编程分为CountSensor.c、CountSensor.h、main.c三部分。先进行初始化 EXTI中断)配置1. 第⼀步配置RCC把所涉及到的外设时钟都打开 GPIOB,AFIO(NVIC,EXTI无需打开) 2. 第⼆步配置GPIO选择端口为输⼊模式 3. 第三步配置AFIO选择使⽤的⼀路GPIO连接到EXTI 4. 第四步配置EXTI选择边沿触发⽅式选择触发响应⽅式 5. 第五步配置NVIC给中断选择⼀个合适的优先级 最后通过NVIC外部中断信号进入CPU,CPU收到中断信号跳转到中断函数里执行中断程序。EXTI和NVIC时钟默认是打开的NVIC是内核的外设内核的外设都不需要开启时钟RCC 管的都是内核外的外设1.4 知识储备 AFIO复位AFIO外设void GPIO_AFIODeInit(void);锁定GPIO配置函数锁定引脚的配置防⽌意外更改void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);配置AFIO的事件输出功能函数void GPIO_EventOutputConfig(uint8_t GPIO_PortSource,uint8_tGPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);引脚重映射函数void GPIO_PinRemapConfig(uint32_t GPIO_Remap,FunctionalStateNewState);配置AFIO的数据选择器通过配置AFIO数据选择器选择中断引脚。void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_tGPIO_PinSource);恢复上电默认的状态函数void EXTI_DeInit(void);1.5 知识储备EXTI清除EXTI配置恢复上电默认的状态函数 void EXTI_DeInit(void);根据结构体配置EXTI外设函数void EXTI_Init(EXTI_InitTypedef* EXTI_InitStruct);给传⼊的结构体参数赋⼀个默认值函数void EXTI_StructInit(EXTI_InitTypedef* EXTI_InitStruct);软件触发外部中断函数调用函数参数给⼀个指定的中断线就能软件触发⼀次这个外部中断void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);下面四个是库函数的模板函数在主程序里查看和清除标志位用下面两个函数获取指定的标志位是否被置1 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);对置1的标志位进⾏清除函数void EXTI_ClearFlag(uint32_t EXTI_Line);在中断函数里查看和清除标志位用下面两个在中断函数中获取标志位函数ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);清除中断挂起标志位函数void EXTI_ClearITPendingBit(uint32_t EXTI_Line);1.6 知识储备NVIC中断分组函数 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);根据结构体⾥⾯的参数初始化NVIC函数void NVIC_Init(NVIC_InitTypedef* NVIC_InitStruct);设置中断向量表函数 NVIC_SetVectorTable函数的功能是设置向量表的位置和偏移。其中输⼊参数中对于32位 的OFFSET向量表基地址的偏移量对于FLASH参数值必须⾼于0x08000100对于RAM必 须⾼于0X100 void NVIC_SetVectorTable(uint8_t NVIC_VectTab,uint32_t Offset);系统低功耗配置函数 void NVIC_SystemLPConfig(uint8_t LowPowerMode,FunctionalStateNewState)注意中断函数要简短快速不要在中断中执⾏Delay 1.7 程序设计CountSensor.c#include stm32f10x.h // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO的时钟//配置GPIOGPIO_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);//配置参数//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//配置AFIO外部中断引脚选择//配置EXTIEXTI_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_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体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)//中断标志位判断是否为1{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) 0){CountSensor_Count ;//统计中断返回次数}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}
CountSensor.h#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif
main.c#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include CountSensor.hint main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, Count:);/1行1列显示Count:while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);//一行七列显示返回次数长度为5}
}
2. 旋转编码器计次2.1 接线图VCC GND接正负极AB相输出引脚接到STM32的PB0和PB1引脚。2.2 设计思路本设计采用模块化编程分为Encoder.c、Encoder.h、mian.c三部分。2.3 程序设计Encoder.c#include stm32f10x.h // Device headerint16_t Encoder_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO的时钟//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;//定义初始化结构体GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 |GPIO_Pin_1;//开启引脚GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//设置响应速度GPIO_Init(GPIOB, GPIO_InitStructure);//配置参数//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//配置AFIO外部中断引脚选择GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); //配置EXTIEXTI_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_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体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;//定义临时变量方便Count清零Temp Encoder_Count;Encoder_Count 0;return Temp;
}void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) SET)//中断标志位判断是否为1{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) 0)//读取输入高低电平{if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0){Encoder_Count --;}}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}void EXTI1_IRQHandler(void)//线路1中断函数
{if (EXTI_GetITStatus(EXTI_Line14) SET)//中断标志位判断是否为1{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0)//读取输⼊⾼低电平{if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) 0){Encoder_Count ;}}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}
Encoder.h#ifndef __ENCODER_H
#define __ENCODER_Hvoid Encoder_Init(void);
int16_t Encoder_Get(void);#endif
main.c#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Encoder.hint16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1, 1, Num:);while (1){Num Encoder_Get();OLED_ShowSignedNum(1, 5, Num, 5);}
}
完