| 
 
新手入门 
 
	积分16金钱16 注册时间2023-4-4在线时间5 小时 | 
 
| stm32f1想通过mpu6050控制灯带顺时针或逆时针流水一次就停止。直到标志位MPU6050_GetFlag()变化才再流水。不知道怎么设置程序。目前处于一直流水,标志位MPU6050_GetFlag()变化会更新方向,但是还是一直流水。 
 复制代码#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "MPU6050.h"
#include "DMP.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "RCC.h"
#include "IO.h"
#include "TIM3.h"
#include "WS2812B.h"
#include "OLED.h"
#include <stdlib.h>
#include "MPU6050_INT.h"
#define Brightness 0x010101
//关于MPU6050
uint8_t ID, INT;
int16_t AX, AY, AZ, GX, GY, GZ;
float pitch, roll, yaw;
uint8_t KeyNum, Count=0;
uint8_t Lock=0, Flow, FlowCount;
//关于WS2812B
uint8_t MODE=1;
uint8_t UpdateFlag=1;
uint8_t Light_Mode, Light_Flag, AngleFlag=0;
uint16_t Light_Time;
#define WS2812B_LED_QUANTITY        29  //灯珠数量-1
//后置函数的提前定义
void Close(void);
void WhiteLight(void);
void WhiteLight_Up(void);
void WhiteLight_Down(void);
void MainLoop(void);
void Init(void)
{
        RCC_Init();
        Key_Init();
        WS2812B_Init();
        TIM3_SetIRQHandler(MainLoop);
        TIM3_Init();
        LED_Init();
        OLED_Init();
        MPU6050_Init();
}
int main(void)
{
        Init();
        while(1)
        {
                get_angles((float)AX, (float)AY, (float)AZ, (float)GX, (float)GY, (float)GZ, &pitch, &roll, &yaw);
                
                KeyNum=Key_GetNum();
                if(KeyNum==0)
                {
                        Lock=!Lock;
                        if(Lock==1)
                        {
                                Light_Flag=1;
                                Close();
                        }
                        else
                        {
                                Light_Flag=0;
                        }                
                }
                if(Lock==0)
                {
//                        if(MPU6050_GetFlag()==1 && UpdateFlag==1) 
//                        {
                        if(MPU6050_GetFlag()==1) 
                        {
                                if(MPU6050_GetFlag()==1)
                                {
                                        UpdateFlag=0;
                                }
                                if(MPU6050_GetFlag()==2)
                                {
                                        UpdateFlag=1;
                                }
                                MODE=2;
                        } 
//                        if(MPU6050_GetFlag()==2 && UpdateFlag==1) 
//                        {
                        if(MPU6050_GetFlag()==2) 
                        {
                                if(MPU6050_GetFlag()==2)
                                {
                                        UpdateFlag=0;
                                }
                                if(MPU6050_GetFlag()==1)
                                {
                                        UpdateFlag=1;
                                }
                                MODE=3;
                        }
                }
                else
                {
                        OLED_ShowString(2,11,"LOCK  ");
                }
                switch(MODE)
                {
                        case 1:Close();break;
                        case 2:WhiteLight_Up();break;
                        case 3:WhiteLight_Down();break;
                }
        }
}
void Close(void)        //MODE=1
{
        WS2812B_SetBuf(0x000000);
        WS2812B_UpdateBuf();
}
void WhiteLight_Up(void)        //MODE=2
{
        if(Light_Flag==0)
        {
//                if(UpdateFlag==1)
//                {
                        uint8_t i;
                        static uint8_t j;
                        Light_Time=10;
                        for(i=0;i<WS2812B_LED_QUANTITY;i++)
                        {
                                WS2812B_Buf[i]=WS2812B_Buf[i+1];
                        }
                        if(j<5)
                        {
                                WS2812B_Buf[WS2812B_LED_QUANTITY]=Brightness;
                        }
                        else
                        {
                                WS2812B_Buf[WS2812B_LED_QUANTITY]=0;
                        }
                        
                        j++;
                        j%=40;
                        WS2812B_UpdateBuf();
//                }
        }
}
void WhiteLight_Down(void)        //MODE=3
{
        if(Light_Flag==0)
        {
//                if(UpdateFlag==1)
//                {
                        uint8_t i;
                        static uint8_t j;
                        Light_Time=10;
                        for(i=WS2812B_LED_QUANTITY;i>0;i--)
                        {
                                WS2812B_Buf[i]=WS2812B_Buf[i-1];
                        }
                        if(j<5)
                        {
                                WS2812B_Buf[0]=Brightness;
                        }
                        else
                        {
                                WS2812B_Buf[0]=0;
                        }
                        j++;
                        j%=40;
                        WS2812B_UpdateBuf();
//                }
        }
}
void MainLoop(void)
{
        static uint16_t LoopCount;
        LoopCount++;
        if(LoopCount>=Light_Time)
        {
                LoopCount=0;
        }
}
 
 | 
 |