这是基于stm32的通过频率比较法来进行车流量统计的设计
单片机源程序如下:
- /*********************************************************
- 脉冲输入 --> PA0 (TIM8_ETR)
- 按键清零 --> KEY0按键,按一下变量SUM清零
- 程序原理:使用定时器8的ETR测量脉冲的个数,使用滴答定时器1秒精确延时
- 得出频率,并和上次的频率值比较,程序默认是数值比较,即两次的频率绝对值
- 大于FrqValThr即设定的1KHZ,则计数加1,同时液晶显示上次和当前的脉冲频率
- 单位HZ,以及显示不同的字符串"Over"和"Normal";
- 如果按下了KEY0按键,则计数自动清零;
-
- 如果想改成1秒内的变化率,则while循环里改成Check_Frq_Ch(0)即可
- 即成了两次测量差值绝对值和当前频率的比值,也就是变化率,如果超出
- FrqPerThr 即设定的0.1,则自动加1
- ***************************************************/
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "lcd.h"
- #include "Key.h"
- #define FrqValThr 200
- #define FrqPerThr 0.1
- #define ABS(x) ((x)>=0?(x):(-(x)))
- #define BEEP PBout(8) // BEEP,蜂鸣器接口
- u16 Sum;
- u16 NowFrq;//当前的频率
- u16 PrvFrq=65535;//上次的频率
- u8 ErrF;
- u8 KeyF;
- void TIM8_ETR_GetDropCounts_Configuration(void);
- void Check_Frq_Ch(u8 Cmpr);
- void Measr_PlusFrq(void);
- void Show_Data_LCD(u16 PFrq,u16 NFrq,u16 tSum);
- void BEEP_Init(void);
- int main(void)
- {
- delay_init(); //延时函数初始化
- TIM8_ETR_GetDropCounts_Configuration();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- LED_Init(); //LED端口初始化
- LCD_Init();
- POINT_COLOR=RED;
- LCD_Clear(WHITE);
- while(1)
- {
- Measr_PlusFrq();//测量频率
- Show_Data_LCD(PrvFrq,NowFrq,Sum);//显示数值
- LED0=!LED0;
- Check_Frq_Ch(1);//默认数值比较
- KEY_Handle();
- delay_ms(1000);
- }
- }
- /*******************************************************************************
- * 函数名 : Show_Data_LCD(float Data1,float Data2,float Data3,float Data4)
- * 函数描述 : 液晶屏显示数据 温度 湿度 PM2.5
- *******************************************************************************/
- void Show_Data_LCD(u16 PFrq,u16 NFrq,u16 tSum)
- {
- char Data1Buff[20]="";
- char Data2Buff[20]="";
- char Data3Buff[20]="";
- LCD_Clear(WHITE);//设置背景颜色白色
- sprintf(Data1Buff,"%s%d%s","PrvF : ",PFrq," HZ"); //显示上次的HZ
- sprintf(Data2Buff,"%s%d%s","NowF : ",NFrq," HZ"); //显示当前的HZ
- sprintf(Data3Buff,"%s%d%s","Sum: ",tSum," Tik"); //显示变量
- LCD_ShowString(30,40,210,24,24,Data1Buff);
- LCD_ShowString(30,70,200,16,16,Data2Buff);
- LCD_ShowString(30,90,200,16,16,Data3Buff);
- if( ErrF)
- {
- LCD_ShowString(30,130,200,12,12,"Over");
- BEEP=1;
- }
- if(!ErrF)
- {
- LCD_ShowString(30,130,200,12,12,"Normal");
- BEEP=0;
- }
- }
- /*******************************************************************************
- * 函数名 : TIM8_ETR
- * 函数描述 : 使8 PA0的外部脉冲计数
- *******************************************************************************/
- void TIM8_ETR_GetDropCounts_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM8, ENABLE); //时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0 为浮空输入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
- TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); // Time base configuration
- TIM_ETRClockMode2Config(TIM8, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //不反相
- TIM_SetCounter(TIM8, 0);
- TIM_Cmd(TIM8, ENABLE);
- }
- /*******************************************************************************
- * 函数名 : Measr_PlusFrq(void)
- * 函数描述 : 测量当前的频率
- *******************************************************************************/
- void Measr_PlusFrq(void)
- {
- TIM_SetCounter(TIM8, 0);
- delay_ms(1000);
- NowFrq=TIM_GetCounter(TIM8); //获取计数值
- }
- /*******************************************************************************
- * 函数名 : Check_Frq_Ch(void)
- * 函数描述 : 检查频率的变化 Cmpr=1 数值比较 Cmpr=0 比值比较
- *******************************************************************************/
- void Check_Frq_Ch(u8 Cmpr)
- {
- if(NowFrq-PrvFrq>=FrqValThr && Cmpr)
- {
- Sum++;
- ErrF=1;
- }
- if(NowFrq-PrvFrq<FrqValThr && Cmpr)
- {
- ErrF=0;
- }
- if(KeyF)
- {
- KeyF=0;
- Sum=0;
- }
- if(ABS(NowFrq-PrvFrq)/NowFrq>=FrqPerThr && !Cmpr)
- {
- Sum++;
- }
- if(ABS(NowFrq-PrvFrq)/NowFrq<FrqPerThr && !Cmpr)
- {
- ErrF=0;
- }
- PrvFrq=NowFrq;
- }
- /*******************************************************************************
- * 函数名 : BEEP_Init(void)
- * 函数描述 : 蜂鸣器初始化
- *******************************************************************************/
- void BEEP_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP-->PB.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化GPIOB.8
- GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
- }
复制代码
所有资料51hei提供下载:
STM32_MAIN_BEEP.7z
(223.59 KB, 下载次数: 16)
|