.
  • 作者:117.136.86.*
  • 2022/10/16 18:23:52
  • 中国面包师贴吧-楼主(阅:2192/回: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;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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) ;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // 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; //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)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // {
    // tmp=5000;
    //tmp=tmp;
    //case 0x02:
    //m=25;
    //break;
    // }
    // if(TXBUF0=0X03)
    // if (shuju0x03)
    // {
    //tmp=20000;
    //tmp=tmp;
    // case 0x03:
    // m=40;
    // break;
    // }
    // if(TXBUF0=0X04)
    // if (shuju0x04)
    //{
    // 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--);
    }
    1
    2
    3
    4
    5
    6
    }
    /*******************************************
    函数名称: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)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // {
    // tmp=5000;
    //tmp=tmp;
    case 0x02:
    m=25;
    break;
    // }
    // if(TXBUF0=0X03)
    // if (shuju0x03)
    // {
    //tmp=20000;
    //tmp=tmp;
    case 0x03:
    m=40;
    break;
    // }
    // if(TXBUF0=0X04)
    // if (shuju0x04)
    //{
    // 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;
    1
    // LPM1_EXIT; //退出低功耗模式
    }

    图片

    ————————————————
    版权声明:本文为CSDN博主「科技论坛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhangluan2019/article/details/109466186



    发帖须知:

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

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

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