新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2018-4-3
- 在线时间
- 0 小时
|
1金钱
买的是鸥鹏灭火机器人套件超声波模块是HC-SR04
下面是他给的引脚和接线图
 
我只按照说明接了前超声波,这个是串口测试结果

求大神告知哪里出了问题
下面附上测试程序
*********************************************************************
* 文件名 : main.c
* 作者 : Losingamong
* 生成日期 : 14/09/2010
* 描述 : 主程序
********************************************************************************/
/* 头文件 ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
#include "stdio.h"
/* 自定义同义关键字 --------------------------------------------------------*/
/* 自定义参数宏 --------------------------------------------------------*/
/* 自定义函数宏 --------------------------------------------------------*/
/* 自定义全局变量 --------------------------------------------------------*/
/* 自定义函数声明 --------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void delay_nus(unsigned long n) //延时n us: n>=6,最小延时单位6us
{
unsigned long j;
while(n--) // 外部晶振:8M;PLL:9;8M*9=72MHz
{
j=8; // 微调参数,保证延时的精度
while(j--);
}
}
void delay_nms(unsigned long n) //延时n ms
{
while(n--) // 外部晶振:8M;PLL:9;8M*9=72MHz
delay_nus(1100); // 1ms延时补偿
}
void Tim4_Init()
{
/* TIM4 Peripheral Configuration */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM4);
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 0xffff;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM4,71, TIM_PSCReloadMode_Immediate);
/* enable preload value */
TIM_ARRPreloadConfig(TIM4,DISABLE);
TIM_SetCounter(TIM4,0);
TIM_Cmd(TIM4,DISABLE);
}
int GetDis(GPIO_TypeDef * GPIO,int echo,int trig)
{
u16 dis;
u16 count;
GPIO_ResetBits(GPIO,echo);
GPIO_ResetBits(GPIO,trig);
Tim4_Init();
GPIO_SetBits(GPIO,trig); //trig置高 发出10us的高电平信号
delay_nus(10);
GPIO_ResetBits(GPIO,trig);
while(GPIO_ReadInputDataBit(GPIO, echo) == 0);
TIM_Cmd(TIM4,ENABLE); //开启计数器
//开启定时器开始计时
while(GPIO_ReadInputDataBit(GPIO, echo)); //等待echo置低
TIM_Cmd(TIM4,DISABLE); //关闭计数器
count = TIM_GetCounter(TIM4);//获取计数器值
dis = count/5.88;//转换为距离,即29.034us超声波能传播1cm
return dis;
}
/*******************************************************************************
* 函数名 : main
* 函数描述 : 主函数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
int main(void)
{
int distance ;
Tim4_Init();
/* 设置系统时钟 */
RCC_Configuration();
/* 设置 GPIO 端口 */
GPIO_Configuration();
/* 设置 USART */
USART_Configuration();
// printf("\r\n The sonar_value is:-------------------------- \r\n");
while(1)
{
// distance=GetDis(GPIOA,GPIO_Pin_1,GPIO_Pin_0);
printf( "\r\nThe left sonar_value = %d\r\n", distance);
delay_nms(1000);
// distance=GetDis(GPIOA,GPIO_Pin_3,GPIO_Pin_2);
printf( "\r\nThe middle sonar_value = %d\r\n", distance);
delay_nms(1000);
//distance=GetDis(GPIOC,GPIO_Pin_7,GPIO_Pin_6);
printf( "\r\nThe right sonar_value = %d\r\n", distance);
delay_nms(1000);
}
}
/*******************************************************************************
* 函数名 : RCC_Configuration
* 函数描述 : 设置系统各部分时钟
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置 */
RCC_DeInit();
/* 开启 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待 HSE 起振并稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断 HSE 起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择 PCLK2 时钟源为 HCLK(AHB)1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择 PCLK1 时钟源为 HCLK(AHB)2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置 FLASH 延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能 FLASH 预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为 HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择 SYSCLK 时钟源为 PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待 PLL 成为 SYSCLK 时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 使能各个用到的外设时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
}
/*******************************************************************************
* 函数名 : GPIO_Configuration
* 函数描述 : 设置各GPIO端口功能
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
/* 定义 GPIO 初始化结构体 GPIO_InitStructure */
GPIO_InitTypeDef GPIO_InitStructure;
/* 设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 将 PB.0 设置为模拟输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB , &GPIO_InitStructure);
/* 将 PA.1 PA.3 设置为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC , &GPIO_InitStructure);
/* 将 PA.0 PA.2 设置为推挽输出脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*******************************************************************************
* 函数名 : USART_Configuration
* 函数描述 : 设置USART1
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void USART_Configuration(void)
{
/* 定义 USART 初始化结构体 USART_InitStructure */
USART_InitTypeDef USART_InitStructure;
/* 波特率为115200bps;
* 8位数据长度;
* 1个停止位,无校验;
* 禁用硬件流控制;
* 禁止USART时钟;
* 时钟极性低;
* 在第2个边沿捕获数据
* 最后一位数据的时钟脉冲不从 SCLK 输出;
*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1 , &USART_InitStructure);
/* 使能 USART1 */
USART_Cmd(USART1 , ENABLE);
}
/*******************************************************************************
* 函数名 : fputc
* 函数描述 : 将printf函数重定位到USATR1
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (u8) ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
|
|