msp430g2553串口接受数据_使用UART与PC通信实现msp430g2553单片机超声波测距示例

#include

long current_time;//最近一次测得时间

/*MyPro*/

#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

/*TIMER0*/

#define SOUR_CLK  1045000

#define DIV_CLK_1  1

#define SYS_CLK_SIG_1  SOUR_CLK/DIV_CLK_1

#define DISTANCE 45//dm

#define TIMER_RIG_MAX 0xffff

#define MAX_TIME_1 DISTANCE*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

}

/*UART*/

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

{

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();

}

}

/*UART_ISR*/

#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;

}

/*TIMER0_INT_ISR*/

#pragma vector = TIMER1_A1_VECTOR

__interrupt void capture()

{

current_time = TA1CCR1;

TA1CTL &= ~MC_2;

TA1CCTL1 &= ~CCIFG;           //清CC1中断标志位

IE2 |= UCA0TXIE;

}

/*Main*/

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();

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值