找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2697|回复: 3
打印 上一主题 下一主题
收起左侧

STM32风力摆控制系统源程序

[复制链接]
跳转到指定楼层
楼主
ID:594686 发表于 2019-8-3 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近准备TI 杯电子设计大赛练习了15年国赛的风力摆控制系统,

游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0
两篇帖子后将此题做得基本符合要求,stm32代码在附件中,可参考 风力摆控制系统 最终测试版.7z (418.13 KB, 下载次数: 44)

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "key.h"
  6. #include "lcd.h"
  7. #include "mpu6050.h"
  8. #include "inv_mpu.h"
  9. #include "inv_mpu_dmp_motion_driver.h"
  10. #include "math.h"
  11. #include "pwm.h"
  12. #include "outputdata.h"
  13. //#include "timer.h"


  14. //显示屏短屏长度250左右,长屏长度320左右
  15. #define PI 3.14159265358979323846
  16. typedef signed int u32_t;
  17. //全局变量
  18. double pitch_temp,roll_temp;
  19. double pitch_temp1,pitch_temp2,roll_temp1,roll_temp2;
  20. u8 key,flag;
  21. float R=0,H=87,angle=0,Speed=0;
  22. float M1_PWM=0.0,M2_PWM=0.0;
  23. u32 MoveTime=0;
  24. double set_x=0.0 , set_y=0.0;
  25. int str[3]={0};
  26. int str_cur ,motor_flag;
  27. int init_flag=0;
  28. const float priod=659;  //单摆周期   1660/2.5=664            659
  29. float A=0.0;
  30. float Normalization=0.0;
  31. double Omega=0.0;
  32. extern u32 count;
  33. //MPU初始化成功显示
  34. void mpu_ok_Init(void){
  35.         while(mpu_dmp_init())
  36.         {
  37.                 LCD_ShowString(30,250,200,16,16,"MPU6050 Error");
  38.                 delay_ms(200);
  39.                
  40.                 LCD_Fill(30,250,239,130+16,WHITE);
  41.                  delay_ms(200);
  42.         }
  43.         LCD_ShowString(30,270,200,16,16,"MPU6050 OK");
  44. }
  45. //
  46. void show_angle(void){
  47.         POINT_COLOR=BLUE;//设置字体为蓝色
  48.          LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");         
  49.          LCD_ShowString(30,200,200,16,16," Temp:    . C");        
  50.          LCD_ShowString(30,220,200,16,16,"Pitch:    . C");        
  51.          LCD_ShowString(30,240,200,16,16," Roll:    . C");
  52. }
  53. //获取角度
  54. void Get_angle(void){
  55.         u8 t=0,report=1;                        //默认开启上报
  56.         int i;
  57.         float pitch,roll,yaw;                 //欧拉角   
  58.         float pitch_sum,roll_sum;
  59.         short temp;                                        //温度        
  60.         key=KEY_Scan(0);
  61.         if(key==KEY0_PRES)
  62.         {
  63.                 report=!report;
  64.                 if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
  65.                 else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
  66.         }
  67.                 pitch_temp2=pitch_temp1;
  68.                 pitch_temp1=pitch_temp;               
  69.                 roll_temp2=roll_temp1;
  70.                 roll_temp1=roll_temp;
  71.         if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  72.         {
  73.                 temp=MPU_Get_Temperature();        //得到温度值               
  74.                 for(i=0;i<5;i++)
  75.                 {
  76.                         mpu_dmp_get_data(&pitch,&roll,&yaw);
  77.                         pitch_sum +=pitch;                                
  78.                         roll_sum +=roll;
  79.                         }
  80.                 pitch_temp=(pitch_sum/5);
  81.                 roll_temp=(roll_sum/5);
  82.                 pitch_sum=0;
  83.                 roll_sum=0;                        
  84.                 if((t%10)==0)
  85.                 {
  86.                         if(temp<0)
  87.                         {
  88.                                 LCD_ShowChar(30+48,200,'-',16,0);                //显示负号
  89.                                 temp=-temp;                //转为正数
  90.                         }else LCD_ShowChar(30+48,200,' ',16,0);                //去掉负号
  91.                         LCD_ShowNum(30+48+8,200,temp/100,3,16);                //显示整数部分            
  92.                         LCD_ShowNum(30+48+40,200,temp%10,1,16);                //显示小数部分
  93.                         temp=pitch_temp*10;
  94.                         if(temp<0)
  95.                         {
  96.                                 LCD_ShowChar(30+48,220,'-',16,0);                //显示负号
  97.                                 temp=-temp;                //转为正数
  98.                         }else LCD_ShowChar(30+48,220,' ',16,0);                //去掉负号
  99.                         LCD_ShowNum(30+48+8,220,temp/10,3,16);                //显示整数部分            
  100.                         LCD_ShowNum(30+48+40,220,temp%10,1,16);                //显示小数部分
  101.                         temp=roll_temp*10;
  102.                         if(temp<0)
  103.                         {
  104.                                 LCD_ShowChar(30+48,240,'-',16,0);                //显示负号
  105.                                 temp=-temp;                //转为正数
  106.                         }else LCD_ShowChar(30+48,240,' ',16,0);                //去掉负号
  107.                         LCD_ShowNum(30+48+8,240,temp/10,3,16);                //显示整数部分            
  108.                         LCD_ShowNum(30+48+40,240,temp%10,1,16);                //显示小数部分
  109.                         t=0;
  110.                         LED0=!LED0;//LED闪烁
  111.                 }
  112.         }
  113.         t++;
  114. }
  115. //设置角度
  116. int a=0;
  117. void Set_angle(void){
  118.         key=KeyScan();
  119.         switch(key){
  120.                         case 1 : str[str_cur++]=1;  break ;
  121.                         case 2 : str[str_cur++]=2;  break ;
  122.                         case 3 : str[str_cur++]=3;        break ;
  123.                         case 4 : str[str_cur++]=4;         break ;
  124.                         case 5 : str[str_cur++]=5;  break ;
  125.                         case 6 : str[str_cur++]=6;         break ;
  126.                         case 7 : str[str_cur++]=7;        break ;
  127.                         case 8 : str[str_cur++]=8;         break ;
  128.                         case 9 : str[str_cur++]=9;  break ;
  129.                         case 10 : str[str_cur++]=0;         break ;
  130.                         case 11 : {
  131.                                 angle=str[0]*100+str[1]*10+str[2];
  132.                                 str[0]=0;str[1]=0;str[2]=0;str_cur = 0;
  133.                                 a=1;
  134.                         }
  135.                         break ;
  136.                         default: break;
  137.                 }
  138.                 LCD_ShowNum(60+48,100,str[0],1,24);        
  139.                 LCD_ShowNum(60+48+12,100,str[1],1,24);        
  140.                 LCD_ShowNum(60+48+24,100,str[2],1,24);
  141.           LCD_ShowString(80,50,200,16,16,"setting angle");
  142. }
  143. //设置半径
  144. void Set_R(void){
  145.         key=KeyScan();
  146.         switch(key){
  147.                         case 1 : str[str_cur++]=1;  break ;
  148.                         case 2 : str[str_cur++]=2; break ;
  149.                         case 3 : str[str_cur++]=3;          break ;
  150.                         case 4 : str[str_cur++]=4;          break ;
  151.                         case 5 : str[str_cur++]=5;   break ;
  152.                         case 6 : str[str_cur++]=6;         break ;
  153.                         case 7 : str[str_cur++]=7;         break ;
  154.                         case 8 : str[str_cur++]=8;         break ;
  155.                         case 9 : str[str_cur++]=9;  break ;
  156.                         case 10 : str[str_cur++]=0;         break ;
  157.                         case 11 : {
  158.                                 R=str[0]*10+str[1];
  159.                                 str[0]=0;str[1]=0;str_cur = 0;
  160.                                 a=1;
  161.                         }
  162.                         break ;
  163.                         default: break;
  164.                 }
  165.                 LCD_ShowNum(60+48,100,str[0],1,24);        
  166.                 LCD_ShowNum(60+48+12,100,str[1],1,24);        
  167.           LCD_ShowString(80,50,200,16,16,"setting R");
  168. }
  169. //PID调节
  170. float PID_Adjust(float Point,float Cur_p,float Ki,float Kp,float Kd){
  171.         float error,error1,error2;
  172.         error=Point-Cur_p;
  173.         Speed=Ki*error+Kp*(error-error1)+Kd*(error-2*error1+error2);
  174.         error2=error1;
  175.   error1=error;
  176.         return Speed;   //角度转换成占空比
  177. }
  178. //输出占空比
  179. void MotorMove(u32_t M1_PWM,u32_t M2_PWM ){
  180.     if((pitch_temp-pitch_temp1<=0)&&(pitch_temp1-pitch_temp2<=0)&&(pitch_temp>=0)){    //**********motor 1    &&(MoveTime%659>=165)&&(MoveTime%659<=329)
  181.                         if(set_x>pitch_temp){
  182.                                 TIM_SetCompare1(TIM3,0);
  183.                                 TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
  184.                                 OutData[2]=abs(M1_PWM)*0.74;
  185.                         }
  186.                         else if(set_x<pitch_temp){
  187.                                 TIM_SetCompare1(TIM3,abs(M1_PWM)*0.18);
  188.                                 TIM_SetCompare2(TIM3,0);
  189.                                 OutData[2]=-abs(M1_PWM)*0.18;    //0.1942
  190.                         }
  191.                         else {
  192.                                 TIM_SetCompare1(TIM3,0);
  193.                                 TIM_SetCompare2(TIM3,0);
  194.                                 OutData[2]=0;
  195.                         }
  196.           }        
  197.                 else        if((pitch_temp-pitch_temp1>=0)&&(pitch_temp1-pitch_temp2>=0)&&(pitch_temp<=0)){   //&&(MoveTime%659>=495)&&(MoveTime%659<=659)
  198.                         if(set_x<pitch_temp){                                       
  199.                                 TIM_SetCompare1(TIM3,abs(M1_PWM));
  200.                                 TIM_SetCompare2(TIM3,0);
  201.                                 OutData[2]=-abs(M1_PWM);
  202.                         }
  203.                         else if(set_x>pitch_temp){
  204.                                 TIM_SetCompare1(TIM3,0);
  205.                                 TIM_SetCompare2(TIM3,abs(M1_PWM)*0.18*0.74);//*0.25
  206.                                 OutData[2]=abs(M1_PWM)*0.18*0.74;
  207.                         }
  208.                         else {
  209.                                 TIM_SetCompare1(TIM3,0);
  210.                                 TIM_SetCompare2(TIM3,0);
  211.                                 OutData[2]=0;
  212.                         }
  213.           }        
  214.                 else {
  215.                         TIM_SetCompare1(TIM3,0);
  216.                         TIM_SetCompare2(TIM3,0);
  217.                         OutData[2]=0;
  218.                 }
  219. //*****************************************************************************************motor 2
  220.                 if((roll_temp-roll_temp1<=0)&&(roll_temp1-roll_temp2<=0)&&(roll_temp>=0)){   //***********motor 2
  221.                         if(set_y>roll_temp){
  222.                                 TIM_SetCompare3(TIM3,0);
  223.                                 TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);  
  224.                                 OutData[1]=abs(M2_PWM)*0.708;
  225.                         }else if(set_y<roll_temp){
  226.                                 TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65*0.18);
  227.                                 TIM_SetCompare4(TIM3,0);  
  228.                                 OutData[1]=-abs(M2_PWM)*0.18;
  229.                         }
  230.                         else {
  231.                                 TIM_SetCompare3(TIM3,0);
  232.                                 TIM_SetCompare4(TIM3,0);
  233.                                 OutData[1]=0;
  234.                         }
  235.           }        
  236.                 else if((roll_temp-roll_temp1>=0)&&(roll_temp1-roll_temp2>=0)&&(roll_temp<=0)){
  237.                         if(set_y<roll_temp){
  238.                                 TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
  239.                                 TIM_SetCompare4(TIM3,0);
  240.                                 OutData[1]=-abs(M2_PWM)*0.65;
  241.                         }else if(set_y>roll_temp){
  242.                                 TIM_SetCompare3(TIM3,0);
  243.                                 TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708*0.18);
  244.                                 OutData[1]=abs(M2_PWM)*0.18*0.708;
  245.                         }
  246.                         else {
  247.                                 TIM_SetCompare3(TIM3,0);
  248.                                 TIM_SetCompare4(TIM3,0);
  249.                                 OutData[1]=0;
  250.                         }
  251.           }
  252.                 else {
  253.                         TIM_SetCompare3(TIM3,0);
  254.                         TIM_SetCompare4(TIM3,0);
  255.                         OutData[1]=0;
  256.                 }
  257. }
  258. //第四个任务输出占空比
  259. void MotorMove2(u32_t M1_PWM,u32_t M2_PWM ){
  260.                 if(set_x>pitch_temp){
  261.                         TIM_SetCompare1(TIM3,0);
  262.                         TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
  263.                         OutData[2]=abs(M1_PWM)*0.74;
  264.                 }
  265.                 else if(set_x<pitch_temp){
  266.                         TIM_SetCompare1(TIM3,abs(M1_PWM));
  267.                         TIM_SetCompare2(TIM3,0);
  268.                         OutData[2]=-abs(M1_PWM);    //0.1942
  269.                 }
  270. //*****************************************************************************************motor 2
  271.                 if(set_y>roll_temp){
  272.                         TIM_SetCompare3(TIM3,0);
  273.                         TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);  
  274.                         OutData[1]=abs(M2_PWM)*0.708;
  275.                 }else if(set_y<roll_temp){
  276.                         TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
  277.                         TIM_SetCompare4(TIM3,0);  
  278.                         OutData[1]=-abs(M2_PWM)*0.65;
  279.                 }
  280. }
  281. //任务一
  282. void Mode_1(void){          //R=25,H=87.8
  283.         MoveTime=MoveTime+5;
  284.         Normalization=MoveTime/priod;
  285.         if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
  286.         else {Omega=2.0*PI*Normalization;motor_flag=0;}
  287.         A=atan((R/H))*57.2958;
  288.         set_x=A*sin(Omega);        
  289.         M1_PWM = PID_Adjust(set_x,pitch_temp,475,0,0);      //470
  290.         M2_PWM = PID_Adjust(0,roll_temp,500,0.2525,0);         
  291.         
  292.         if(M1_PWM > 3000)  M1_PWM = 3000;
  293.         if(M1_PWM < -3000) M1_PWM = -3000;        
  294.         if(M2_PWM > 3000)  M2_PWM = 3000;
  295.         if(M2_PWM < -3000) M2_PWM = -3000;
  296.         
  297.         MotorMove(M1_PWM,M2_PWM);
  298.         
  299.         OutData[0]=set_x*100;
  300.         OutData[1]=pitch_temp*100;        
  301. //        OutData[2]=set_y*100;
  302. //        OutData[3]=roll_temp*100;
  303.         OutPut_Data();
  304. }
  305. //任务三
  306. void Mode_2(void){            //R=25,H=87.8,angle=0,Speed=0;
  307.         int flag=0;
  308.         float Ax=0.0,Ay=0.0;
  309.         MoveTime=MoveTime+5;
  310.         Normalization=MoveTime/priod;
  311.         if(angle>=180) angle=angle-180;
  312.         if(angle==30) angle=32;
  313.         if(angle==60) angle=65;
  314.         if(angle==0) flag=1;
  315.         else if(angle==90)        flag=2;
  316.         else flag=3;
  317.         if(flag==1){
  318.                 if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
  319.                 else {Omega=2.0*PI*Normalization;motor_flag=0;}
  320.         }else if(flag==3){
  321.                 if(((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0))&&count>659*2) {MoveTime=0;motor_flag=1;}   //((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0))  1977
  322.     else {Omega=2.0*PI*Normalization;motor_flag=0;}
  323.         }else if(flag==2){
  324.                 if(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
  325.                 else {Omega=2.0*PI*Normalization;motor_flag=0;}
  326.         }
  327.         A=atan((25/H))*57.2958;
  328.         Ax=A*cos((u32)angle*0.017453);
  329.         Ay=A*sin((u32)angle*0.017453);
  330.         set_x=Ax*sin(Omega);        
  331.   set_y=Ay*sin(Omega);        
  332.         M1_PWM = PID_Adjust(set_x,pitch_temp,500,0.0,0);      
  333.         M2_PWM = PID_Adjust(set_y,roll_temp,500,0.25,0);         
  334.         
  335.         if(M1_PWM > 3000)  M1_PWM = 3000;
  336.         if(M1_PWM < -3000) M1_PWM = -3000;        
  337.         if(M2_PWM > 3000)  M2_PWM = 3000;
  338.         if(M2_PWM < -3000) M2_PWM = -3000;
  339.         
  340.         MotorMove(M1_PWM,M2_PWM);
  341.         
  342.         OutData[0]=set_x*100;
  343.         OutData[1]=pitch_temp*100;        
  344. //        OutData[3]=motor_flag*1000;
  345.         OutData[2]=set_y*100;
  346.         OutData[3]=roll_temp*100;
  347.         OutPut_Data();
  348. }
  349. //任务四
  350. void Mode_3(void){
  351.         if((pitch_temp>-45&&pitch_temp<45)||(roll_temp>-45&&roll_temp<45)){
  352.                 M1_PWM = PID_Adjust(0,pitch_temp,175,0,0);      // 150     
  353.                 M2_PWM = PID_Adjust(0,roll_temp,175,0,0);       //150
  354.                 if(M1_PWM > 3000)  M1_PWM = 3000;
  355.                 if(M1_PWM < -3000) M1_PWM = -3000;        
  356.                 if(M2_PWM > 3000)  M2_PWM = 3000;
  357.                 if(M2_PWM < -3000) M2_PWM = -3000;        
  358.         }
  359.         else {
  360.                 M1_PWM=0;
  361.                 M2_PWM=0;
  362.         }
  363.         MotorMove2(M1_PWM,M2_PWM);
  364.         OutData[0]=pitch_temp*100;
  365.         OutData[3]=roll_temp*100;

  366.         OutPut_Data();
  367. }
  368. //任务五
  369. void Mode_4(void){
  370.         float phase;  
  371.         MoveTime=MoveTime+5;
  372.         Normalization=MoveTime/priod;
  373.         if((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&count>659*2) {MoveTime=0;motor_flag=1;}   //||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0))   &&(roll_temp<(A+2)&&roll_temp>(A-2))
  374.         else { Omega=2.0*PI*Normalization; motor_flag=0; }
  375.         A=atan((R/H))*57.2958;
  376.         phase=PI/2.0;
  377.         set_x=A*sin(Omega);        
  378.   set_y=A*sin(Omega+phase);  //phase
  379.         M1_PWM = PID_Adjust(set_x,pitch_temp,240,0,0);       // 250
  380.         M2_PWM = PID_Adjust(set_y,roll_temp,200,0.15,0);       //   250    0.2525
  381.         
  382.         if(M1_PWM > 3000)  M1_PWM = 3000;
  383.         if(M1_PWM < -3000) M1_PWM = -3000;        
  384.         if(M2_PWM > 3000)  M2_PWM = 3000;
  385.         if(M2_PWM < -3000) M2_PWM = -3000;
  386.         
  387.         MotorMove(M1_PWM,M2_PWM);
  388.         OutData[0]=set_x*100;
  389.         OutData[1]=pitch_temp*100;        
  390. //        OutData[3]=motor_flag*1000;
  391.         OutData[2]=set_y*100;
  392.         OutData[3]=roll_temp*100;
  393.         OutPut_Data();        
  394. }
  395. //画椭圆
  396. void Mode_5(void){
  397.         float phase;  
  398.         MoveTime=MoveTime+5;
  399.         Normalization=MoveTime/priod;
  400.         if((pitch_temp<0.5&&pitch_temp>-0.5&&pitch_temp-pitch_temp1>0)&&count>659*2) {MoveTime=0;motor_flag=1;}   //||(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0))   &&(roll_temp<(A+2)&&roll_temp>(A-2))
  401.         else { Omega=2.0*PI*Normalization; motor_flag=0; }
  402.         A=atan((20/H))*57.2958;
  403.         phase=PI/4.0;
  404.         set_x=A*sin(Omega);        
  405.   set_y=A*sin(Omega+phase);  //phase
  406.         M1_PWM = PID_Adjust(set_x,pitch_temp,340,0,0);       // 340
  407.         M2_PWM = PID_Adjust(set_y,roll_temp,340,0.2525,0);       //   340
  408.         
  409.         if(M1_PWM > 3000)  M1_PWM = 3000;
  410.         if(M1_PWM < -3000) M1_PWM = -3000;        
  411.         if(M2_PWM > 3000)  M2_PWM = 3000;
  412.         if(M2_PWM < -3000) M2_PWM = -3000;
  413.         
  414.         MotorMove(M1_PWM,M2_PWM);
  415.         OutData[0]=set_x*100;
  416.         OutData[1]=pitch_temp*100;        
  417. //        OutData[3]=motor_flag*1000;
  418.         OutData[2]=set_y*100;
  419.         OutData[3]=roll_temp*100;
  420.         OutPut_Data();        
  421. }
  422. //界面
  423. void Menu(void){
  424.          flag=0;
  425.          LCD_DrawRectangle(10, 10, 230, 310);
  426.          LCD_ShowString(100,40,200,24,24,"MENU");
  427.          LCD_ShowString(100,100,200,24,24,"mode1");
  428.          LCD_ShowString(100,130,200,24,24,"mode2");        
  429.          LCD_ShowString(100,160,200,24,24,"mode3");
  430.          LCD_ShowString(100,190,200,24,24,"mode4");
  431.          switch(KeyScan()){
  432.                         case 12 : {
  433.                                 LCD_ShowString(60,100,200,24,24,"->");
  434.                                 delay_ms(1000);
  435.                                 LCD_Clear(WHITE);
  436.                                 while(1){
  437.                                         Set_R();
  438.                                         if(key==11) {
  439.                                                 LCD_Clear(WHITE);
  440.                                                 mpu_ok_Init();
  441.                                                 flag=1;
  442.                                                 //TIM_Cmd(TIM5,ENABLE); 使能定时器3                            init_flag=1;
  443.                                                 init_flag=1;
  444.                                                 LCD_DrawRectangle(10, 10, 230, 310);
  445.                                                 LCD_ShowString(100,40,200,24,24,"mode1");
  446.                                                 break;
  447.                                         }
  448.                                 }
  449.                                 while(1){
  450.                                         key=KeyScan();
  451.                                                          if(KEY_Scan(0)==WKUP_PRES)
  452.                                         {
  453.                                                 TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  454.                                                 init_flag=1;
  455.                                         }
  456.                                         if(key==16){
  457.                                                 TIM_Cmd(TIM5,DISABLE); //  关闭定时器3   同时 init_flag==0
  458.                                                 init_flag=0;
  459.                                                 LCD_Clear(WHITE);
  460.                                                 break;
  461.                                         }
  462.                                 }
  463.                         }        break ;
  464.                         case 13 : {
  465.                                 LCD_ShowString(60,130,200,24,24,"->");
  466.                                 delay_ms(1000);
  467.                                 LCD_Clear(WHITE);
  468.                                 while(1){
  469.                                         Set_angle();
  470.                                         if(key==11) {
  471.                                                 LCD_Clear(WHITE);
  472.                                                 mpu_ok_Init();
  473.                                                 flag=2;
  474.                                                 //TIM_Cmd(TIM5,ENABLE); 使能定时器3                            init_flag=1;
  475.                                                 init_flag=1;
  476.                                                 LCD_DrawRectangle(10, 10, 230, 310);
  477.                                                 LCD_ShowString(100,40,200,24,24,"mode2");
  478.                                                 break;
  479.                                         }
  480.                                 }
  481.                                 while(1){
  482.                                         key=KeyScan();
  483.                                                  if(KEY_Scan(0)==WKUP_PRES)
  484.                                         {
  485.                                                 TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  486.                                                 init_flag=1;
  487.                                         }
  488.                                         if(key==16){
  489.                                                 TIM_Cmd(TIM5,DISABLE); //  关闭定时器3   同时 init_flag==0
  490.                                                 init_flag=0;
  491.                                                 LCD_Clear(WHITE);
  492.                                                 break;
  493.                                         }
  494.                                 }
  495.                         }                 break ;
  496.                         case 14 : {
  497.                                 LCD_ShowString(60,160,200,24,24,"->");
  498.                                 delay_ms(1000);
  499.                                 LCD_Clear(WHITE);
  500.                                 mpu_ok_Init();
  501.                                 flag=3;
  502.                                 //TIM_Cmd(TIM5,ENABLE); 使能定时器3                            init_flag=1;
  503.                                 init_flag=1;
  504.                                 LCD_DrawRectangle(10, 10, 230, 310);
  505.                                 LCD_ShowString(100,40,200,24,24,"mode3");
  506.                                 while(1){
  507.                                         key=KeyScan();
  508.                                                 if(KEY_Scan(0)==WKUP_PRES)
  509.                                         {
  510.                                                 TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  511.                                                 init_flag=1;
  512.                                         }
  513.                                         if(key==16){
  514.                                                 TIM_Cmd(TIM5,DISABLE); //  关闭定时器3   同时 init_flag==0
  515.                                                 init_flag=0;
  516.                                                 LCD_Clear(WHITE);
  517.                                                 break;
  518.                                         }
  519.                                 }
  520.                         }                        break ;
  521.                         case 15 : {
  522.                                 LCD_ShowString(60,190,200,24,24,"->");
  523.                                 delay_ms(1000);
  524.                                 LCD_Clear(WHITE);
  525.                                 while(1){
  526.                                         Set_R();
  527.                                         if(key==11) {
  528.                                                 LCD_Clear(WHITE);
  529.                                                 mpu_ok_Init();
  530.                                                 flag=4;  
  531.                                                 //TIM_Cmd(TIM5,ENABLE); 使能定时器3                            init_flag=1;
  532.                                                 init_flag=1;
  533.                                                 LCD_DrawRectangle(10, 10, 230, 310);
  534.                                                 LCD_ShowString(100,40,200,24,24,"mode4");
  535.                                                 break;
  536.                                         }
  537.                                 }
  538.                                 while(1){
  539.                                                 if(KEY_Scan(0)==WKUP_PRES)
  540.                                         {
  541.                                                 TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  542.                                                 init_flag=1;
  543.                                         }
  544.                                         key=KeyScan();
  545.                                         if(key==16){
  546.                                                 TIM_Cmd(TIM5,DISABLE); //  关闭定时器3    同时 init_flag==0
  547.                                                 init_flag=0;
  548.                                                 LCD_Clear(WHITE);
  549.                                                 break;
  550.                                         }
  551.                                 }
  552.                         }                 break ;
  553.                         default:break;
  554.                 }
  555. }
  556. //模式1
  557. void mode1(void){
  558.         int key=0;
  559.         LCD_Clear(WHITE);
  560.         while(1){
  561.                 key=KeyScan();
  562.                 while(a==0){
  563.                         Set_R();
  564.                 }
  565.                 if(key==13){
  566.                         LCD_Clear(WHITE);
  567.                         LCD_DrawRectangle(10, 10, 230, 310);
  568.                         LCD_ShowString(100,40,200,24,24,"mode1");
  569.                         show_angle();
  570.                         flag=1;        
  571.                         init_flag=1;
  572.                 }
  573.                 if(key==16){
  574.                         init_flag=0;
  575.                         a=0;
  576.                         LCD_Clear(WHITE);
  577.                         return;
  578.                 }
  579.         }
  580. }
  581. //模式2
  582. void mode2(void){
  583.         int key=0;
  584.         LCD_Clear(WHITE);
  585.         while(1){
  586.                 key=KeyScan();
  587.                 while(a==0){
  588.                 Set_angle();
  589.                 }
  590.                 if(key==13){
  591.                         LCD_Clear(WHITE);
  592.                         flag=2;        
  593.                         init_flag=1;
  594.                         LCD_DrawRectangle(10, 10, 230, 310);
  595.                         LCD_ShowString(100,40,200,24,24,"mode2");
  596.                         show_angle();
  597.                         init_flag=1;
  598.                 }
  599.                 if(key==16){
  600.                         init_flag=0;
  601.                         a=0;
  602.                         LCD_Clear(WHITE);
  603.                         return;
  604.                 }
  605.         }
  606. }
  607. //模式3
  608. void mode3(void){
  609.         int key=0;
  610.         LCD_Clear(WHITE);
  611.         while(1){
  612.                 key=KeyScan();
  613.                 flag=3;
  614.                 LCD_DrawRectangle(10, 10, 230, 310);
  615.           LCD_ShowString(100,40,200,24,24,"mode3");
  616.                 show_angle();
  617.                 init_flag=1;
  618.                 if(key==16){
  619.                         init_flag=0;
  620.                         LCD_Clear(WHITE);
  621.                         return;
  622.                 }
  623.         }
  624. }
  625. //模式4
  626. void mode4(void){
  627.         int key=0;
  628.         LCD_Clear(WHITE);
  629.         while(1){
  630.                 key=KeyScan();
  631.                 while(a==0){
  632.                 Set_R();
  633.                 }
  634.                 if(key==13){
  635.                         LCD_Clear(WHITE);
  636.                         flag=4;        
  637.                         LCD_DrawRectangle(10, 10, 230, 310);
  638.                         LCD_ShowString(100,40,200,24,24,"mode4");
  639.                         show_angle();
  640.                         init_flag=1;
  641.                 }
  642.                 if(key==16){
  643.                         init_flag=0;
  644.                         a=0;
  645.                         init_flag=0;
  646.                         LCD_Clear(WHITE);
  647.                         return;
  648.                 }
  649.         }
  650. }
  651. //模式5
  652. void mode5(void){
  653.         int key=0;
  654.         LCD_Clear(WHITE);
  655.         while(1){
  656.                 key=KeyScan();
  657.                 flag=5;
  658.                 LCD_DrawRectangle(10, 10, 230, 310);
  659.           LCD_ShowString(100,40,200,24,24,"mode5");
  660.                 show_angle();
  661.                 init_flag=1;
  662.                 if(key==16){
  663.                         init_flag=0;
  664.                         LCD_Clear(WHITE);
  665.                         return;
  666.                 }
  667.         }
  668. }
  669. //菜单
  670. void Menu1(void){
  671.         int key=0,flag=0;
  672.         while(1){
  673.                 key=KeyScan();
  674.                 if(key==12){
  675.                         LCD_Fill(60,100,100,250,WHITE);
  676.                         flag ++;
  677.                         if(flag==6) flag=1;
  678.                 }
  679.                 if(flag==1) LCD_ShowString(60,100,200,24,24,"->");
  680.                 else if(flag==2) LCD_ShowString(60,130,200,24,24,"->");
  681.                 else if(flag==3) LCD_ShowString(60,160,200,24,24,"->");
  682.                 else if(flag==4) LCD_ShowString(60,190,200,24,24,"->");
  683.                 else if(flag==5) LCD_ShowString(60,220,200,24,24,"->");
  684.                 if(key==11&&flag==1){
  685.                         mode1();
  686.                 }else if(key==11&&flag==2){
  687.                         mode2();
  688.                 }else if(key==11&&flag==3){
  689.                         mode3();
  690.                 }else if(key==11&&flag==4){
  691.                         mode4();
  692.                 }else if(key==11&&flag==5){
  693.                         mode5();
  694.                 }
  695.                 LCD_DrawRectangle(10, 10, 230, 310);
  696.                 LCD_ShowString(100,40,200,24,24,"MENU");
  697.                 LCD_ShowString(100,100,200,24,24,"mode1");
  698.                 LCD_ShowString(100,130,200,24,24,"mode2");        
  699.                 LCD_ShowString(100,160,200,24,24,"mode3");
  700.           LCD_ShowString(100,190,200,24,24,"mode4");
  701.                 LCD_ShowString(100,220,200,24,24,"mode5");
  702.         }
  703. }
  704. int main(void)        
  705. {
  706.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  707.         delay_init(168);  //初始化延时函数
  708.         uart_init(115200);                //初始化串口波特率为500000
  709.         LED_Init();                                        //初始化LED
  710.         KEY_Init();                                        //初始化按键
  711.         KEY1_Init();
  712.          LCD_Init();                                        //LCD初始化
  713.         MPU_Init();                                        //初始化MPU6050
  714.          POINT_COLOR=RED;//设置字体为红色
  715.         TIM3_PWM_Init(3000,0);        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
  716.         TIM5_Int_Init(1000-1,84-1);//定时器3初始化  计数频率为1Mhz,PWM频率为 1M/1000=1Khz.  1ms进一次中断        
  717.         mpu_ok_Init();        
  718.         TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  719.          while(1)
  720.         {         
  721. //                 if(KEY_Scan(0)==WKUP_PRES)
  722. //                {
  723. //                        TIM_Cmd(TIM5,ENABLE);    //使能定时器3
  724. //                        init_flag=1;
  725. //                }
  726.                 Menu1();
  727.         }
  728. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:221675 发表于 2019-8-4 08:26 | 只看该作者
学习了
回复

使用道具 举报

板凳
ID:595293 发表于 2019-8-5 08:26 来自手机 | 只看该作者
厉害了
回复

使用道具 举报

地板
ID:525734 发表于 2019-11-28 20:49 | 只看该作者
可以加qq交流一下吗,有些程序感觉有点不懂。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表