zoukankan      html  css  js  c++  java
  • (省二等奖)TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)

     配置

    第一步:右击工程,选择Options

    第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231

     第三步:在Debugger里选择FET Debugger:

     

    第四步: 检查FET Debugger里的设置是否正确,这里是Texas Instrument USB-IF采用Automatic方式

    这里选择Automatic与Automatic selection,当用串口会自动连接上串口。

     

     第五步:编译程序,下载验证

    电赛A题源码

    小车代码

    /*!
     *     COPYRIGHT NOTICE
     *     Copyright (c) 2016,CTGU-GB
     *     All rights reserved.
     *
     *
     * @file       main.c
    * @brief      MSP430F5529 平台主程序
    
     * @author     CTGU-GB
     * @version    v2.7
     * @date       2016-11-26
     */
    #include "include.h"
    #include "KEY.h"
    
    
    int key1,key2,stop_flag=0;
    
    int key_flag = 0;
    
    //定时器中断处理函数
    uint16_t Motor1,Motor2;
    __interrupt void TIMER_TB0_A0_IRQ_Handler()
    {
    
       GPIO_TurnBit  (P4, 7);
    
    }
    
    
    
    
    //ADC 中断处理函数
    float ad; 
    uint16_t ADC_MCH1,ADC_MCH2,Motor1,Motor2;
    __interrupt void ADC_IRQ_Handler()
    {
       if(ADC_GetITStatus(ADC_CH2) == TRUE)
       {
          ad = ADC_ReadChanelValue (ADC_CH2)*3.3/1023;   //读取后会自动清除标志位
          ADC_ClearITPendingBit(ADC_CH2);
       }
       if(ADC_GetITStatus(ADC_CH1) == TRUE)
       {
          ad = ADC_ReadChanelValue (ADC_CH1)*3.3/1023;   //读取后会自动清除标志位
          ADC_ClearITPendingBit(ADC_CH1);
       }
       
    }
    
    
    
    uint8_t key_data()
    {
        static _Bool glag=0;
        uint8_t key_value=0;
        if((KEY_isPressed(KEY1)==1||KEY_isPressed(KEY2)==1)&&glag==0)
        {
            DELAY_MS(100);
            if((KEY_isPressed(KEY1)==1||KEY_isPressed(KEY2)==1)&&glag==0)
            {
                glag=1;
                if(KEY_isPressed(KEY1)==1)   key_value=1;
                if(KEY_isPressed(KEY2)==1)   key_value=2;
            }
        }
        else if(KEY_isPressed(KEY1)==0||KEY_isPressed(KEY2)==0)  glag=0;
        
        return key_value;
    }
    
    
    void main()
    {
      uint8_t key_val = 0;
      uint8_t Data[1];  
      int a,b,c = 0;
      DisableInterrupts();          //禁止总中断  
      
      LED_Init(LED_ALL);              //LED灯初始化
      KEY_Init(KEY1,NULL);
      KEY_Init(KEY2,NULL);
      //LED_On (LED1);
      OLED_Init();                    //Oled初始化
      GPIO_Init(P3,0,GPI|PULL_UP);
      GPIO_Init(P3,1,GPI|PULL_UP);
      GPIO_Init(P2,1,GPI|PULL_UP);
      GPIO_Init(P1,1,GPI|PULL_UP);
      GPIO_Init(P7,0,GPI|PULL_UP);
       //GPIO_ReadBit(P2,1) == 0  读取按键按下为0
      
      
      //ADC配置///
      ADC_Init(ADC_CH1,ADC_VREF_3_3V,ADC_10bit);       //初始化通道,P6.1
      
      
    //  定时器配置
        Set_Vector_Handler(VECTOR_TIMER0_B0,TIMER_TB0_A0_IRQ_Handler);   //设置定时器TA1的中断服务程序为:TIMER1_A0_IRQ_Handler
        
        TIMER_Interval_Ms(TIMER_B0, 500);    //设置TA1为定时中断,中断时间为500Ms
        TIMER_ITConfig (TIMER_B0, TIMER_CCR0_IRQn, ENABLE);            //使能TIMER的某一个中断
        ///////////////////////////////////////////////////////////////////////////////////////////// 
      
        
        
    //  pwm配置
    //   定时器PWM输出初始化
        TIMER_PWM_MultiChannel_Init(TIMER_A2, 1000, 2, TIMER_CH1, TIMER_CH2);
        //GPIO_ResetBits(PORT2, GPIO_Pin_4|GPIO_Pin_5);
      //TIMER_CH1TIMER_CH2:{P2,4},{P2,5}
        //PWM输出占空比设置
        //999为满占空比与设置频率无关
        TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,50);  
        TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,50);
      ////////////////////////////////////////////////////////////////////////////////////////////////
        
        /*
       ///usrt配置//// 
       //配置串口1:TX={P4,4},.RX={P4,5}
      UART_Init        (UART1,9600);                      //初始化UART1模块,波特率115200,波特率高时最好把主时钟 设高些
      Set_Vector_Handler(VECTOR_UART1,UART_RX_IRQ_Handler);    //设置接收中断向量
      UART_ITConfig  (UART1,UART_RX_IRQn,TRUE);                //开串口接收中断
       //////////////////////////// 
       */
        
      EnableInterrupts();
      OLED_PrintfAt(FONT_ASCII_6X8,1,0,"function:");
      OLED_PrintfAt(FONT_ASCII_6X8,2,0,"ADC1:");//显示一个字符
      OLED_PrintfAt(FONT_ASCII_6X8,3,0,"key_count1:");//显示一个字符
      OLED_PrintfAt(FONT_ASCII_6X8,4,0,"key_count2:");//显示一个字符
      OLED_PrintfAt(FONT_ASCII_6X8,5,0,"recvie1:");//显示一个字符
      OLED_PrintfAt(FONT_ASCII_6X8,6,0,"recvie2:");//显示一个字符
      OLED_PrintfAt(FONT_ASCII_6X8,7,0,"Stop_flag:");//显示一个字符
      while(1)
      {
          
          /////////////////////要求2////////////////
    
             Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t); 
             OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]); 
             if(Data[0] == 2)
             {
                while(1){    
             float ad = ADC_ReadChanelOnce  (ADC_CH1)*3.3/1023;
             OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad);
            if(ad<0.5)
            {    
               
    
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,500);   //
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500);   //
                          
                          while(1)
                          {
                              
                          if(KEY_isPressed(KEY2))
                          {
                              
                              key_flag =1;
                              break;
                          
                          }
                           //运行中检测是否在充电标志,中心
                          if(GPIO_ReadBit(P7,0) == 0 )
                           {    
                               TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,0);
    
                                TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,0);  
                                OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
                                stop_flag =1;
                                break;
                           }
                           else
                               OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);    
                              
                              
                          a=GPIO_ReadBit(P3,0);
                          
                          b=GPIO_ReadBit(P3,1);
                          
    
                    //////////        //检测左边是否到达
                           if(a)
                           {
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
    
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);  
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
                           }
                            else{
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //
                           }
                       
                     //////////        //检测右边是否到达     
                         if(b)
                           {
                           TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);  
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); 
                            
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //
                         }
                         else{
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //
                            
                           }
                         if(a == 0&b == 0) 
                         {
                             
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550);   //
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);   //
                             
                         }
                       
                        }  
                        if(stop_flag == 1)
                        {
                        stop_flag = 0;
                        break;
                        
                        }
                        
                         if(key_flag == 1)
                        {
                        key_flag = 0;
                        break;
                        
                        }
                        
                        
                    }
             }
           }
           
          
          
           
     
       
           /////////////////////要求3////////////////////////////////
    
             Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t); 
             OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]); 
             if(Data[0] == 3)
             {
                while(1){    
             float ad = ADC_ReadChanelOnce  (ADC_CH1)*3.3/1023;
             OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad);
            if(ad<0.5)
            {    
               
    
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,500);   //
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500);   //
                          
                          while(1)
                          {
                              
                            if(KEY_isPressed(KEY2))
                          {
                              
                              key_flag =1;
                              break;
                          
                          }   
                              
                              
                           //运行中检测是否在充电标志,中心
                          if(GPIO_ReadBit(P7,0) == 0 )
                           {    
                               
                                OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
                               
                           }
                           else
                               OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);    
                              
                              
                          a=GPIO_ReadBit(P3,0);
                          
                          b=GPIO_ReadBit(P3,1);
                          
    
                    //////////        //检测左边是否到达
                           if(a)
                           {
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
    
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);  
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
                           }
                            else{
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //
                           }
                       
                     //////////        //检测右边是否到达     
                         if(b)
                           {
                           TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);  
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); 
                            
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //
                         }
                         else{
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //
                            
                           }
                         if(a == 0&b == 0) 
                         {
                             
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550);   //
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);   //
                             
                         }
                       
                        }
                        
                        if(key_flag == 1)
                        {
                        key_flag = 0;
                        break;
                        
                        }
                       
             }
           }
     } 
      
      
     
     
     
     
     
     
     
     
     
     
     
     
     
           /////////////////////要求4/////////////////////////
    
             Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t); 
             OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]); 
             if(Data[0] == 4)
             {
                DELAY_MS(59000);
              while(1){    
             //float ad = ADC_ReadChanelOnce  (ADC_CH1)*3.3/1023;
             //OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad);
            
               
    
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,500);   //
                          TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500);   //
                          
                          while(1)
                          {
                              
                            if(KEY_isPressed(KEY2))
                          {
                              
                              key_flag =1;
                              break;
                          
                          }   
                              
                              
                           //运行中检测是否在充电标志,中心
                          if(GPIO_ReadBit(P7,0) == 0 )
                           {    
                               
                                OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
                               
                           }
                           else
                               OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);    
                              
                              
                          a=GPIO_ReadBit(P3,0);
                          
                          b=GPIO_ReadBit(P3,1);
                          
    
                    //////////        //检测左边是否到达
                           if(a)
                           {
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
    
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);  
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
                           }
                            else{
                            OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //
                           }
                       
                     //////////        //检测右边是否到达     
                         if(b)
                           {
                           TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);  
                            TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); 
                            
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //
                         }
                         else{
                           OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //
                            
                           }
                         if(a == 0&b == 0) 
                         {
                             
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550);   //
                              TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);   //
                             
                         }
                       
                        }
                        
                        if(key_flag == 1)
                        {
                        key_flag = 0;
                        break;
                        
                        }
                       
           
           }
     } 
      
           
     
     
           
    
          ///////////////////////////设置////////////////////
            //key1-p2.1
            //key2-p1.1
    
          //p2.1设置,p1.1确定
          while(1)
          {
                   for(int i=0;i<1;i++)
              {
                    Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t); 
                    OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[i]); 
              }
                    key_val = key_data();
                    if(key_val)
                    {
                        if(key_val == 1)
                        {
                            key2 ++;
                            OLED_PrintfAt(FONT_ASCII_6X8,4,70,"%d",key2); 
                        }
                        else
                        {       
                            //赋值
                            Data[0]=key2;
                            
                          //先清除flash,再存
                          Flash_Erase_Segment(MAX_SEGMENT); 
                          Flash_Write_buf (MAX_SEGMENT,0,1,Data);
                            
                          //数据清零
                          Data[0]=0;
                          
                            key1 ++;
                            OLED_PrintfAt(FONT_ASCII_6X8,3,70,"%d",key1); 
                            //再读取
                                   for(int i=0;i<1;i++)
                          {
                                Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t); 
                                OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[i]); 
                                
                          }
                            if(Data[0] !=0) break;
                            
                        }
                    }
                    else 
                    {
                        
                        //sOLED_PrintfAt(FONT_ASCII_6X8,3,70,"%d",0); 
                    }
                    
          }
          /////////////////////////////////////////////////////////////
          
          
      
      }
    }
          
      
    View Code

    底板控制

    /*!
     *     COPYRIGHT NOTICE
     *     Copyright (c) 2016,CTGU-GB
     *     All rights reserved.
     *
     *
     * @file       main.c
    * @brief      MSP430F5529 平台主程序
    
     * @author     CTGU-GB
     * @version    v2.7
     * @date       2016-11-26
     */
    #include "include.h"
    
    
    
    //定时器中断处理函数
    uint16_t Motor1,Motor2;
    __interrupt void TIMER_TB0_A0_IRQ_Handler()
    {
    
       //GPIO_TurnBit  (P4, 7);
    
    }
    
    
    void main()
    {
      
      int Kal = 0;
      DisableInterrupts();          //禁止总中断
      
      LED_Init(LED_ALL);              //LED灯初始化
      OLED_Init();                    //Oled初始化
      LED_Off(LED1);
      LED_Off(LED2);
      GPIO_Init(P6,0,GPI|PULL_UP);
      GPIO_Init(P6,1,GPI|PULL_UP);
      GPIO_Init(P6,2,GPI|PULL_UP);
      GPIO_Init(P6,3,GPI|PULL_UP); 
      
      GPIO_Init(P1,2,GPI|PULL_UP);
      GPIO_Init(P1,3,GPI|PULL_UP);
      GPIO_Init(P1,4,GPI|PULL_UP);
      GPIO_Init(P1,5,GPI|PULL_UP);
      
    //  定时器配置
        Set_Vector_Handler(VECTOR_TIMER0_B0,TIMER_TB0_A0_IRQ_Handler);   //设置定时器TA1的中断服务程序为:TIMER1_A0_IRQ_Handler
        TIMER_Interval_Ms(TIMER_B0, 500);    //设置TA1为定时中断,中断时间为500Ms
        TIMER_ITConfig (TIMER_B0, TIMER_CCR0_IRQn, ENABLE);            //使能TIMER的某一个中断
        ///////////////////////////////////////////////////////////////////////////////////////////// 
        GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2|GPIO_Pin_3);
        
      EnableInterrupts();
     
      while(1)
      {   
         
          /*
           //开发射圈1
           GPIO_SetBits(PORT6, GPIO_Pin_0);
            //关其他发射圈
           GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2|GPIO_Pin_3);
          while(1)
          {
              
             while(GPIO_ReadBit(P1,2) ==1) 
                  {
                      
                  }
                    LED_Off(LED1);
             while(GPIO_ReadBit(P1,2) ==0)
    
                {
                    
                
                }
               LED_On(LED1);  
             while(GPIO_ReadBit(P1,2) ==1)
    
                {
                    
                
                }
               LED_Off(LED1);
             GPIO_SetBits(PORT6, GPIO_Pin_0);  
                  break;
           
          
          }
          */
          
          
          while(1)
          {
          
         
    
          if(GPIO_ReadBit(P1,3) == 0)
            {
                
               LED_On(LED1);
                //开发射圈1
                GPIO_SetBits(PORT6, GPIO_Pin_1);
                //关其他发射圈
                GPIO_ResetBits(PORT6, GPIO_Pin_2 |GPIO_Pin_3);
                
              while(GPIO_ReadBit(P1,3) ==0) 
                  {
                      
                  }
                    LED_Off(LED1);
                while(GPIO_ReadBit(P1,3) ==1)
    
                {
                    
                
                }
                    LED_On(LED2);            
                    
                while(GPIO_ReadBit(P1,3) ==0) 
                  {
                      
    
                  }
                LED_Off(LED2);        
                GPIO_ResetBits(PORT6, GPIO_Pin_1);
          }  
          
          
          
          
          else if(GPIO_ReadBit(P1,4) == 0)
             {
                  LED_On(LED1);
                //开发射圈1
                GPIO_SetBits(PORT6, GPIO_Pin_2);
                //关其他发射圈
                GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_3);
                
              while(GPIO_ReadBit(P1,4) ==0) 
                  {
                      
                  }
                    LED_Off(LED1);
                while(GPIO_ReadBit(P1,4) ==1)
    
                {
                    
                
                }
                    LED_On(LED2);            
                    
                while(GPIO_ReadBit(P1,4) ==0) 
                  {
                      
    
                  }
                LED_Off(LED2);        
                GPIO_ResetBits(PORT6, GPIO_Pin_2);
          }  
          
          
          
          else if(GPIO_ReadBit(P1,5) == 0)
            {
                 LED_On(LED1);
                //开发射圈1
                GPIO_SetBits(PORT6, GPIO_Pin_3);
                //关其他发射圈
                GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2);
                
              while(GPIO_ReadBit(P1,5) ==0) 
                  {
                      
                  }
                    LED_Off(LED1);
                while(GPIO_ReadBit(P1,5) ==1)
    
                {
                    
                
                }
                    LED_On(LED2);            
                    
                while(GPIO_ReadBit(P1,5) ==0) 
                  {
                      
    
                  }
                LED_Off(LED2);        
                GPIO_ResetBits(PORT6, GPIO_Pin_3);
            }
          
         
          //GPIO_SetBits  (PORT1, GPIO_Pin_0|GPIO_Pin_1); //P1.0,P1.1输出高电平
          //GPIO_SetBits() ; 
              
          
            //////////////////延时////////////////////
            //DELAY_MS(500);
    
          
        }
      }
    }
    View Code

    8.15号后会对代码思路及硬件做个记录。这几天会稍微休息一会。

  • 相关阅读:
    初学 python 之 多级菜单实现原理
    初学 python 之 用户登录实现过程
    Sqlmap使用教程
    对伪静态网站实施注射
    干货!IT小伙伴们实用的网站及工具大集合!持续更新!
    lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
    如何入门 Python 爬虫?
    在Windows Live Writer中插入C# code
    IIS装好后,局域网不能访问
    修改win7登录界面
  • 原文地址:https://www.cnblogs.com/-wenli/p/11334865.html
Copyright © 2011-2022 走看看