MSP430单片机串口控制5路PWM频率变化程序

82 阅读7分钟

MSP430单片机串口控制5路PWM频率变化程序  下面介绍一段MSP430单片机通过232串口发送0x00,0x01,0x02,0x03,0x04控制IO端口P1,P2,P4,P5,P6输出6路PWM波形变化的程序,单片机发送0x05,IO端口P1,P2,P4,P5,P6输出PWM为0。单片机的电路如下图 程序如下:链接:pan.baidu.com/s/1-vcBVWfk… ; 提取码:18fo  share.weiyun.com/IHXUku45

/*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度           的不同组合而进行点亮"流动" 通过232串口发送0x00,0x01,0x02,0x03,0x04调节P1,P2,P4,P5,P6的6个管脚输出PWM波形的频率由小变大 通过232串口发送0x05调节P1,P2,P4,P5,P6的6个管脚输出PWM波形为零 程序功能:MCU通过串口向PC机发送4X4键盘的键值

通信格式:N.8.1,  9600

拨码开关设置:将LED位拨至ON,其余拨至OFF 测试说明:观察流水灯流动顺序和速度的变化 ************************************************/ #include  <msp430x14x.h> //#include "flash.h" typedef unsigned int  uint; typedef unsigned char uchar; //void write_flash_char(); void writeflashchar(unsigned int addr,char *array,int count) ; void writeflashint(unsigned int addr,int *array,int count) ;  void   Delay400ms();  void delay();  void Delay5ms(); uint i = 0,j = 0,dir = 0; uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度  uint tmp;  uint m;  // uint tmp1=12000;   // uint tmp2=1200;    // uint tmp3=12000;     // uint tmp4=1200;     //  uint tmp5=12000;   uchar shuju;  int shuju1; /主函数/ void main(void) {        /下面六行程序关闭所有的IO口/     P1DIR = 0XFF;P1OUT = 0XFF;     P2DIR = 0XFF;P2OUT = 0XFF;     P3DIR = 0XFF;P3OUT = 0XFF;     P4DIR = 0XFF;P4OUT = 0XFF;     P5DIR = 0XFF;P5OUT = 0XFF;     P6DIR = 0XFF;P6OUT = 0X00;        WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗     P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换     P5OUT &= ~BIT7;          CCTL0 = CCIE;                   //使能CCR0中断     CCR0 = 50000;     TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式     P2DIR = 0xff;                   //设置P2口方向为输出     P2OUT = 0xff;    P1DIR = 0xff;                   //设置P2口方向为输出     P1OUT = 0xff;       P4DIR = 0xff;                   //设置P2口方向为输出     P4OUT = 0xff;       P5DIR = 0xff;                   //设置P2口方向为输出     P5OUT = 0xff;       P6DIR = 0xff;                   //设置P2口方向为输出     P6OUT = 0xff;     // tmp=12000;        //  LPM0;                           //CPU进入LPM0模式/                 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的接收中断     _EINT();                        //使能全局中断               //  LPM1;            while(1)     {        //_EINT();                               //打开全局中断                //进入LPM1模式        // while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕        // TXBUF0 = RXBUF0;                       //将收到的字符发送出去       //  write_flash_char(0xef,*shuju,4);         //write_flash_int(0xbf,shuju1,2);        // void writeflashchar(0xff,0x01,2) ;    //      char *Flash_ptr;  //Flash pointer;   //int i;      // 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     //   Flash_ptr=0x1001;   //initialize flash pointer   //    for (i=0;i<count;i++)     //  {     //    *Flash_ptr++=array[i];    //write value to flash     //  }     //  FCTL1=FWKEY;   //Clear WRT bit      // FCTL3=FWKEY+LOCK;// Set LOCK bit                 //switch(shuju)      ///  switch(RXBUF0)         //{         //case 0x00:        // if (TXBUF0=0x00)            // if (shuju==0x00)         // {              //tmp=12000;           //      m=5;             //    break;                // m++;            //tmp--;                    //  }         //if (TXBUF0=0x01)           // if (shuju==0x01)         //{            //tmp=1200;                // case 0x01:            //m=10;             //break;          // tmp++;        // }     //if(TXBUF0=0X02)        //  if (shuju==0x02)   //  {       // tmp=5000;       //tmp=tmp;            //case 0x02:           //m=25;            //break;   //  }        // if(TXBUF0=0X03)          // if (shuju==0x03)   //  {        //tmp=20000;       //tmp=tmp;        //   case 0x03:         // m=40;         //  break;    // }            // if(TXBUF0=0X04)         //  if (shuju==0x04)     //{       // tmp=100;       //tmp=tmp;        //  case 0x04:         //  m=50;           // break;    // }            //   if (shuju==0x05)    // {        //tmp=50000;       //tmp=tmp;        //   case 0x05:          // m=100;          //  break;        // default:         //  m=0;          // break;         //}     //}     } }

/******************************************* 函数名称:Timer_A  功    能:定时器A的中断服务函数,在这里通过标志           控制流水灯的流动方向和流动速度 参    数:无 返回值  :无 */ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) {       //if(flag == 0)    // {         //P2OUT = (0x80>>(i++));    //灯的点亮顺序D8 -> D1      // P2OUT =(0x80>>4);    //  while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕        // TXBUF0 = RXBUF0;                       //将收到的字符发送出去                                //P2OUT &= 0x01;     P2OUT &= 0x3F;         // P2OUT =(0x3F);   // delay(tmp);     Delay400ms( m);     //delay(12000);      // P2OUT =(0x00>>1);      P2OUT =(0x00);    //delay(12000);   // delay(tmp);     Delay400ms( m);          P1OUT =(0x3F);   // delay(12000);   //delay(tmp);    Delay400ms( m);      P1OUT =(0x00);      //delay(12000);     // delay(tmp);       Delay400ms( m);     //delay(12000);          P4OUT =(0x3F);      // delay(12000);        Delay400ms( m);     //delay(tmp);      P4OUT =(0x00);      // delay(12000);         //delay(tmp);          Delay400ms( m);       P5OUT =(0x3F);      //delay(12000);      // delay(tmp);       Delay400ms( m);      P5OUT =(0x00);    // delay(12000);      //delay(tmp);        Delay400ms( m);     P6OUT =(0x3F);     //delay(12000);     //delay(tmp);      Delay400ms( m);      P6OUT =~(0x00);     // delay(12000);      Delay400ms( m);    // delay(tmp);      //}    // else if(flag == 1)    // {     //    P2OUT = (0x01<<(i++));    //灯的点亮顺序D1 -> D8    // }    // else     // {       //  if(dir)                  //灯的点亮顺序  D8 -> D1,D1 -> D8,循环绕圈                               //  {       //      P2OUT = (0x80>>(i++));       //  }        // else        // {         //    P2OUT = (0x01<<(i++));        // }    // }   //    // if(i == 8)    //  {      //   i = 0;     //    dir = dir;    // }       // j++;   //  if(j == 40)    //  {      //   i = 0;       //  j = 0;       //  flag++;       //  if(flag == 4) flag = 0;        // switch(speed)        // {       //  case 0:        //     TACTL &= (ID0 + ID1);        //     TACTL |= ID_3;       //      break;       //  case 1:      //       TACTL &= (ID0 + ID1);        //     TACTL |= ID_2;        //     break;        // case 2:        //     TACTL &= (ID0 + ID1);         //    TACTL |= ID_1;         //    break;        // case 3:       //      TACTL &= (ID0 + ID1);       //      TACTL |= ID_0;        //     break;        // default:         //    break;       //  }      //   if(flag != 3)   speed++;       //  if(speed == 4) speed = 0;     //}  } / 函数名称:Delay5ms 功    能:延时约5ms 参    数:无 返回值  :无 */ void Delay5ms(void) {      uint i=40000;     while (i != 0)     {         i--;     } } / 函数名称:Delay400ms 功    能:延时约400ms 参    数:无 返回值  :无 ********************************************/ void Delay400ms(uint m) {     //uchar i=50;     uint j;

    while(m--)     {             //j=7269;       j=1000;             while(j--);     } } /******************************************* 函数名称:delay 功    能:延时约15ms,完成消抖功能 参    数:无 返回值  :无 */ void delay(uint tmp) {    // uint tmp;          // for(tmp = 12000;tmp > 0;tmp--);    for(tmp =tmp;tmp > 0;tmp--); } / 函数名称:UART0_RXISR 功    能:UART0的接收中断服务函数,在这里唤醒           CPU,使它退出低功耗模式 参    数:无 返回值  :无 ********************************************/ #pragma vector = UART0RX_VECTOR __interrupt void UART0_RXISR(void) {     while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕         TXBUF0 = RXBUF0;                       //将收到的字符发送出去          shuju=RXBUF0;          switch(RXBUF0)         {         case 0x00:        // if (TXBUF0=0x00)            // if (shuju==0x00)         // {              //tmp=12000;                 m=5;                 break;                // m++;            //tmp--;                    //  }         //if (TXBUF0=0x01)           // if (shuju==0x01)         //{            //tmp=1200;                 case 0x01:            m=10;             break;          // tmp++;        // }     //if(TXBUF0=0X02)        //  if (shuju==0x02)   //  {       // tmp=5000;       //tmp=tmp;            case 0x02:           m=25;            break;   //  }        // if(TXBUF0=0X03)          // if (shuju==0x03)   //  {        //tmp=20000;       //tmp=tmp;           case 0x03:          m=40;           break;    // }            // if(TXBUF0=0X04)         //  if (shuju==0x04)     //{       // tmp=100;       //tmp=tmp;          case 0x04:           m=50;            break;    // }            //   if (shuju==0x05)    // {        //tmp=50000;       //tmp=tmp;           case 0x05:           m=100;            break;         default:           m=0;           break;         }                  // tmp=TXBUF0;  // LPM1_EXIT;                 //退出低功耗模式 }