标题:
基于stm32的车流量统计keil实现 源程序
[打印本页]
作者:
wangyan232
时间:
2020-11-13 03:19
标题:
基于stm32的车流量统计keil实现 源程序
这是基于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)
2020-11-13 22:03 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2020-11-13 22:07
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1