欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用UART與PC通信實現(xiàn)msp430g2553單片機超聲波測距示例

 更新時間:2014年05月04日 11:23:48   作者:  
這篇文章主要介紹了使用UART與PC通信實現(xiàn)msp430g2553單片機超聲波測距示例,需要的朋友可以參考下

適用于msp430g2553單片機  使用到了hc-sr04超聲測距模塊,使用UART與PC通信。

復制代碼 代碼如下:

#include <msp430.h>
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 初始化函數(shù)
{
  UCA0CTL1 |= UCSWRST;                  //初始化串口寄存器                   
  UCA0CTL1 |= UCSSEL_2;                 //選擇子系統(tǒng)時鐘 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()                         //發(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);          //等待 捕捉中斷結束
 }
 else
 {
   P1OUT &= ~LED_1;
   _DINT();
 }    
}
void uart_txstring(char *string)        //UART_TX 發(fā)送一個串
{
  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 發(fā)送 測得的距離
{
  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();
  }
}

相關文章

  • C++實現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)

    C++實現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • cmake 學習筆記

    cmake 學習筆記

    這篇文章主要介紹了作者學習cmake 的相關資料與心得,有需要的小伙伴可以參考下
    2017-07-07
  • opencv3/C++ 直方圖反向投影實例

    opencv3/C++ 直方圖反向投影實例

    今天小編就為大家分享一篇opencv3/C++ 直方圖反向投影實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++實現(xiàn)旋轉掃描儀的示例代碼

    C++實現(xiàn)旋轉掃描儀的示例代碼

    旋轉掃描儀(Rotating?Scanner),也稱為旋轉掃描儀或圓形掃描儀,是一種用于獲取圖像和文檔的設備,下面就跟隨小編一起來學習一下如何使用C++實現(xiàn)旋轉掃描儀功能吧
    2024-02-02
  • C++中設計一個類時的注意事項分享

    C++中設計一個類時的注意事項分享

    這篇文章主要來和大家分享一下C++中,設計一個類要注意哪些東西,這往往也是C++面試時會考到的問題,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • C++中std::sort函數(shù)介紹和使用場景

    C++中std::sort函數(shù)介紹和使用場景

    std::sort函數(shù)是C++標準庫中常用的排序函數(shù)之一,它可以對各種類型的序列進行排序,本文就來介紹一下C++中std::sort函數(shù)介紹和使用場景,感興趣的可以了解一下
    2024-02-02
  • C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲

    C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)日期計算器詳細代碼示例

    C++實現(xiàn)日期計算器詳細代碼示例

    這篇文章主要給大家介紹了關于C++實現(xiàn)日期計算器的相關資料,基于C++編寫的簡單的日期計算器,供大家參考,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • C++實現(xiàn)大整數(shù)乘法(字符串乘法)

    C++實現(xiàn)大整數(shù)乘法(字符串乘法)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)大整數(shù)乘法、字符串乘法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++ 輕量級對象JSON序列化實現(xiàn)詳情

    C++ 輕量級對象JSON序列化實現(xiàn)詳情

    本文以jsoncpp庫為基礎,設計這樣一個可以支持一個函數(shù) 可以一行代碼 unmarshal /marshal 對象,需要的朋友小伙伴可以參考以下
    2021-09-09

最新評論