用msp430g2553和sr04(超声波测距) 连接,这个程序哪里错了 10
#include"msp430g2553.h"#include"stdio.h"#defineTRIGBIT4#defineECHOBIT2//P1.1DIR.0=0+S...
#include "msp430g2553.h"
#include "stdio.h"
#define TRIG BIT4
#define ECHO BIT2 //P1.1 DIR.0=0 + SEL.1=1 + SEL2.1=0 --> TA0.CCI0A
#define USOUND_DIR P1DIR
#define USONUD_OUT P1OUT
#define USOUND_IE P1IE
#define USOUND_IES P1IES
#define USOUND_SEL P1SEL
unsigned int capV = 0;
float distance;
float f;
void BCSplus_init(void);
char str[100];
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
BCSplus_init();
USONUD_OUT |= TRIG;
USOUND_DIR |= TRIG;
USOUND_SEL |= ECHO ; //CCI0A
while(1)
{
TA0CTL |= MC_2 + TASSEL_2 + TACLR; //计数 SMCLK 清计数
TA0CCTL1 |= CM_1 + CAP + SCS + CCIE + CCIS_0;//上升沿捕获 捕获模式 同步模式 使能中断 CCI0A
USONUD_OUT |= TRIG;
__delay_cycles(200);
USONUD_OUT &= ~TRIG;
while((TA0CCTL1 & CCIFG) ==0); //等待上升沿
TA0CTL &= ~MC_3; //清除MC_的两位,否则 CM_1 | CM_2 = CM_3
TA0CTL |= MC_2 + TACLR; //连续计数 清除TA的计数值
TA0CCTL1 &= ~CCIFG; //清中断标志
TA0CCTL1 |= CM_2; //下降沿捕捉
while((TA0CCTL1 & CCIFG) ==0); //等待下降沿
capV = TA0CCR1; //得到计数器的值
distance = (1e-6)* capV *340 /2 ;//计算距离
TA0CCTL1 &= ~CCIFG; //清中断标志
unsigned int x,y;
for(x=5000;x>0;x--)
for(y=500;y>0;y--);
}
}
//MCLK = SMCLK = 1MHZ
void BCSplus_init(void)
{
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
if (CALBC1_16MHZ != 0xFF) {
DCOCTL = 0x00;
BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */
DCOCTL = CALDCO_1MHZ;
}
BCSCTL1 |= XT2OFF + DIVA_0;
BCSCTL3 = XT2S_0 + LFXT1S_0 + XCAP_1;
}
void delay(unsigned int ms)
{
int x,y;
for(x=ms; x>0;x--)
for(y=1124; y>0;y--);
}
我觉得可能是计算距离的公式有问题 展开
#include "stdio.h"
#define TRIG BIT4
#define ECHO BIT2 //P1.1 DIR.0=0 + SEL.1=1 + SEL2.1=0 --> TA0.CCI0A
#define USOUND_DIR P1DIR
#define USONUD_OUT P1OUT
#define USOUND_IE P1IE
#define USOUND_IES P1IES
#define USOUND_SEL P1SEL
unsigned int capV = 0;
float distance;
float f;
void BCSplus_init(void);
char str[100];
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
BCSplus_init();
USONUD_OUT |= TRIG;
USOUND_DIR |= TRIG;
USOUND_SEL |= ECHO ; //CCI0A
while(1)
{
TA0CTL |= MC_2 + TASSEL_2 + TACLR; //计数 SMCLK 清计数
TA0CCTL1 |= CM_1 + CAP + SCS + CCIE + CCIS_0;//上升沿捕获 捕获模式 同步模式 使能中断 CCI0A
USONUD_OUT |= TRIG;
__delay_cycles(200);
USONUD_OUT &= ~TRIG;
while((TA0CCTL1 & CCIFG) ==0); //等待上升沿
TA0CTL &= ~MC_3; //清除MC_的两位,否则 CM_1 | CM_2 = CM_3
TA0CTL |= MC_2 + TACLR; //连续计数 清除TA的计数值
TA0CCTL1 &= ~CCIFG; //清中断标志
TA0CCTL1 |= CM_2; //下降沿捕捉
while((TA0CCTL1 & CCIFG) ==0); //等待下降沿
capV = TA0CCR1; //得到计数器的值
distance = (1e-6)* capV *340 /2 ;//计算距离
TA0CCTL1 &= ~CCIFG; //清中断标志
unsigned int x,y;
for(x=5000;x>0;x--)
for(y=500;y>0;y--);
}
}
//MCLK = SMCLK = 1MHZ
void BCSplus_init(void)
{
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
if (CALBC1_16MHZ != 0xFF) {
DCOCTL = 0x00;
BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */
DCOCTL = CALDCO_1MHZ;
}
BCSCTL1 |= XT2OFF + DIVA_0;
BCSCTL3 = XT2S_0 + LFXT1S_0 + XCAP_1;
}
void delay(unsigned int ms)
{
int x,y;
for(x=ms; x>0;x--)
for(y=1124; y>0;y--);
}
我觉得可能是计算距离的公式有问题 展开
2014-07-15
展开全部
4m是由硬件决定的,也就是说4m的距离,有足够的信号。当然你可以用软件来限制,比如你只测到2m,2m以后的信号就不算了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询