时间:2021-05-19
适用于msp430g2553单片机 使用到了hc-sr04超声测距模块,使用UART与PC通信。
复制代码 代码如下:
#include <msp430.h>
long current_time;//最近一次测得时间
#define LED_1 BIT0
#define SW_2 BIT3
#define TA1_1 BIT2 //TA0.1 HC-SR04 Echo
#define TRIG BIT4 //HC-SR04 Trig
#define ACCU_GRD 7//Accuracy Grade "xxx.x"+'\0'
#define MIN_UNIT_TO1M 1000//1 m to 1 mm
#define SOUR_CLK 1045000
#define DIV_CLK_1 1
#define SYS_CLK_SIG_1 SOUR_CLK/DIV_CLK_1
#define DISTANCE45//dm
#define TIMER_RIG_MAX0xffff
#define MAX_TIME_1DISTANCE*2/34*SYS_CLK_SIG_1
#ifdef MAX_TIME_1
#define SYS_CLK SYS_CLK_SIG_1
#endif
#define UART_TXD BIT2
void init_timer1()
{
P2SEL |= TA1_1; //TA1.1 CCI1B be used
P2DIR &= ~TA1_1;
TA1CTL = MC_0 + TASSEL_2; //TimerA_0 stop mode,clock=1Mhz
TA1CCTL1 = CCIE + SCCI + CCIS_1 + SCS + CAP + CM_2;//TA0CC1 capture mode + down edge
}
void init_uart() //USCI 初始化函数
{
UCA0CTL1 |= UCSWRST; //初始化串口寄存器
UCA0CTL1 |= UCSSEL_2; //选择子系统时钟 1.045MHz
UCA0BR0 = 0x6d; //波特率为9600
UCA0BR1 = 0x00;
P1SEL |= UART_TXD;
P1SEL2 |= UART_TXD;
P1DIR |= UART_TXD; //将P1.2设为第二功能
UCA0CTL1 &= ~UCSWRST; //初始化结束
}
long cal_distance() //通过测得时间计算距离
{
return (long)((340*(0.5000*current_time/SYS_CLK)*MIN_UNIT_TO1M));
}
void delay()//粗略延迟
{
unsigned char i,j;
for(i=124;i>0;i--)
for(j=8;j>0;j--);
}
static char * translater(long distance) //将测得的距离以字符串形式存储
{
static char trans[ACCU_GRD];
int i;
long f;
trans[0]=' ';
if(distance)
for(i=1,f=MIN_UNIT_TO1M;i<ACCU_GRD-1;i++) //转化核心算法
{
if(i==4)
{
trans[i] = '.';
continue;
}
trans[i] = '0'+ distance/f;
distance %= f;
f /= 10;
}
trans[ACCU_GRD-1] = '\0';
return trans;
}
void once_pro() //发一次超声波
{
if(TA1CCTL1 & COV)
TA1CCTL1 &= ~COV;
if(!(P1IN & BIT3))
{
TA1R = 0;
P1OUT |= TRIG; //Trig 10 us 高电平
_EINT();
TA1CTL |= MC_2;//continue mode
P1OUT &= ~TRIG;
P1OUT |= LED_1;
while(TA1CCTL1 & CCIFG); //等待 捕捉中断结束
}
else
{
P1OUT &= ~LED_1;
_DINT();
}
}
void uart_txstring(char *string) //UART_TX 发送一个串
{
int i=0;
while(string[i++])
{
switch (i) //过滤无效 '0'
{
case 1:if(string[i]=='0') continue;
case 2:if(string[i]=='0'&&string[i-1]=='0') continue;
}
UCA0TXBUF = string[i];
delay();
}
}
#pragma vector = USCIAB0TX_VECTOR
__interrupt void usci_txdistance() //向 PC 发送 测得的距离
{
uart_txstring("\n\r");
uart_txstring(" Current ");
uart_txstring(" distance: ");
uart_txstring(translater(cal_distance()));
uart_txstring(" cm");
IE2 &= ~UCA0TXIE;
}
#pragma vector = TIMER1_A1_VECTOR
__interrupt void capture()
{
current_time = TA1CCR1;
TA1CTL &= ~MC_2;
TA1CCTL1 &= ~CCIFG; //清CC1中断标志位
IE2 |= UCA0TXIE;
}
void main()
{
WDTCTL = WDTPW + WDTHOLD; //关狗
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1OUT = 0;
P2OUT = 0;
P1REN |= SW_2;
P2REN |= TA1_1;
P1OUT |= SW_2;
P1DIR &= ~SW_2;
P1DIR = TRIG + LED_1;
init_timer1();
init_uart();
while(1)
{
int c = 8;
while(c--)
delay();
if(TA1CCTL1 & CCIFG)
TA1CCTL1 &= ~CCIFG;
once_pro();
}
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
超声波和高频机区别如下: 1、频率不同 超声波:当声波的振动频率大于20000Hz时,人耳无法听到。超声波因其频率下限大约等于人的听觉上限而得名。因此,人们
超声波20K的意思是超声波的频率为20K赫兹(2万赫兹),一般用于超声波清洗机。这种波刚好达到理论上人耳所能听到的声波的最高频率。高于20000Hz的声波称之为
蝙蝠探路的原理是超声波,超声波可以用来探索人们很难进入的洞窟和地缝。声呐,声呐是利用水中声波对水下目标进行探测、定位和通信的电子设备,是水声学中应用广泛的一种重
超声波产生的原理是换能器的逆压电效应。 超声波是一种频率高于20000赫兹的声波,它的方向性好,反射能力强,易于获得较集中的声能,在水中传播距离远,可用于测距
以MCS-51单片机为例,单片机复位后pc值为0000H,复位是单片机上的复位电路的复位操作,作用是使电路恢复到起始状态。 单片机(Single-ChipMi