请写出一段代码用STM32f1单片机实现对方波信号的频率测量并且将频率显示在lcd屏幕上
时间: 2024-06-08 18:09:43 浏览: 13
以下代码基于STM32F103C8T6单片机,使用TIM2来捕获对方波信号的上升沿和下降沿,通过计算两个时间差来得到频率,最后将频率显示在LCD屏幕上。
```c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "delay.h"
#include "lcd.h"
int main(void)
{
uint16_t capture1 = 0;
uint16_t capture2 = 0;
float frequency = 0;
char freq_str[16];
// 初始化系统时钟为72MHz
SystemInit();
// 初始化延时函数
delay_init();
// 初始化LCD屏幕
LCD_Init();
// 初始化TIM2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
// 初始化TIM2通道1和通道2用于捕获对方波信号
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
// 启动TIM2计数器
TIM_Cmd(TIM2, ENABLE);
while (1)
{
// 等待第一个捕获事件的发生
while (TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1) == RESET);
// 记录第一个捕获事件的时间
capture1 = TIM_GetCapture1(TIM2);
// 清除第一个捕获事件的标志位
TIM_ClearFlag(TIM2, TIM_FLAG_CC1);
// 等待第二个捕获事件的发生
while (TIM_GetFlagStatus(TIM2, TIM_FLAG_CC2) == RESET);
// 记录第二个捕获事件的时间
capture2 = TIM_GetCapture2(TIM2);
// 清除第二个捕获事件的标志位
TIM_ClearFlag(TIM2, TIM_FLAG_CC2);
// 计算频率并将结果转换为字符串
frequency = (float)72000000 / (float)(capture2 - capture1);
sprintf(freq_str, "Freq: %.2f Hz", frequency);
// 在LCD屏幕上显示频率
LCD_Clear();
LCD_WriteString(0, 0, freq_str);
// 延时一段时间
delay_ms(500);
}
}
```