找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1776|回复: 1
收起左侧

基于stm32的车流量统计keil实现 源程序

[复制链接]
ID:842909 发表于 2020-11-13 03:19 | 显示全部楼层 |阅读模式
这是基于stm32的通过频率比较法来进行车流量统计的设计

单片机源程序如下:
  1. /*********************************************************
  2. 脉冲输入 --> PA0 (TIM8_ETR)
  3. 按键清零 --> KEY0按键,按一下变量SUM清零
  4. 程序原理:使用定时器8的ETR测量脉冲的个数,使用滴答定时器1秒精确延时
  5. 得出频率,并和上次的频率值比较,程序默认是数值比较,即两次的频率绝对值
  6. 大于FrqValThr即设定的1KHZ,则计数加1,同时液晶显示上次和当前的脉冲频率
  7. 单位HZ,以及显示不同的字符串"Over"和"Normal";
  8. 如果按下了KEY0按键,则计数自动清零;

  9. 如果想改成1秒内的变化率,则while循环里改成Check_Frq_Ch(0)即可
  10. 即成了两次测量差值绝对值和当前频率的比值,也就是变化率,如果超出
  11. FrqPerThr 即设定的0.1,则自动加1
  12. ***************************************************/
  13. #include "led.h"
  14. #include "delay.h"
  15. #include "sys.h"
  16. #include "usart.h"
  17. #include "lcd.h"
  18. #include "Key.h"
  19. #define FrqValThr   200
  20. #define FrqPerThr   0.1
  21. #define ABS(x) ((x)>=0?(x):(-(x)))
  22. #define BEEP PBout(8)        // BEEP,蜂鸣器接口                  
  23. u16 Sum;
  24. u16 NowFrq;//当前的频率
  25. u16 PrvFrq=65535;//上次的频率
  26. u8 ErrF;
  27. u8 KeyF;
  28. void TIM8_ETR_GetDropCounts_Configuration(void);
  29. void Check_Frq_Ch(u8 Cmpr);
  30. void Measr_PlusFrq(void);
  31. void Show_Data_LCD(u16 PFrq,u16 NFrq,u16 tSum);
  32. void BEEP_Init(void);       
  33. int main(void)
  34. {         
  35.         delay_init();                     //延时函数初始化       
  36.   TIM8_ETR_GetDropCounts_Configuration();
  37.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  38.         uart_init(115200);                 //串口初始化为115200
  39.         LED_Init();                             //LED端口初始化
  40.         LCD_Init();
  41.         POINT_COLOR=RED;
  42.         LCD_Clear(WHITE);
  43.           while(1)
  44.         {                 
  45.                 Measr_PlusFrq();//测量频率
  46.                 Show_Data_LCD(PrvFrq,NowFrq,Sum);//显示数值
  47.                 LED0=!LED0;         
  48.                 Check_Frq_Ch(1);//默认数值比较
  49.                 KEY_Handle();               
  50.                 delay_ms(1000);       

  51.         }
  52. }
  53. /*******************************************************************************
  54. * 函数名          : Show_Data_LCD(float Data1,float Data2,float Data3,float Data4)
  55. * 函数描述  : 液晶屏显示数据 温度 湿度 PM2.5  
  56. *******************************************************************************/
  57. void Show_Data_LCD(u16 PFrq,u16 NFrq,u16 tSum)
  58. {
  59.           char Data1Buff[20]="";
  60.           char Data2Buff[20]="";
  61.           char Data3Buff[20]="";
  62.     LCD_Clear(WHITE);//设置背景颜色白色
  63.           sprintf(Data1Buff,"%s%d%s","PrvF :  ",PFrq," HZ");        //显示上次的HZ
  64.           sprintf(Data2Buff,"%s%d%s","NowF  :  ",NFrq," HZ");        //显示当前的HZ
  65.           sprintf(Data3Buff,"%s%d%s","Sum:  ",tSum," Tik");        //显示变量
  66.                 LCD_ShowString(30,40,210,24,24,Data1Buff);
  67.                 LCD_ShowString(30,70,200,16,16,Data2Buff);
  68.                 LCD_ShowString(30,90,200,16,16,Data3Buff);
  69.           if( ErrF)
  70.                 {
  71.                         LCD_ShowString(30,130,200,12,12,"Over");
  72.                         BEEP=1;   
  73.                 }
  74.           if(!ErrF)
  75.                 {
  76.                         LCD_ShowString(30,130,200,12,12,"Normal");
  77.                         BEEP=0;
  78.     }                       
  79. }
  80. /*******************************************************************************
  81. * 函数名                  : TIM8_ETR
  82. * 函数描述            : 使8 PA0的外部脉冲计数
  83. *******************************************************************************/
  84. void TIM8_ETR_GetDropCounts_Configuration(void)
  85. {        
  86.                 GPIO_InitTypeDef GPIO_InitStructure;
  87.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  88.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM8, ENABLE);        //时钟
  89.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0 为浮空输入
  90.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  91.                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  92.                 TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
  93.                 TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
  94.                 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  95.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  96.                 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);  // Time base configuration
  97.                 TIM_ETRClockMode2Config(TIM8, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);  //不反相
  98.                 TIM_SetCounter(TIM8, 0);   
  99.                 TIM_Cmd(TIM8, ENABLE);        
  100. }
  101. /*******************************************************************************
  102. * 函数名                  : Measr_PlusFrq(void)
  103. * 函数描述            : 测量当前的频率
  104. *******************************************************************************/
  105. void Measr_PlusFrq(void)
  106. {
  107.   TIM_SetCounter(TIM8, 0);
  108.         delay_ms(1000);       
  109.         NowFrq=TIM_GetCounter(TIM8);  //获取计数值
  110. }
  111. /*******************************************************************************
  112. * 函数名                  : Check_Frq_Ch(void)
  113. * 函数描述            : 检查频率的变化 Cmpr=1 数值比较  Cmpr=0 比值比较
  114. *******************************************************************************/
  115. void Check_Frq_Ch(u8 Cmpr)
  116. {
  117.   if(NowFrq-PrvFrq>=FrqValThr && Cmpr)
  118.   {
  119.           Sum++;
  120.                 ErrF=1;
  121.         }
  122.   if(NowFrq-PrvFrq<FrqValThr && Cmpr)
  123.         {
  124.           ErrF=0;
  125.         }
  126.         if(KeyF)
  127.         {
  128.           KeyF=0;
  129.                 Sum=0;
  130.         }       
  131.   if(ABS(NowFrq-PrvFrq)/NowFrq>=FrqPerThr && !Cmpr)
  132.   {
  133.           Sum++;
  134.         }
  135.   if(ABS(NowFrq-PrvFrq)/NowFrq<FrqPerThr && !Cmpr)
  136.   {
  137.           ErrF=0;
  138.         }
  139.         PrvFrq=NowFrq;
  140. }


  141. /*******************************************************************************
  142. * 函数名                  : BEEP_Init(void)
  143. * 函数描述            : 蜂鸣器初始化
  144. *******************************************************************************/

  145. void BEEP_Init(void)
  146. {
  147. GPIO_InitTypeDef  GPIO_InitStructure;
  148. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能GPIOB端口时钟
  149. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                 //BEEP-->PB.8 端口配置
  150. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  151. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速度为50MHz
  152. GPIO_Init(GPIOB, &GPIO_InitStructure);         //根据参数初始化GPIOB.8
  153. GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出

  154. }
复制代码

所有资料51hei提供下载:
STM32_MAIN_BEEP.7z (223.59 KB, 下载次数: 16)
回复

使用道具 举报

ID:1 发表于 2020-11-13 22:07 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表