This article mainly introduces the use of UART and PC communication to achieve msp430g2553 single chip ultrasonic Ranging example, need friends can refer to the next
It is suitable for msp430g2553 MCU to use the HC-SR04 ultrasonic ranging module and communicates with PC using UART.
The code is as follows:
#include
The last time a long current_time;//was measured
/*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" + "
#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 initialization function
{
UCA0CTL1 |= Ucswrst; Initializing serial port Registers
UCA0CTL1 |= ucssel_2; Select Subsystem Clock 1.045MHz
Uca0br0 = 0x6d; Baud rate is 9600
UCA0BR1 = 0x00;
P1sel |= Uart_txd;
P1sel2 |= Uart_txd;
P1dir |= Uart_txd; Set the P1.2 to the second function
UCA0CTL1 &= ~ucswrst; Initialization end
}
Long cal_distance ()//distance calculated by measured time
{
Return (long) ((340* (0.5000*CURRENT_TIME/SYS_CLK) *min_unit_to1m));
}
void delay ()//Rough Latency
{
unsigned char i,j;
for (i=124;i>0;i--)
for (j=8;j>0;j--);
}
Static char * Translater (long distance)//storing the measured distance as a string
{
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] = ';
return trans;
}
void Once_pro ()//Send an ultrasound
{
if (TA1CCTL1 & COV)
TA1CCTL1 &= ~cov;
if (!) ( p1in & BIT3))
{
ta1r = 0;
P1out |= TRIG; Trig US High level
_eint ();
Ta1ctl |= mc_2; Continue mode
P1out &= ~trig;
P1out |= led_1;
while (TA1CCTL1 & CCIFG); Wait for capture interrupt to end
}
Else
{
P1out &= ~led_1;
_dint ();
}
}
void Uart_txstring (char *string)//UART_TX sends a string
{
int i=0;
while (string[i++])
{
switch (i)//filter invalid ' 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 ()//send measured distance to PC
{
Uart_txstring ("nr");
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; Clear CC1 interrupt Mark Bit
IE2 |= Uca0txie;
}
/*main*/
void Main ()
{
Wdtctl = Wdtpw + wdthold; Shut the dog.
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 ();
}
}
Note : Please pay attention to the triple programming Tutorials section for more wonderful articles .