|
這是基于stm32的通過頻率比較法來進(jìn)行車流量統(tǒng)計的設(shè)計
單片機(jī)源程序如下:
- /*********************************************************
- 脈沖輸入 --> PA0 (TIM8_ETR)
- 按鍵清零 --> KEY0按鍵,按一下變量SUM清零
- 程序原理:使用定時器8的ETR測量脈沖的個數(shù),使用滴答定時器1秒精確延時
- 得出頻率,并和上次的頻率值比較,程序默認(rèn)是數(shù)值比較,即兩次的頻率絕對值
- 大于FrqValThr即設(shè)定的1KHZ,則計數(shù)加1,同時液晶顯示上次和當(dāng)前的脈沖頻率
- 單位HZ,以及顯示不同的字符串"Over"和"Normal";
- 如果按下了KEY0按鍵,則計數(shù)自動清零;
-
- 如果想改成1秒內(nèi)的變化率,則while循環(huán)里改成Check_Frq_Ch(0)即可
- 即成了兩次測量差值絕對值和當(dāng)前頻率的比值,也就是變化率,如果超出
- FrqPerThr 即設(shè)定的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;//當(dāng)前的頻率
- 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(); //延時函數(shù)初始化
- TIM8_ETR_GetDropCounts_Configuration();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- 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);//顯示數(shù)值
- LED0=!LED0;
- Check_Frq_Ch(1);//默認(rèn)數(shù)值比較
- KEY_Handle();
- delay_ms(1000);
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : Show_Data_LCD(float Data1,float Data2,float Data3,float Data4)
- * 函數(shù)描述 : 液晶屏顯示數(shù)據(jù) 溫度 濕度 PM2.5
- *******************************************************************************/
- void Show_Data_LCD(u16 PFrq,u16 NFrq,u16 tSum)
- {
- char Data1Buff[20]="";
- char Data2Buff[20]="";
- char Data3Buff[20]="";
- LCD_Clear(WHITE);//設(shè)置背景顏色白色
- sprintf(Data1Buff,"%s%d%s","PrvF : ",PFrq," HZ"); //顯示上次的HZ
- sprintf(Data2Buff,"%s%d%s","NowF : ",NFrq," HZ"); //顯示當(dāng)前的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;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : TIM8_ETR
- * 函數(shù)描述 : 使8 PA0的外部脈沖計數(shù)
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : Measr_PlusFrq(void)
- * 函數(shù)描述 : 測量當(dāng)前的頻率
- *******************************************************************************/
- void Measr_PlusFrq(void)
- {
- TIM_SetCounter(TIM8, 0);
- delay_ms(1000);
- NowFrq=TIM_GetCounter(TIM8); //獲取計數(shù)值
- }
- /*******************************************************************************
- * 函數(shù)名 : Check_Frq_Ch(void)
- * 函數(shù)描述 : 檢查頻率的變化 Cmpr=1 數(shù)值比較 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;
- }
- /*******************************************************************************
- * 函數(shù)名 : BEEP_Init(void)
- * 函數(shù)描述 : 蜂鳴器初始化
- *******************************************************************************/
- 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); //根據(jù)參數(shù)初始化GPIOB.8
- GPIO_ResetBits(GPIOB,GPIO_Pin_8);//輸出0,關(guān)閉蜂鳴器輸出
- }
復(fù)制代碼
所有資料51hei提供下載:
STM32_MAIN_BEEP.7z
(223.59 KB, 下載次數(shù): 16)
2020-11-13 22:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|