高中生
最后登录1970-1-1
在线时间 小时
注册时间2021-1-26
|
楼主 |
发表于 2021-3-2 11:59:41
|
显示全部楼层
我一开始设定了一个最低值,我想通过按键来控制这个最低值,从而控制超声波声光报警的极限
我程序写出来了,没有错误和警告,但是串口调试助手直接什么也不显示了,LED和蜂鸣器也没工作,测距也没显示。
按键设置如下
#include "bsp_key.h"
void KEY1_GPIO_Config(void)
{
GPIO_InitTypeDef KEY1_GPIO_InitStruct;
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
KEY1_GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
KEY1_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空
GPIO_Init(KEY1_GPIO_PORT,&KEY1_GPIO_InitStruct);
}
void KEY2_GPIO_Config(void)
{
GPIO_InitTypeDef KEY2_GPIO_InitStruct;
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
KEY2_GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
KEY2_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT,&KEY2_GPIO_InitStruct);
}
//Key_Scan是按键扫描,括号里是被扫描的端口和被扫描端口的引脚
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) //因为存在return,所以为uint8_t开头,
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//松手检测
return KEY_ON;
}
else return KEY_OFF;
}
//超声波测距模块,UltrasonicWave_Configuration()函数
//初始化超声模块,UltrasonicWave_StartMeasure()函数
//启动测距,并将测得的数据通过串口1打印出来
//实验平台:野火STM32开发板
//硬件连接
//PC - TRIG
//PC9 - ECHO
#include "UltrasonicWave.h"
#include "usart1.h"
#include "TIM2.h"
#include "bsp_beep.h"
#include "bsp_led.h"
#include "bsp_key.h"
unsigned short int Dis_up = 20; //距离上限 默认20cm
unsigned short int UltrasonicWave_Distance; //计算出的距离
void DelayTime_us(int Time)
{
unsigned char i;
for ( ; Time>0; Time--)
for ( i = 0; i < 72; i++ );
}
//超声波模块的初始化
void UltrasonicWave_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(TRIG_GPIO_CLK , ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG_PIN; //PC8接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure); //初始化发送GPIO
GPIO_InitStructure.GPIO_Pin = ECHO_PIN; //PC9接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化接受GPIO
}
//计算距离
void UltrasonicWave_CalculateTime(void)
{
UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/2000;//距离计算公式
}
//开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
//启动超声波模块
void UltrasonicWave_StartMeasure(void)
{
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送>10US的高电平
DelayTime_us(20); //延时20US
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待高电平
TIM_Cmd(TIM2, ENABLE); //开启时钟
while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待低电平
TIM_Cmd(TIM2, DISABLE); //定时器2失能
UltrasonicWave_CalculateTime(); //计算距离
TIM_SetCounter(TIM2,0); //定时器2清零
printf("\r\ndistance:%d%d cm\r\n",UltrasonicWave_Distance/256,UltrasonicWave_Distance%256);
if ( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == ((uint8_t)KEY_ON))
{
Dis_up--;
if( UltrasonicWave_Distance<Dis_up)
{
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
GPIO_SetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
}
else
{
GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //关报警标志位
GPIO_ResetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
}
}
if ( Key_Scan(KEY2_GPIO_PORT,KEY1_GPIO_PIN) == ((uint8_t)KEY_ON))
{
Dis_up++;
if( UltrasonicWave_Distance<Dis_up)
{
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
GPIO_SetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
}
else
{
GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
GPIO_ResetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
}
}
}
|
|