⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 msp430舵机控制
💻 C
字号:
/******************************************************
程序功能:接收来自PC机的字符,并根据接收的数据改变P5.0,P5.1,P5.2口输出不同PWM波形占空比
-------------------------------------------------------
通信格式:N.8.1,  9600
         无校验,8个数据位,1个停止位,波特率9600
------------------------------------------------------
测试说明:打开串口调试助手,正确设置通信格式,向学习板
          发送2位以内整数(以$结束),观察P5口输出的PWM波形占空比
*******************************************************/
#include  <msp430x14x.h>
#include  "BoardConfig.h"
#include <stdlib.h>
char r[13],r1[4],r2[4],r3[4];
int i=0,j=0,k=0,temp1,temp2,temp3;
/********************主函数********************/
void main(void)
{

  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
    BoardConfig(0x38);                        // 关闭数码管、流水灯,打开电平转换
    
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符
    UTCTL0 |= SSEL0;                          // UCLK = ACLK
    UBR00 = 0x03;                             // 波特率9600
    UBR10 = 0x00;                             //
    UMCTL0 = 0x4A;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0;                            // 使能USART0的接收中断
 
  P5DIR |= BIT0+BIT1+BIT2;                            // P5.0,1选择为输出
  P5OUT |= BIT0+BIT1+BIT2;                            // P5.0,1输出1
  

   /*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
    do
    {
        IFG1 &= ~OFIFG;                 //清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振


  while(1)
    {
      
  TBCCR0 = 100-1;                               // 0.0125ms,PWM Period
  TBCCTL0 |=CCIE;                         //                          
  TBCTL |= TBSSEL_2 + ID_0 + MC_1;                // ACLK, 1/8,up-down mode 
  _EINT();                               //打开全局中断
        LPM1;                                  //进入LPM1模式
        while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕      
        TXBUF0 =RXBUF0;                       //将收到的字符发送出去 
        if (RXBUF0!='$')                      //没有收到结束符$
        {
          r[i]=RXBUF0;
          i+=1;
        }  
        else                                 //收到结束符$
        {
          k=0;
          do  
          {             
            if (k<3) r1[k]=r[k];
            else if (k>3 & k<7) r2[k-4]=r[k];
            else if (k>7 & k<11) r3[k-8]=r[k]; 
            k+=1;
          } while(k<11);
          r1[3]='\0';
          r2[3]='\0';
          r3[3]='\0'; 
          
         if  (atoi(r1)<201 & atoi(r1)>39)   temp1=atoi(r1);
         if  (atoi(r2)<201 & atoi(r2)>39)   temp2=atoi(r2);   
         if  (atoi(r3)<201 & atoi(r3)>39)   temp3=atoi(r3);            
         i=0; 
        }  
      }
    
}

/*******************************************
函数名称:UART0_RXISR
功    能:UART0的接收中断服务函数,在这里唤醒
          CPU,使它退出低功耗模式
参    数:无
返回值  :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
  LPM1_EXIT;                 //退出低功耗模式
}
/*******************************************
函数名称:Timer_B
功    能:定时器B的中断服务函数,在这里更改
          PWM的占空比
参    数:无
返回值  :无
********************************************/
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B(void)
{
   j+=1;
   if (j==temp1) P5OUT ^=BIT0;
   if (j==temp2) P5OUT ^=BIT1;
   if (j==temp3) P5OUT ^=BIT2;   
  if (j>1600) 
  {
    j=0;
    P5OUT |=BIT0+BIT1+BIT2; 
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -