.
  • 作者:zhangzhan
  • 积分:1930
  • 等级:博士研究生
  • 2020/5/12 20:04:31
  • 中国面包师贴吧-楼主(阅:2140/回:0)MSP430单片机串口控制5路PWM频率变化程序

    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。单片机的电路如下图

    程序如下:链接:https://pan.baidu.com/s/1-vcBVWfkaSu8C81LeTFqmw ;

    提取码:18fo

    https://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;                 //退出低功耗模式

    }



    发帖须知:

    1,发帖请遵守《计算机信息网络国际联网安全保护管理办法》、《互联网信息服务管理办法》、 《互联网电子公告服务管理规定》、《维护互联网安全的决定》等法律法规。

    2,请对您的言论负责,我们将保留您的上网记录和发帖信息。

    3,在此发帖表示认同我们的条款,我们有权利对您的言论进行审核、删除或者采取其他在法律、地方法规等条款规定之内的管理操作。
    内容:
    验证: 验证码,看不清楚?请点击刷新验证码 * 匿名发表需要进行验证!
     
           
    中国面包师贴吧-中国烘焙师贴吧- 弹性深蓝色可爱版右侧悬浮qq在线客服代码
    在线咨询 x
    有什么可以帮到您
    点击咨询
    -粤ICP备13040473号-2