使用UART與PC通信實(shí)現(xiàn)msp430g2553單片機(jī)超聲波測(cè)距示例
適用于msp430g2553單片機(jī) 使用到了hc-sr04超聲測(cè)距模塊,使用UART與PC通信。
#include <msp430.h>
long current_time;//最近一次測(cè)得時(shí)間
/*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 初始化函數(shù)
{
UCA0CTL1 |= UCSWRST; //初始化串口寄存器
UCA0CTL1 |= UCSSEL_2; //選擇子系統(tǒng)時(shí)鐘 1.045MHz
UCA0BR0 = 0x6d; //波特率為9600
UCA0BR1 = 0x00;
P1SEL |= UART_TXD;
P1SEL2 |= UART_TXD;
P1DIR |= UART_TXD; //將P1.2設(shè)為第二功能
UCA0CTL1 &= ~UCSWRST; //初始化結(jié)束
}
long cal_distance() //通過(guò)測(cè)得時(shí)間計(jì)算距離
{
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) //將測(cè)得的距離以字符串形式存儲(chǔ)
{
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++) //轉(zhuǎn)化核心算法
{
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() //發(fā)一次超聲波
{
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); //等待 捕捉中斷結(jié)束
}
else
{
P1OUT &= ~LED_1;
_DINT();
}
}
void uart_txstring(char *string) //UART_TX 發(fā)送一個(gè)串
{
int i=0;
while(string[i++])
{
switch (i) //過(guò)濾無(wú)效 '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 發(fā)送 測(cè)得的距離
{
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中斷標(biāo)志位
IE2 |= UCA0TXIE;
}
/*Main*/
void main()
{
WDTCTL = WDTPW + WDTHOLD; //關(guān)狗
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();
}
}
- C語(yǔ)言宏定義結(jié)合全局變量的方法實(shí)現(xiàn)單片機(jī)串口透?jìng)髂J?/a>
- android實(shí)現(xiàn)手機(jī)與單片機(jī)藍(lán)牙模塊通信
- Android Socket 線程連接openwrt與arduino單片機(jī)串口雙向通信的實(shí)例解析
- Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法總結(jié)
- Android單片機(jī)與藍(lán)牙模塊通信實(shí)例代碼
- c#實(shí)現(xiàn)51單片機(jī)頻率計(jì)的代碼分享(數(shù)字頻率計(jì)設(shè)計(jì))
- 關(guān)于單片機(jī)按鍵問(wèn)題性能提升總結(jié)
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)旋轉(zhuǎn)掃描儀的示例代碼
旋轉(zhuǎn)掃描儀(Rotating?Scanner),也稱(chēng)為旋轉(zhuǎn)掃描儀或圓形掃描儀,是一種用于獲取圖像和文檔的設(shè)備,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何使用C++實(shí)現(xiàn)旋轉(zhuǎn)掃描儀功能吧2024-02-02C++中設(shè)計(jì)一個(gè)類(lèi)時(shí)的注意事項(xiàng)分享
這篇文章主要來(lái)和大家分享一下C++中,設(shè)計(jì)一個(gè)類(lèi)要注意哪些東西,這往往也是C++面試時(shí)會(huì)考到的問(wèn)題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06C++中std::sort函數(shù)介紹和使用場(chǎng)景
std::sort函數(shù)是C++標(biāo)準(zhǔn)庫(kù)中常用的排序函數(shù)之一,它可以對(duì)各種類(lèi)型的序列進(jìn)行排序,本文就來(lái)介紹一下C++中std::sort函數(shù)介紹和使用場(chǎng)景,感興趣的可以了解一下2024-02-02C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫(xiě)的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03C++實(shí)現(xiàn)大整數(shù)乘法(字符串乘法)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)大整數(shù)乘法、字符串乘法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09C++ 輕量級(jí)對(duì)象JSON序列化實(shí)現(xiàn)詳情
本文以jsoncpp庫(kù)為基礎(chǔ),設(shè)計(jì)這樣一個(gè)可以支持一個(gè)函數(shù) 可以一行代碼 unmarshal /marshal 對(duì)象,需要的朋友小伙伴可以參考以下2021-09-09