找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2479|回復: 1
收起左側

基于stm32的車流量統(tǒng)計keil實現(xiàn) 源程序

[復制鏈接]
ID:842909 發(fā)表于 2020-11-13 03:19 | 顯示全部樓層 |閱讀模式
這是基于stm32的通過頻率比較法來進行車流量統(tǒng)計的設計

單片機源程序如下:
  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循環(huán)里改成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位搶占優(yōu)先級,2位響應優(yōu)先級
  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 發(fā)表于 2020-11-13 22:07 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表