国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MSP430單片機】MSP430G2553程序,MSP430G2553單片機教程,MSP430G2553實戰(zhàn)演練

這篇具有很好參考價值的文章主要介紹了【MSP430單片機】MSP430G2553程序,MSP430G2553單片機教程,MSP430G2553實戰(zhàn)演練。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

開發(fā)環(huán)境

CCS軟件下載:https://www.ti.com/tool/download/CCSTUDIO
建議別搞太高版本。
msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

板子介紹

P1.0 接了LED 輸出低電平點亮小燈
P1.6 接了LED
P1.3 接了KEY 按鍵按下是低電平
msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機
msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

官網示例代碼下載

https://www.ti.com.cn/product/cn/MSP430G2553#software-development
msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

MSP430普通IO口控制

使用按鍵控制燈。學習常用的IO口寄存器。

//******************************************************************************
//  MSP430G2xx3 Demo - Software Poll P1.4, Set P1.0 if P1.4 = 1
//
//  Description: Poll P1.4 in a loop, if hi P1.0 is set, if low, P1.0 reset.
//  ACLK = n/a, MCLK = SMCLK = default DCO
//
//               MSP430G2xx3
//            -----------------
//        /|\|              XIN|-
//         | |                 |
//         --|RST          XOUT|-
//     /|\   |                 |
//      --o--|P1.3         P1.0|-->LED
//     \|/
//
//  D. Dang
//  Texas Instruments, Inc
//  December 2010
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
    P1DIR |= BIT0;                            // Set P1.0 to output direction

    P1DIR &= ~BIT3;                            //輸入
    P1REN |= BIT3;                            //上拉下拉使能
    P1OUT |= BIT3;                            //上拉

    while (1)                                 // Test P1.4
    {
        if ((BIT3 & P1IN) == 0) // 按鍵按下
            P1OUT |= BIT0;
        else
            P1OUT &= ~BIT0;
    }
}


WDTCTL = WDTPW + WDTHOLD;
這一行代碼停止了看門狗定時器(Watchdog Timer),以防止系統(tǒng)復位。WDTCTL是一個特殊寄存器,用于配置和控制看門狗定時器。通過將WDTPW和WDTHOLD的值相加,可以將看門狗定時器設置為停止狀態(tài)。

P1DIR |= BIT0;
這一行代碼將P1.0引腳的方向設置為輸出。P1DIR是P1端口的方向寄存器,BIT0是一個宏定義,表示二進制數1。使用按位或操作符(|=)可以將P1DIR寄存器的BIT0位置1,將P1.0設置為輸出方向。

在循環(huán)中,程序通過檢查P1.3引腳的輸入狀態(tài)來控制P1.0引腳的輸出狀態(tài)。如果P1.3引腳的輸入為低電平(按鍵按下),則將P1.0引腳設置為高電平。如果P1.3引腳的輸入為高電平(按鍵未按下),則將P1.0引腳設置為低電平。

IO口外部中斷

IO口外部中斷是一種特殊的中斷,它允許外部事件觸發(fā)微控制器的中斷服務程序。它的存在有以下幾個意義和用途:

事件檢測和響應:外部中斷可以用于檢測和響應外部事件,例如按鍵按下、傳感器狀態(tài)變化、信號邊沿等。當外部事件發(fā)生時,觸發(fā)外部中斷,微控制器可以立即中斷當前任務,執(zhí)行與事件相關的中斷服務程序,從而及時響應外部事件。

節(jié)省處理器資源:通過使用外部中斷,可以節(jié)省處理器資源。相比于不斷地輪詢輸入狀態(tài),使用外部中斷可以在外部事件發(fā)生時立即中斷處理,避免了處理器不斷輪詢的浪費。這樣,處理器可以繼續(xù)執(zhí)行其他任務,而無需關注外部事件,只有在事件發(fā)生時才會中斷處理。

實時性和精確性:外部中斷的響應速度很快,可以實現實時性要求高的應用。它可以在微秒級別的時間內檢測到外部事件,并立即中斷處理。這對于需要高精度和及時響應的應用非常重要,如控制系統(tǒng)、測量和采樣系統(tǒng)等。

多任務處理:外部中斷允許多任務處理。通過將不同的外部事件分配給不同的中斷服務程序,可以同時處理多個任務。這樣,可以在同一個微控制器上實現多個功能模塊的并行處理,提高系統(tǒng)的效率和靈活性。

WDTCTL = WDTPW + WDTHOLD;:停止看門狗定時器。MSP430微控制器通常配備了一個看門狗定時器,用于在程序執(zhí)行期間檢測和防止系統(tǒng)鎖死。
P1DIR |= BIT0;:將P1.0引腳設置為輸出方向。這意味著P1.0被配置為輸出引腳,可以控制外部設備。
P1IE |= BIT3;:啟用P1.3引腳的中斷功能。當發(fā)生與P1.3引腳相關的中斷時,將觸發(fā)相應的中斷服務程序。
P1IES |= BIT3;:配置P1.3引腳的中斷觸發(fā)邊沿。在本例中,配置為高電平到低電平的觸發(fā)邊沿。
P1REN |= BIT3;:啟用P1.3引腳的上拉電阻。這意味著P1.3引腳與上拉電阻連接,可以檢測外部連接的開關狀態(tài)。
P1IFG &= ~BIT3;:清除P1.3引腳的中斷標志位。確保在進入中斷服務程序之前,將中斷標志位重置為未觸發(fā)狀態(tài)。
__bis_SR_register(LPM4_bits + GIE);:將微控制器設置為低功耗模式4(LPM4),并啟用全局中斷(GIE)。進入低功耗模式后,微控制器將等待中斷事件的發(fā)生。

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= BIT0; // P1.0 = toggle
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
這是一個中斷服務程序,是固有寫法,其中PORT1_VECTOR是中斷向量入口,Port_1是中斷函數名稱。

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
    P1DIR |= BIT0;                            // Set P1.0 to output direction
    P1IE |= BIT3;                            // P1.3 interrupt enabled
    P1IES |= BIT3;                            // P1.3 Hi/lo edge
    P1REN |= BIT3;							// Enable Pull Up on SW2 (P1.3)
    P1IFG &= ~BIT3;                           // P1.3 IFG cleared
                                              //BIT3 on Port 1 can be used as Switch2
    __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4 w/interrupt
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    P1OUT ^= BIT0;                            // P1.0 = toggle
    P1IFG &= ~BIT3;                           // P1.3 IFG cleared
}

MSP430時鐘系統(tǒng)

基本時鐘模塊+支持低系統(tǒng)成本和超低功耗。使用三個內部時鐘信號,用戶可以選擇性能和低功耗之間的最佳平衡?;緯r鐘模塊+可以在完全軟件控制下配置為不需要任何外部元件、一個外部電阻、一個或兩個外部晶體,或者諧振器進行操作。

基本時鐘模塊+包括兩個、三個或四個時鐘源:
? LFXT1CLK:低頻/高頻振蕩器,可與低頻手表晶體或外部時鐘源(32768 Hz)或標準晶體、諧振器或外部時鐘源(400 kHz至16 MHz范圍內)一起使用。
? XT2CLK:可選的高頻振蕩器,可與標準晶體、諧振器或外部時鐘源(400 kHz至16 MHz范圍內)一起使用。
? DCOCLK:內部數字控制振蕩器(DCO)。
? VLOCLK:內部超低功耗低頻振蕩器,典型頻率為12 kHz。

基本時鐘模塊+提供三個時鐘信號:
? ACLK:輔助時鐘。ACLK可在軟件中選擇LFXT1CLK或VLOCLK。ACLK可被1、2、4或8分頻。ACLK可針對各個外設模塊進行軟件選擇。
? MCLK:主時鐘。MCLK可在軟件中選擇LFXT1CLK、VLOCLK、XT2CLK(如果芯片上可用)或DCOCLK。MCLK可被1、2、4或8分頻。MCLK由CPU和系統(tǒng)使用。
? SMCLK:子主時鐘。SMCLK可在軟件中選擇LFXT1CLK、VLOCLK、XT2CLK(如果芯片上可用)或DCOCLK。SMCLK可被1、2、4或8分頻。SMCLK可針對各個外設模塊進行軟件選擇。

msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

該代碼的作用是配置 MSP430G2xx3 微控制器的時鐘信號輸出,其中 P1.0 引腳輸出 ACLK 時鐘信號,P1.4 引腳輸出 SMCLK 時鐘信號,P1.1 引腳輸出 MCLK/10 時鐘信號。在無限循環(huán)中,不斷地在 P1.1 引腳上輸出高電平和低電平信號,形成一個方波輸出,模擬了MCLK時鐘快慢。

//******************************************************************************
//  MSP430G2xx3 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK/10
//
//  Description: Buffer ACLK on P1.0, default SMCLK(DCO) on P1.4 and MCLK/10 on
//  P1.1.
//  ACLK = LFXT1 = 32768, MCLK = SMCLK = default DCO
//  //* External watch crystal installed on XIN XOUT is required for ACLK *//	
//
//               MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 | 32kHz
//          --|RST          XOUT|-
//            |                 |
//            |       P1.4/SMCLK|-->SMCLK = Default DCO
//            |             P1.1|-->MCLK/10 = DCO/10
//            |        P1.0/ACLK|-->ACLK = 32kHz
//
//  D. Dang
//  Texas Instruments Inc.
//  December 2010
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************


#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer

 //1Mhz
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  } 
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

/* //8Mhz
  if (CALBC1_8MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_8MHZ;                    // Set range
  DCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation */

/* //12Mhz
  if (CALBC1_12MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_12MHZ;                   // Set range
  DCOCTL = CALDCO_12MHZ;                    // Set DCO step + modulation*/

/* //16Mhz
  if (CALBC1_16MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_16MHZ;                   // Set range
  DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation*/

  P1DIR |= 0x13;                            // P1.0,1 and P1.4 outputs
  P1SEL |= 0x11;                            // P1.0,4 ACLK, SMCLK output

  while(1)
  {
    P1OUT |= 0x02;    	                    // P1.1 = 1
    P1OUT &= ~0x02;                         // P1.1 = 0
  }
}

MSP430不精確延時之delay_ms

__delay_cycles是編譯器內置的空指令運算,通過宏定義包裝,成為不精確延時之delay_ms。

#include <msp430.h>

#define CPU_F ( (double) 16000000)
#define delay_us( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                  // Stop Watchdog Timer
    //16Mhz
    if (CALBC1_16MHZ == 0xFF)				// If calibration constant erased
    {
        while (1)
            ;                               // do not load, trap CPU!!
    }
    DCOCTL = 0;                          // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_16MHZ;                   // Set range
    DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation

    P1DIR |= BIT0;
    while (1)
    {
        P1OUT ^= BIT0;                    //亦或計算
        delay_ms(100);
    }
}

MSP430定時器_CCR0溢出中斷

下面的設置是50ms的中斷。

SMCLK是1MHZ,此時CCR0 = 50000,定時器計數到CCR0 即是等于50ms。

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    //1Mhz
    if (CALBC1_1MHZ == 0xFF)                   // If calibration constant erased
    {
        while (1)
            ;                               // do not load, trap CPU!!
    }
    DCOCTL = 0;                          // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

    P1DIR |= 0x01;                            // P1.0 output

    CCTL0 = CCIE;                             // CCR0 interrupt enabled
    CCR0 = 50000;
    TACTL = TASSEL_2 + MC_1;                  // SMCLK, Up to CCR0

    __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
    P1OUT ^= BIT0;                            // Toggle P1.0
}


下面是四種計數模式,我們剛才的選擇是讓其計數到CCR0就 產生溢出中斷。

msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

MSP430定時器_定時器計數溢出中斷

定時器計數溢出中斷的中斷向量是TIMER0_A1_VECTOR,這個中斷向量入口也是CCR1 、CCR2 溢出的入口,在內部依靠TA0IV 寄存器判斷具體的中斷來源。

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
 switch( TA0IV )
 {
   case  2: break;                          // CCR1 not used
   case  4: break;                          // CCR2 not used
   case 10: P1OUT ^= 0x01;                  // overflow
            break;
 }
}

針對于CCR1之類的溢出也是不常用的,下面的代碼看看就好。

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1SEL |= 0x06;                            // P1.1 - P1.2 option select
  P1DIR |= 0x07;                            // P1.0 - P1.2 outputs
  CCTL0 = OUTMOD_4 + CCIE;                  // CCR0 toggle, interrupt enabled
  CCTL1 = OUTMOD_4 + CCIE;                  // CCR1 toggle, interrupt enabled
  TACTL = TASSEL_2 +  MC_2 + TAIE;          // SMCLK, Contmode, int enabled

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  CCR0 += 200;                              // Add Offset to CCR0
}

// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TA0IV )
  {
  case  2: CCR1 += 1000;                    // Add Offset to CCR1
           break;
  case 10: P1OUT ^= 0x01;                   // Timer_A3 overflow
           break;
 }
}

MSP430定時器_PWM波形產生

PWM(Pulse Width Modulation,脈寬調制)波形在電子和控制系統(tǒng)中有著廣泛的應用,它具有以下幾個重要的作用:

模擬信號生成:PWM波形可以通過調整脈沖的占空比來模擬產生連續(xù)的模擬信號。通過改變脈沖的寬度(占空比),可以實現不同的平均電平值,從而生成與輸入信號強度或控制信號相關的模擬輸出。這使得PWM成為模擬電壓和模擬電流控制的一種常見技術。

電機控制:PWM廣泛應用于電機驅動和速度控制中。通過在電機繞組上施加PWM波形,可以控制電機的轉速和扭矩。通過調整脈沖的占空比,可以改變電機驅動電壓的平均值,從而控制電機的轉速。

LED亮度控制:PWM被廣泛用于LED亮度調節(jié)。通過改變PWM波形的占空比,可以控制LED的亮度。當PWM波形的占空比較大時,LED處于高亮度狀態(tài);當占空比較小時,LED處于低亮度狀態(tài)。通過快速調整PWM波形的占空比,可以實現燈光的平滑過渡和精確亮度控制。

電源管理:PWM被用于電源管理和節(jié)能控制中。通過在開關電源中采用PWM控制,可以調整開關管的通斷時間,從而調節(jié)輸出電壓或電流。這種方式可以提高電源的效率和穩(wěn)定性,并減少功耗。

數字信號傳輸:PWM波形還可以用作數字信號傳輸的一種方式。在某些應用中,可以使用PWM波形來編碼和傳輸數字信息。通過改變脈沖的頻率或占空比,可以表示不同的數字值,從而實現簡單的數字通信。

下面是MSP430的PMW輸出模式:

msp430g2553矩陣鍵盤,單片機,MSP430教程,MSP430實戰(zhàn),MSP430程序,單片機

下面的代碼是讓P1.2輸出50%占空比的1kHZ波形。


//           |         P1.2/TA1|--> CCR1 - 50% PWM

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

    //1Mhz
    if (CALBC1_1MHZ == 0xFF)                   // If calibration constant erased
    {
        while (1)
            ;                               // do not load, trap CPU!!
    }
    DCOCTL = 0;                          // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

    P1DIR |= BIT2;
    P1SEL |= BIT2;
    CCR0 = 1000;                               // PWM Period/2
    CCTL1 = OUTMOD_7;                         // CCR1 toggle/set
    CCR1 = 500;                                // CCR1 PWM duty cycle
    TACTL = TASSEL_2 + MC_3;                  // SMCLK, up-down mode

    __bis_SR_register(LPM0_bits);             // Enter LPM0
}


MSP430串口_收發(fā)

9600波特率

//   MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
//   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |     P1.2/UCA0TXD|------------>
//            |                 | 9600 - 8N1
//            |     P1.1/UCA0RXD|<------------
//
//   D. Dang
//   Texas Instruments Inc.
//   February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>

void Send_Byte(char data)
{
    while (!(IFG2 & UCA0TXIFG))
        ;                // USCI_A0 TX buffer ready?
    UCA0TXBUF = data;                    // TX -> RXed character
}

void Print_Str(char *s)
{
    while (*s != '\0')
    {
        Send_Byte(*s++);
    }
}

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    if (CALBC1_1MHZ == 0xFF)				// If calibration constant erased
    {
        while (1)
            ;                               // do not load, trap CPU!!	
    }
    DCOCTL = 0;                          // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
    DCOCTL = CALDCO_1MHZ;
    P1SEL = BIT1 + BIT2;                     // P1.1 = RXD, P1.2=TXD
    P1SEL2 = BIT1 + BIT2;                    // P1.1 = RXD, P1.2=TXD
    UCA0CTL1 |= UCSSEL_2;                     // SMCLK
    UCA0BR0 = 104;                            // 1MHz 9600
    UCA0BR1 = 0;                              // 1MHz 9600
    UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
    UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
    IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

    __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
    while (!(IFG2 & UCA0TXIFG))
        ;                // USCI_A0 TX buffer ready?
    UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}

115200 波特率

//   MSP430G2xx3 Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 1MHz = 1MHz/115200 = ~8.7
//   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |     P1.2/UCA0TXD|------------>
//            |                 | 115200 - 8N1
//            |     P1.1/UCA0RXD|<------------
//
//   D. Dang
//   Texas Instruments Inc.
//   February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>

void Send_Byte(char data)
{
    while (!(IFG2 & UCA0TXIFG))
        ;                // USCI_A0 TX buffer ready?
    UCA0TXBUF = data;                    // TX -> RXed character
}

void Print_Str(char *s)
{
    while (*s != '\0')
    {
        Send_Byte(*s++);
    }
}

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2;                      
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 8;                              // 1MHz 115200
  UCA0BR1 = 0;                              // 1MHz 115200
  UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}

MSP430ADC

下面是ADC單通道轉換代碼。多通道較為復雜,這里不敘述。

#include <msp430.h>

#define CPU_F ( (double) 1000000)
#define delay_us( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000.0) )

unsigned int volt;
int main(void)
{

    WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */

    ADC10CTL0 = ADC10SHT_2 + ADC10ON ; // ADC10ON, interrupt enabled
    ADC10CTL1 = INCH_4;                       // input A4
    ADC10AE0 |= BIT4;                         // PA.4 ADC option select

    while (1)
    {
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
        while ((ADC10IFG & ADC10CTL0)==0)
                    ;                   //MEM5觸發(fā)IFG5  意味著有了新的轉換結果
        volt = ADC10MEM;
        volt=volt*3.3*100/1024;
        delay_ms(100);
    }
}

MSP430 Flash讀寫

#include <msp430.h>

char  value;                                // 8-bit value to write to segment A

// Function prototypes
void write_SegC (char value);
void copy_C2D (void);

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  DCOCTL = CALDCO_1MHZ;
  FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
  value = 0;                                // initialize value

  while(1)                                  // Repeat forever
  {
    write_SegC(value++);                    // Write segment C, increment value
    copy_C2D();                             // Copy segment C to D
    __no_operation();                       // SET BREAKPOINT HERE
  }
}

void write_SegC (char value)
{
  char *Flash_ptr;                          // Flash pointer
  unsigned int i;

  Flash_ptr = (char *) 0x1040;              // Initialize Flash pointer
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY;                            // Clear Lock bit
  *Flash_ptr = 0;                           // Dummy write to erase Flash segment

  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  for (i=0; i<64; i++)
  {
    *Flash_ptr++ = value;                   // Write value to flash
  }

  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

void copy_C2D (void)
{
  char *Flash_ptrC;                         // Segment C pointer
  char *Flash_ptrD;                         // Segment D pointer
  unsigned int i;

  Flash_ptrC = (char *) 0x1040;             // Initialize Flash segment C pointer
  Flash_ptrD = (char *) 0x1000;             // Initialize Flash segment D pointer
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY;                            // Clear Lock bit
  *Flash_ptrD = 0;                          // Dummy write to erase Flash segment D
  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  for (i=0; i<64; i++)
  {
    *Flash_ptrD++ = *Flash_ptrC++;          // copy value segment C to segment D
  }

  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

PS: 有代碼需要做可以私信。文章來源地址http://www.zghlxwxcb.cn/news/detail-600558.html

到了這里,關于【MSP430單片機】MSP430G2553程序,MSP430G2553單片機教程,MSP430G2553實戰(zhàn)演練的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • MSP430F5529單片機入門學習筆記1

    MSP430F5529單片機入門學習筆記1

    本筆記整理自B站教程 MSP430F5529單片機學習視頻匯總 右邊部分寫錯了,看的時候注意 注意#include“driverlib.h”頭文件時要注意: 添加MSP430F5xx_6xx文件夾到當前工程下 MSP430F5xx_6xx文件夾是在導入的msp430ware_3_80_13_03包中找 把上述MSP430F5xx_6xx文件夾的路徑包含進來 有三個系統(tǒng)時鐘可

    2024年02月06日
    瀏覽(25)
  • 【TB作品】MSP430單片機 Proteus仿真 DS18B20溫度 LCD1602顯示器 溫度讀取與顯示

    【TB作品】MSP430單片機 Proteus仿真 DS18B20溫度 LCD1602顯示器 溫度讀取與顯示

    效果圖如下: 首先,讓我們先來說說DS18B20集成電路。 ? DS18B20是一款采用OneWire通訊協(xié)議的集成電路,因此只需要一條線就可以與微控制器通訊。它不需要額外的電源,但是也有外部電源輸入端口。 ? OneWire設備具有64位的ROM代碼。如我們之前所說,這64位的前8位是家族代碼,中間

    2024年02月08日
    瀏覽(24)
  • 51單片機程序燒錄教程

    51單片機程序燒錄教程

    STC燒錄步驟 (1)STC單片機燒錄方式采用串口進行燒錄程序,連接的方式如下圖: (2)所以需要先確保USB轉串口驅動是識別到,且驅動運行正常;是否可通過電腦的設備管理器查看驅動是否正常; (3)確保正常后,打開STC-ISP燒錄工具; (4)然后選擇燒錄工具所在的串口號

    2024年02月14日
    瀏覽(23)
  • CH32V307VCT6單片機程序寫入教程

    CH32V307VCT6單片機程序寫入教程

    之前在沁恒微電子官網上申請了塊互連型的單片機,芯片的型號是 CH32V307 ,之前在論壇上看到他們說這一塊單片機和 stm32 系列的單片機差不多,正好今天板子到了我試了一下,發(fā)現真的和 stm32 差不多。 很多沒有接觸過stm32單片機但是白嫖到板子的朋友可能不會用這塊板子,

    2024年02月01日
    瀏覽(21)
  • 第1章_瑞薩MCU零基礎入門系列教程之單片機程序的設計模式

    第1章_瑞薩MCU零基礎入門系列教程之單片機程序的設計模式

    本教程基于韋東山百問網出的 DShanMCU-RA6M5開發(fā)板 進行編寫,需要的同學可以在這里獲?。?https://item.taobao.com/item.htm?id=728461040949 配套資料獲?。篽ttps://renesas-docs.100ask.net 瑞薩MCU零基礎入門系列教程匯總 : https://blog.csdn.net/qq_35181236/article/details/132779862 本章目標 理解裸機程序設

    2024年02月09日
    瀏覽(20)
  • MSP430系列教程(一) 開發(fā)環(huán)境搭建(IAR for MSP430 v7.10.1)

    MSP430系列教程(一) 開發(fā)環(huán)境搭建(IAR for MSP430 v7.10.1)

    最近開發(fā)用到了MSP430F169,重新熟悉了一遍430的開發(fā)流程,做個記錄。 本教程僅供個人使用,請勿用作商業(yè)用途。 我用的是IAR For MSP430 v7.10.1版本,下載鏈接見文章末尾。 執(zhí)行安裝程序,依次下一步即可 感謝一位叫“雷鋒”的好心人。 啟動IAR以后,菜單欄-Help-License Manager,如

    2024年02月06日
    瀏覽(18)
  • J-LINK J-FLASH 下載STM32單片機程序使用教程

    J-LINK J-FLASH 下載STM32單片機程序使用教程

    J-LINK J-FLASH 下載程序使用教程 -V1.0 2023.05.09 Introduction 本教程用于演示如何使用JLINK V9配套J-FLASH軟件燒寫更新MCU程序的教程 安裝提供的 JLINK驅動程序。JLink_Windows_V722a.rar。全程默認安裝,只能安裝在C盤,不可安裝于其它盤。 安裝驅動完成后,將JLINK V9仿真器上USB口插上電腦,

    2024年02月11日
    瀏覽(23)
  • ESP8266-01s入門:上報和下發(fā)數據控制單片機 AT指令講解和上云 燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機前置任務)

    ESP8266-01s入門:上報和下發(fā)數據控制單片機 AT指令講解和上云 燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機前置任務)

    本項目教程總共分為四節(jié) 1.創(chuàng)建OneNET新版MQTT設備:為微信小程序與單片機通信打基礎(微信小程序通信單片機前置任務) 2.(當前文章)ESP8266-01s入門:燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機前置任務) 3.物聯(lián)網實踐教程:微信小程序結合

    2024年02月04日
    瀏覽(26)
  • 學習筆記|ADC|NTC原理|測溫程序|STC32G單片機視頻開發(fā)教程(沖哥)|第十九集:ADC應用之NTC

    學習筆記|ADC|NTC原理|測溫程序|STC32G單片機視頻開發(fā)教程(沖哥)|第十九集:ADC應用之NTC

    NTC(Negative Temperature Coefficient)是指隨溫度上升電阻呈指數關系減小、具有負溫度系數的熱敏電阻現象和材料。該材料是利用錳、銅、硅、鈷、鐵、鎳、鋅等兩種或兩種以上的金屬氧化物進行充分混合、成型、燒結等工藝而成的半導體陶瓷,可制成具有負溫度系數(NTC)的熱

    2024年02月07日
    瀏覽(31)
  • IAR for ARM、MSP430、8051 保姆式安裝教程 (附IAR for ARM、MSP430、8051安裝包和工程源碼)

    IAR for ARM、MSP430、8051 保姆式安裝教程 (附IAR for ARM、MSP430、8051安裝包和工程源碼)

    IAR for ARM、Msp430、8051安裝包和工程源碼都一并放置文章底部(永久有效),有需要 自提即可。 IAR Embedded Workbench 是瑞典IAR Systems公司為 微處理器開發(fā)的一個集成開發(fā)環(huán)境,支持ARM,AVR,MSP430等芯片內核平臺。 IAR Systems 是全球領先的嵌入式系統(tǒng)開發(fā)工具和服務的供應商。公司成立

    2023年04月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包