历史上的今天
今天是:2025年04月08日(星期二)
2019年04月08日 | STM32F103 超声波 串口输出数据
2019-04-08 来源:eefocus
#include "cj.h"
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
unsigned int overcount=0;
void NVIC_Config(void)//优先级设置
{
NVIC_InitTypeDef NVIC_InitStructer;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;//
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructer);
}
void CH_SR04_Init(void)//超声波模块初始化
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);//设置PB8作为触发引脚
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStructer);//设置PB9作为接受引脚
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=65534;
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //经过预分频后,计数器的值,每隔0.5us就加一。
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
//TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);//
}
float Senor_Using(void)//测距函数
{
float length=0,sum=0;
u16 tim;
unsigned int i=0;
while(i!=5)
{
PBout(8)=1; //
delay_us(20); //
PBout(8)=0;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//
i+=1;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//
TIM_Cmd(TIM2,DISABLE);//
tim=TIM_GetCounter(TIM2);//
length=(tim+overcount*1000)/58.0;//
sum=length+sum;
TIM2->CNT=0; //
overcount=0; //
delay_ms(100);
}
length=sum/5;
return length;//
}
void TIM2_IRQHandler(void) //
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//
overcount++;
}
}
由于是复制粘贴过来的,所以只是对部分地方进行了注释。其实很简单,就是通过一个引脚输出超过10us高电平作为脉冲信号,在设置一个引脚作为接收引脚。当接收到高电平,就开启定时器计数,当检测到低电平,就停止计数。将数值取出来,通过公式计算即可得到距离。最后是这个串口输出,直接#include "stdio.h"后直接用pirntf即可。但是不要忘了在此之前还要对编译器相关配置,这里请自行百度,很简单的。
史海拾趣
|
与各位探讨: RFIC的整体电路结构和集总参数射频电路区别不大,差异是因为在芯片里有些元件需要用工艺可以实现的方式设计。 集成电路有它的特点,例如在IC中,线间距离和线的尺寸都很小,由此在分立电路中不会出现或影响不显著的一些物理效应( ...… 查看全部问答> |
|
关于传感器采样液体微量变化的问题? 想用传感器采样液体的微量变化,然后试了试挂吊瓶,用传感器采样滴液的变化情况,感觉液体在滴啊,但是采样值却是一会大一会小,完全没有规律,一点也没呈现出线性变小的趋势。这是怎么回事? ...… 查看全部问答> |
|
用CETK测试CE下的DirectDraw的性能,测试结果显示330号的FLIP功能测试通过,但为什么DirectDraw的DDEX1测试例子测试不行呢?CE自 用CETK测试CE下的DirectDraw的性能,测试结果显示330号的FLIP功能测试通过,但为什么DirectDraw的DDEX1测试例子测试不行呢?CE自带的DDEX1例子调到了FLIP()函数… 查看全部问答> |
|
基于arm9(EP9302)的开发板运行一个wince系统,读写总线问题: 在wince上写了一个小的测试程序, while循环读取一个虚拟地址(DI)的值, 再把这个值写到另一个虚拟地址(DO)上. 结果是:用示波器测得总线上的写信号正常, 读信号间隔时间有时要几秒钟才 ...… 查看全部问答> |
|
OLEDB 方法中的IID_IRowsetIndex 中的seek相关问题 请问一下各位大侠,我在一个数据表中建了三列(即3个字段)都是WCHAR类型,我想根据第二或第三列的值查询某一行的数据,请问要怎么实现啊?急急……… 查看全部问答> |
|
就以SD卡为例子 注册表 [HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SDHC_SMDK2440] \"Order\"=dword:21 \"Dll\"=\"sdhc_sc2440.dll\" \"Prefix\"=\"SDH\" \"DMAChann ...… 查看全部问答> |




