標(biāo)題:
STM32風(fēng)力擺控制系統(tǒng)源程序
[打印本頁(yè)]
作者:
紅燭
時(shí)間:
2019-8-3 17:16
標(biāo)題:
STM32風(fēng)力擺控制系統(tǒng)源程序
最近準(zhǔn)備TI 杯電子設(shè)計(jì)大賽練習(xí)了15年國(guó)賽的風(fēng)力擺控制系統(tǒng),
兩篇帖子后將此題做得基本符合要求,stm32代碼在附件中,可參考
風(fēng)力擺控制系統(tǒng) 最終測(cè)試版.7z
(418.13 KB, 下載次數(shù): 44)
2019-8-3 17:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "math.h"
#include "pwm.h"
#include "outputdata.h"
//#include "timer.h"
//顯示屏短屏長(zhǎng)度250左右,長(zhǎng)屏長(zhǎng)度320左右
#define PI 3.14159265358979323846
typedef signed int u32_t;
//全局變量
double pitch_temp,roll_temp;
double pitch_temp1,pitch_temp2,roll_temp1,roll_temp2;
u8 key,flag;
float R=0,H=87,angle=0,Speed=0;
float M1_PWM=0.0,M2_PWM=0.0;
u32 MoveTime=0;
double set_x=0.0 , set_y=0.0;
int str[3]={0};
int str_cur ,motor_flag;
int init_flag=0;
const float priod=659; //單擺周期 1660/2.5=664 659
float A=0.0;
float Normalization=0.0;
double Omega=0.0;
extern u32 count;
//MPU初始化成功顯示
void mpu_ok_Init(void){
while(mpu_dmp_init())
{
LCD_ShowString(30,250,200,16,16,"MPU6050 Error");
delay_ms(200);
LCD_Fill(30,250,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,270,200,16,16,"MPU6050 OK");
}
//
void show_angle(void){
POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
LCD_ShowString(30,200,200,16,16," Temp: . C");
LCD_ShowString(30,220,200,16,16,"Pitch: . C");
LCD_ShowString(30,240,200,16,16," Roll: . C");
}
//獲取角度
void Get_angle(void){
u8 t=0,report=1; //默認(rèn)開(kāi)啟上報(bào)
int i;
float pitch,roll,yaw; //歐拉角
float pitch_sum,roll_sum;
short temp; //溫度
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
report=!report;
if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
}
pitch_temp2=pitch_temp1;
pitch_temp1=pitch_temp;
roll_temp2=roll_temp1;
roll_temp1=roll_temp;
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
temp=MPU_Get_Temperature(); //得到溫度值
for(i=0;i<5;i++)
{
mpu_dmp_get_data(&pitch,&roll,&yaw);
pitch_sum +=pitch;
roll_sum +=roll;
}
pitch_temp=(pitch_sum/5);
roll_temp=(roll_sum/5);
pitch_sum=0;
roll_sum=0;
if((t%10)==0)
{
if(temp<0)
{
LCD_ShowChar(30+48,200,'-',16,0); //顯示負(fù)號(hào)
temp=-temp; //轉(zhuǎn)為正數(shù)
}else LCD_ShowChar(30+48,200,' ',16,0); //去掉負(fù)號(hào)
LCD_ShowNum(30+48+8,200,temp/100,3,16); //顯示整數(shù)部分
LCD_ShowNum(30+48+40,200,temp%10,1,16); //顯示小數(shù)部分
temp=pitch_temp*10;
if(temp<0)
{
LCD_ShowChar(30+48,220,'-',16,0); //顯示負(fù)號(hào)
temp=-temp; //轉(zhuǎn)為正數(shù)
}else LCD_ShowChar(30+48,220,' ',16,0); //去掉負(fù)號(hào)
LCD_ShowNum(30+48+8,220,temp/10,3,16); //顯示整數(shù)部分
LCD_ShowNum(30+48+40,220,temp%10,1,16); //顯示小數(shù)部分
temp=roll_temp*10;
if(temp<0)
{
LCD_ShowChar(30+48,240,'-',16,0); //顯示負(fù)號(hào)
temp=-temp; //轉(zhuǎn)為正數(shù)
}else LCD_ShowChar(30+48,240,' ',16,0); //去掉負(fù)號(hào)
LCD_ShowNum(30+48+8,240,temp/10,3,16); //顯示整數(shù)部分
LCD_ShowNum(30+48+40,240,temp%10,1,16); //顯示小數(shù)部分
t=0;
LED0=!LED0;//LED閃爍
}
}
t++;
}
//設(shè)置角度
int a=0;
void Set_angle(void){
key=KeyScan();
switch(key){
case 1 : str[str_cur++]=1; break ;
case 2 : str[str_cur++]=2; break ;
case 3 : str[str_cur++]=3; break ;
case 4 : str[str_cur++]=4; break ;
case 5 : str[str_cur++]=5; break ;
case 6 : str[str_cur++]=6; break ;
case 7 : str[str_cur++]=7; break ;
case 8 : str[str_cur++]=8; break ;
case 9 : str[str_cur++]=9; break ;
case 10 : str[str_cur++]=0; break ;
case 11 : {
angle=str[0]*100+str[1]*10+str[2];
str[0]=0;str[1]=0;str[2]=0;str_cur = 0;
a=1;
}
break ;
default: break;
}
LCD_ShowNum(60+48,100,str[0],1,24);
LCD_ShowNum(60+48+12,100,str[1],1,24);
LCD_ShowNum(60+48+24,100,str[2],1,24);
LCD_ShowString(80,50,200,16,16,"setting angle");
}
//設(shè)置半徑
void Set_R(void){
key=KeyScan();
switch(key){
case 1 : str[str_cur++]=1; break ;
case 2 : str[str_cur++]=2; break ;
case 3 : str[str_cur++]=3; break ;
case 4 : str[str_cur++]=4; break ;
case 5 : str[str_cur++]=5; break ;
case 6 : str[str_cur++]=6; break ;
case 7 : str[str_cur++]=7; break ;
case 8 : str[str_cur++]=8; break ;
case 9 : str[str_cur++]=9; break ;
case 10 : str[str_cur++]=0; break ;
case 11 : {
R=str[0]*10+str[1];
str[0]=0;str[1]=0;str_cur = 0;
a=1;
}
break ;
default: break;
}
LCD_ShowNum(60+48,100,str[0],1,24);
LCD_ShowNum(60+48+12,100,str[1],1,24);
LCD_ShowString(80,50,200,16,16,"setting R");
}
//PID調(diào)節(jié)
float PID_Adjust(float Point,float Cur_p,float Ki,float Kp,float Kd){
float error,error1,error2;
error=Point-Cur_p;
Speed=Ki*error+Kp*(error-error1)+Kd*(error-2*error1+error2);
error2=error1;
error1=error;
return Speed; //角度轉(zhuǎn)換成占空比
}
//輸出占空比
void MotorMove(u32_t M1_PWM,u32_t M2_PWM ){
if((pitch_temp-pitch_temp1<=0)&&(pitch_temp1-pitch_temp2<=0)&&(pitch_temp>=0)){ //**********motor 1 &&(MoveTime%659>=165)&&(MoveTime%659<=329)
if(set_x>pitch_temp){
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
OutData[2]=abs(M1_PWM)*0.74;
}
else if(set_x<pitch_temp){
TIM_SetCompare1(TIM3,abs(M1_PWM)*0.18);
TIM_SetCompare2(TIM3,0);
OutData[2]=-abs(M1_PWM)*0.18; //0.1942
}
else {
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,0);
OutData[2]=0;
}
}
else if((pitch_temp-pitch_temp1>=0)&&(pitch_temp1-pitch_temp2>=0)&&(pitch_temp<=0)){ //&&(MoveTime%659>=495)&&(MoveTime%659<=659)
if(set_x<pitch_temp){
TIM_SetCompare1(TIM3,abs(M1_PWM));
TIM_SetCompare2(TIM3,0);
OutData[2]=-abs(M1_PWM);
}
else if(set_x>pitch_temp){
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,abs(M1_PWM)*0.18*0.74);//*0.25
OutData[2]=abs(M1_PWM)*0.18*0.74;
}
else {
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,0);
OutData[2]=0;
}
}
else {
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,0);
OutData[2]=0;
}
//*****************************************************************************************motor 2
if((roll_temp-roll_temp1<=0)&&(roll_temp1-roll_temp2<=0)&&(roll_temp>=0)){ //***********motor 2
if(set_y>roll_temp){
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);
OutData[1]=abs(M2_PWM)*0.708;
}else if(set_y<roll_temp){
TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65*0.18);
TIM_SetCompare4(TIM3,0);
OutData[1]=-abs(M2_PWM)*0.18;
}
else {
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,0);
OutData[1]=0;
}
}
else if((roll_temp-roll_temp1>=0)&&(roll_temp1-roll_temp2>=0)&&(roll_temp<=0)){
if(set_y<roll_temp){
TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
TIM_SetCompare4(TIM3,0);
OutData[1]=-abs(M2_PWM)*0.65;
}else if(set_y>roll_temp){
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708*0.18);
OutData[1]=abs(M2_PWM)*0.18*0.708;
}
else {
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,0);
OutData[1]=0;
}
}
else {
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,0);
OutData[1]=0;
}
}
//第四個(gè)任務(wù)輸出占空比
void MotorMove2(u32_t M1_PWM,u32_t M2_PWM ){
if(set_x>pitch_temp){
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,abs(M1_PWM)*0.74);
OutData[2]=abs(M1_PWM)*0.74;
}
else if(set_x<pitch_temp){
TIM_SetCompare1(TIM3,abs(M1_PWM));
TIM_SetCompare2(TIM3,0);
OutData[2]=-abs(M1_PWM); //0.1942
}
//*****************************************************************************************motor 2
if(set_y>roll_temp){
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,abs(M2_PWM)*0.708);
OutData[1]=abs(M2_PWM)*0.708;
}else if(set_y<roll_temp){
TIM_SetCompare3(TIM3,abs(M2_PWM)*0.65);
TIM_SetCompare4(TIM3,0);
OutData[1]=-abs(M2_PWM)*0.65;
}
}
//任務(wù)一
void Mode_1(void){ //R=25,H=87.8
MoveTime=MoveTime+5;
Normalization=MoveTime/priod;
if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
else {Omega=2.0*PI*Normalization;motor_flag=0;}
A=atan((R/H))*57.2958;
set_x=A*sin(Omega);
M1_PWM = PID_Adjust(set_x,pitch_temp,475,0,0); //470
M2_PWM = PID_Adjust(0,roll_temp,500,0.2525,0);
if(M1_PWM > 3000) M1_PWM = 3000;
if(M1_PWM < -3000) M1_PWM = -3000;
if(M2_PWM > 3000) M2_PWM = 3000;
if(M2_PWM < -3000) M2_PWM = -3000;
MotorMove(M1_PWM,M2_PWM);
OutData[0]=set_x*100;
OutData[1]=pitch_temp*100;
// OutData[2]=set_y*100;
// OutData[3]=roll_temp*100;
OutPut_Data();
}
//任務(wù)三
void Mode_2(void){ //R=25,H=87.8,angle=0,Speed=0;
int flag=0;
float Ax=0.0,Ay=0.0;
MoveTime=MoveTime+5;
Normalization=MoveTime/priod;
if(angle>=180) angle=angle-180;
if(angle==30) angle=32;
if(angle==60) angle=65;
if(angle==0) flag=1;
else if(angle==90) flag=2;
else flag=3;
if(flag==1){
if(pitch_temp<=0.5&&pitch_temp>=-0.5&&pitch_temp-pitch_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
else {Omega=2.0*PI*Normalization;motor_flag=0;}
}else if(flag==3){
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
else {Omega=2.0*PI*Normalization;motor_flag=0;}
}else if(flag==2){
if(roll_temp<0.5&&roll_temp>-0.5&&roll_temp-roll_temp1>0&&count>659) {MoveTime=0;motor_flag=1;}
else {Omega=2.0*PI*Normalization;motor_flag=0;}
}
A=atan((25/H))*57.2958;
Ax=A*cos((u32)angle*0.017453);
Ay=A*sin((u32)angle*0.017453);
set_x=Ax*sin(Omega);
set_y=Ay*sin(Omega);
M1_PWM = PID_Adjust(set_x,pitch_temp,500,0.0,0);
M2_PWM = PID_Adjust(set_y,roll_temp,500,0.25,0);
if(M1_PWM > 3000) M1_PWM = 3000;
if(M1_PWM < -3000) M1_PWM = -3000;
if(M2_PWM > 3000) M2_PWM = 3000;
if(M2_PWM < -3000) M2_PWM = -3000;
MotorMove(M1_PWM,M2_PWM);
OutData[0]=set_x*100;
OutData[1]=pitch_temp*100;
// OutData[3]=motor_flag*1000;
OutData[2]=set_y*100;
OutData[3]=roll_temp*100;
OutPut_Data();
}
//任務(wù)四
void Mode_3(void){
if((pitch_temp>-45&&pitch_temp<45)||(roll_temp>-45&&roll_temp<45)){
M1_PWM = PID_Adjust(0,pitch_temp,175,0,0); // 150
M2_PWM = PID_Adjust(0,roll_temp,175,0,0); //150
if(M1_PWM > 3000) M1_PWM = 3000;
if(M1_PWM < -3000) M1_PWM = -3000;
if(M2_PWM > 3000) M2_PWM = 3000;
if(M2_PWM < -3000) M2_PWM = -3000;
}
else {
M1_PWM=0;
M2_PWM=0;
}
MotorMove2(M1_PWM,M2_PWM);
OutData[0]=pitch_temp*100;
OutData[3]=roll_temp*100;
OutPut_Data();
}
//任務(wù)五
void Mode_4(void){
float phase;
MoveTime=MoveTime+5;
Normalization=MoveTime/priod;
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))
else { Omega=2.0*PI*Normalization; motor_flag=0; }
A=atan((R/H))*57.2958;
phase=PI/2.0;
set_x=A*sin(Omega);
set_y=A*sin(Omega+phase); //phase
M1_PWM = PID_Adjust(set_x,pitch_temp,240,0,0); // 250
M2_PWM = PID_Adjust(set_y,roll_temp,200,0.15,0); // 250 0.2525
if(M1_PWM > 3000) M1_PWM = 3000;
if(M1_PWM < -3000) M1_PWM = -3000;
if(M2_PWM > 3000) M2_PWM = 3000;
if(M2_PWM < -3000) M2_PWM = -3000;
MotorMove(M1_PWM,M2_PWM);
OutData[0]=set_x*100;
OutData[1]=pitch_temp*100;
// OutData[3]=motor_flag*1000;
OutData[2]=set_y*100;
OutData[3]=roll_temp*100;
OutPut_Data();
}
//畫(huà)橢圓
void Mode_5(void){
float phase;
MoveTime=MoveTime+5;
Normalization=MoveTime/priod;
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))
else { Omega=2.0*PI*Normalization; motor_flag=0; }
A=atan((20/H))*57.2958;
phase=PI/4.0;
set_x=A*sin(Omega);
set_y=A*sin(Omega+phase); //phase
M1_PWM = PID_Adjust(set_x,pitch_temp,340,0,0); // 340
M2_PWM = PID_Adjust(set_y,roll_temp,340,0.2525,0); // 340
if(M1_PWM > 3000) M1_PWM = 3000;
if(M1_PWM < -3000) M1_PWM = -3000;
if(M2_PWM > 3000) M2_PWM = 3000;
if(M2_PWM < -3000) M2_PWM = -3000;
MotorMove(M1_PWM,M2_PWM);
OutData[0]=set_x*100;
OutData[1]=pitch_temp*100;
// OutData[3]=motor_flag*1000;
OutData[2]=set_y*100;
OutData[3]=roll_temp*100;
OutPut_Data();
}
//界面
void Menu(void){
flag=0;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"MENU");
LCD_ShowString(100,100,200,24,24,"mode1");
LCD_ShowString(100,130,200,24,24,"mode2");
LCD_ShowString(100,160,200,24,24,"mode3");
LCD_ShowString(100,190,200,24,24,"mode4");
switch(KeyScan()){
case 12 : {
LCD_ShowString(60,100,200,24,24,"->");
delay_ms(1000);
LCD_Clear(WHITE);
while(1){
Set_R();
if(key==11) {
LCD_Clear(WHITE);
mpu_ok_Init();
flag=1;
//TIM_Cmd(TIM5,ENABLE); 使能定時(shí)器3 init_flag=1;
init_flag=1;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode1");
break;
}
}
while(1){
key=KeyScan();
if(KEY_Scan(0)==WKUP_PRES)
{
TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
init_flag=1;
}
if(key==16){
TIM_Cmd(TIM5,DISABLE); // 關(guān)閉定時(shí)器3 同時(shí) init_flag==0
init_flag=0;
LCD_Clear(WHITE);
break;
}
}
} break ;
case 13 : {
LCD_ShowString(60,130,200,24,24,"->");
delay_ms(1000);
LCD_Clear(WHITE);
while(1){
Set_angle();
if(key==11) {
LCD_Clear(WHITE);
mpu_ok_Init();
flag=2;
//TIM_Cmd(TIM5,ENABLE); 使能定時(shí)器3 init_flag=1;
init_flag=1;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode2");
break;
}
}
while(1){
key=KeyScan();
if(KEY_Scan(0)==WKUP_PRES)
{
TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
init_flag=1;
}
if(key==16){
TIM_Cmd(TIM5,DISABLE); // 關(guān)閉定時(shí)器3 同時(shí) init_flag==0
init_flag=0;
LCD_Clear(WHITE);
break;
}
}
} break ;
case 14 : {
LCD_ShowString(60,160,200,24,24,"->");
delay_ms(1000);
LCD_Clear(WHITE);
mpu_ok_Init();
flag=3;
//TIM_Cmd(TIM5,ENABLE); 使能定時(shí)器3 init_flag=1;
init_flag=1;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode3");
while(1){
key=KeyScan();
if(KEY_Scan(0)==WKUP_PRES)
{
TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
init_flag=1;
}
if(key==16){
TIM_Cmd(TIM5,DISABLE); // 關(guān)閉定時(shí)器3 同時(shí) init_flag==0
init_flag=0;
LCD_Clear(WHITE);
break;
}
}
} break ;
case 15 : {
LCD_ShowString(60,190,200,24,24,"->");
delay_ms(1000);
LCD_Clear(WHITE);
while(1){
Set_R();
if(key==11) {
LCD_Clear(WHITE);
mpu_ok_Init();
flag=4;
//TIM_Cmd(TIM5,ENABLE); 使能定時(shí)器3 init_flag=1;
init_flag=1;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode4");
break;
}
}
while(1){
if(KEY_Scan(0)==WKUP_PRES)
{
TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
init_flag=1;
}
key=KeyScan();
if(key==16){
TIM_Cmd(TIM5,DISABLE); // 關(guān)閉定時(shí)器3 同時(shí) init_flag==0
init_flag=0;
LCD_Clear(WHITE);
break;
}
}
} break ;
default:break;
}
}
//模式1
void mode1(void){
int key=0;
LCD_Clear(WHITE);
while(1){
key=KeyScan();
while(a==0){
Set_R();
}
if(key==13){
LCD_Clear(WHITE);
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode1");
show_angle();
flag=1;
init_flag=1;
}
if(key==16){
init_flag=0;
a=0;
LCD_Clear(WHITE);
return;
}
}
}
//模式2
void mode2(void){
int key=0;
LCD_Clear(WHITE);
while(1){
key=KeyScan();
while(a==0){
Set_angle();
}
if(key==13){
LCD_Clear(WHITE);
flag=2;
init_flag=1;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode2");
show_angle();
init_flag=1;
}
if(key==16){
init_flag=0;
a=0;
LCD_Clear(WHITE);
return;
}
}
}
//模式3
void mode3(void){
int key=0;
LCD_Clear(WHITE);
while(1){
key=KeyScan();
flag=3;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode3");
show_angle();
init_flag=1;
if(key==16){
init_flag=0;
LCD_Clear(WHITE);
return;
}
}
}
//模式4
void mode4(void){
int key=0;
LCD_Clear(WHITE);
while(1){
key=KeyScan();
while(a==0){
Set_R();
}
if(key==13){
LCD_Clear(WHITE);
flag=4;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode4");
show_angle();
init_flag=1;
}
if(key==16){
init_flag=0;
a=0;
init_flag=0;
LCD_Clear(WHITE);
return;
}
}
}
//模式5
void mode5(void){
int key=0;
LCD_Clear(WHITE);
while(1){
key=KeyScan();
flag=5;
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"mode5");
show_angle();
init_flag=1;
if(key==16){
init_flag=0;
LCD_Clear(WHITE);
return;
}
}
}
//菜單
void Menu1(void){
int key=0,flag=0;
while(1){
key=KeyScan();
if(key==12){
LCD_Fill(60,100,100,250,WHITE);
flag ++;
if(flag==6) flag=1;
}
if(flag==1) LCD_ShowString(60,100,200,24,24,"->");
else if(flag==2) LCD_ShowString(60,130,200,24,24,"->");
else if(flag==3) LCD_ShowString(60,160,200,24,24,"->");
else if(flag==4) LCD_ShowString(60,190,200,24,24,"->");
else if(flag==5) LCD_ShowString(60,220,200,24,24,"->");
if(key==11&&flag==1){
mode1();
}else if(key==11&&flag==2){
mode2();
}else if(key==11&&flag==3){
mode3();
}else if(key==11&&flag==4){
mode4();
}else if(key==11&&flag==5){
mode5();
}
LCD_DrawRectangle(10, 10, 230, 310);
LCD_ShowString(100,40,200,24,24,"MENU");
LCD_ShowString(100,100,200,24,24,"mode1");
LCD_ShowString(100,130,200,24,24,"mode2");
LCD_ShowString(100,160,200,24,24,"mode3");
LCD_ShowString(100,190,200,24,24,"mode4");
LCD_ShowString(100,220,200,24,24,"mode5");
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(168); //初始化延時(shí)函數(shù)
uart_init(115200); //初始化串口波特率為500000
LED_Init(); //初始化LED
KEY_Init(); //初始化按鍵
KEY1_Init();
LCD_Init(); //LCD初始化
MPU_Init(); //初始化MPU6050
POINT_COLOR=RED;//設(shè)置字體為紅色
TIM3_PWM_Init(3000,0); //84M/84=1Mhz的計(jì)數(shù)頻率,重裝載值500,所以PWM頻率為 1M/500=2Khz.
TIM5_Int_Init(1000-1,84-1);//定時(shí)器3初始化 計(jì)數(shù)頻率為1Mhz,PWM頻率為 1M/1000=1Khz. 1ms進(jìn)一次中斷
mpu_ok_Init();
TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
while(1)
{
// if(KEY_Scan(0)==WKUP_PRES)
// {
// TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器3
// init_flag=1;
// }
Menu1();
}
}
復(fù)制代碼
作者:
janson
時(shí)間:
2019-8-4 08:26
學(xué)習(xí)了
作者:
cjc942688
時(shí)間:
2019-8-5 08:26
厲害了
作者:
今晚月色真美20
時(shí)間:
2019-11-28 20:49
可以加qq交流一下嗎,有些程序感覺(jué)有點(diǎn)不懂。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1