您当前的位置: 首页 >  stm32

DS小龙哥

暂无认证

  • 2浏览

    0关注

    679博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

STM32+MPU6050设计便携式Mini桌面时钟(自动调整时间显示方向)

DS小龙哥 发布时间:2021-05-13 13:55:07 ,浏览量:2

一、环境介绍

MCU:  STM32F103C8T6

姿态传感器:  MPU6050

OLED显示屏:  0.96寸SPI接口OLED

温度传感器: DS18B20

编译软件: keil5 

二、功能介绍

完整项目源码下载地址: https://download.csdn.net/download/xiaolong1126626497/18657534

时钟可以根据MPU6050测量的姿态自动调整显示画面方向,也就是倒着拿、横着拿、反着拿都可以让时间显示是正对着自己的,时间支持自己调整,支持串口校准。可以按键切换页面查看环境温度显示。

支持串口时间校准: 

 

三、核心代码

3.1 main.c
#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include 
#include 
#include "exti.h"
#include "timer.h"
#include "rtc.h"
#include "wdg.h"
#include "ds18b20.h"
#include "oled.h"
#include "fontdata.h"
#include "adc.h"
#include "FunctionConfig.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 

/*
函数功能: 绘制时钟表盘框架
*/
void DrawTimeFrame(void)
{
	u8 i;
	OLED_Circle(32,32,31);//画外圆
	OLED_Circle(32,32,1); //画中心圆
	//画刻度
	for(i=0;i> 4;             //分离出温度值整数部分
    DS18B20_decT = DS18B20_temp & 0xF;            //分离出温度值小数部分
    sprintf((char*)DS18B20_TEMP_Info,"%d.%d",DS18B20_intT,DS18B20_decT);  //保存DS18B20温度信息,发送给上位机

    OLED_ShowString(34,0,16,"DS18B20");
    if(DS18B20_temp==0xFF)
    {
        OLED_ShowString(0,30,16,"                    ");  //清除一行的显示
        //显示温度错误信息
        OLED_ShowString(0,30,16,"DS18B20 Error!");
    }
    else
    {
        sprintf(DS18B20_buff,"%sC    ",DS18B20_TEMP_Info);
        //显示温度
        OLED_ShowString(40,30,16,DS18B20_buff);
    }
}

int main(void)
{
    u8 stat;
    u8 key_val;
	u32 TimeCnt=0;
    u16 temp_data; //温度数据
    short aacx,aacy,aacz;	  //加速度传感器原始数据
	short gyrox,gyroy,gyroz;  //陀螺仪原始数据
    short temp;
    float pitch,roll,yaw; 		//欧拉角
    u8 page_cnt=0; //显示的页面
    u8 display_state1=0;
    u8 display_state2=0;
	BEEP_Init(); //初始化蜂鸣器
	LED_Init();  //初始化LED
	KEY_Init();  //按键初始化
    DS18B20_Init(); //DS18B20
	USARTx_Init(USART1,72,115200);//串口1的初始化
	TIMERx_Init(TIM1,72,20000);   //辅助串口1接收。20ms为一帧数据。
	RTC_Init(); //RTC初始化
	OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示
    
    //OLED_Init(0xc0,0xa0); //OLED显示屏初始化--翻转显示
     while(MPU6050_Init())							//初始化MPU6050
    {
            printf("MPU6050陀螺仪初始化失败!\r\n");
            DelayMs(500);
    }
    
//    //注意:陀螺仪初始化的时候,必须正常摆放才可以初始化成
//    while(mpu_dmp_init())
//    {
//            printf("MPU6050陀螺仪设置DMP失败!\r\n");
//            DelayMs(1000);
//    }

	OLED_Clear(0x00); 						//清屏	
    DrawTimeFrame();  						//画时钟框架
	
    while(1)
	{	
        key_val=KEY_GetValue();
        if(key_val)
        {
            page_cnt=!page_cnt;
            //时钟页面
            if(page_cnt==0)
            {
                 //清屏
                OLED_Clear(0);
                DrawTimeFrame();  						//画时钟框架
                RTC->CRH|=14,temp_data&0xF);
            
//            stat=mpu_dmp_get_data(&pitch,&roll,&yaw);
//            temp=MPU6050_Get_Temperature();	//得到温度值
            //MPU6050_Get_Gyroscope(&gyrox,&gyroy,&gyroz);		//得到陀螺仪原始数据
            MPU6050_Get_Accelerometer(&aacx,&aacy,&aacz);		 //得到加速度传感器数据
            //printf("温度数据:%d\r\n",temp);
           // printf("陀螺仪原始数据  :x=%d y=%d z=%d\r\n",gyrox,gyroy,gyroz);
            printf("加速度传感器数据:x=%d y=%d z=%d\r\n",aacx,aacy,aacz);
//            printf("欧垃角:横滚角=%d 俯仰角=%d 航向角=%d\r\n",(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
//            
            
             //正着显示
            if(aacz>=15000)
            {
                printf("正着显示\n");
                if(display_state1!=1)
                {
                     display_state2=0;
                     display_state1=1;
                     OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示 
                }
            }
            //翻转显示
            else if(display_state2!=1) 
            {
                printf("反着显示\n");
                display_state1=0;
                display_state2=1;
                OLED_Init(0xc0,0xa0); //OLED显示屏初始化--翻转显示  
            }
        }
        if(page_cnt==1) //温度显示页面
        {
           DS18B20_ShowPageTable(temp_data);
        } 
	}	
}

3.2 mpu6050.c
#include "mpu6050.h"
#include "sys.h"
#include "delay.h"
#include 

/*--------------------------------------------------------------------IIC协议底层模拟时序--------------------------------------------------------------------------------*/

/*
硬件接线:
1 VCC 3.3V/5V 电源输入      --->接3.3V
2 GND 地线                  --->接GND
3 IIC_SDA IIC 通信数据线    -->PB6
4 IIC_SCL IIC 通信时钟线    -->PB7
5 MPU_INT 中断输出引脚	    ---->未接
6 MPU_AD0 IIC 从机地址设置引脚-->未接
			AD0引脚说明:ID=0X68(悬空/接 GND) ID=0X69(接 VCC)
*/

/*
函数功能:MPU IIC 延时函数
*/
void MPU6050_IIC_Delay(void)
{
	DelayUs(2);
}

/*
函数功能: 初始化IIC
*/
void MPU6050_IIC_Init(void)
{					     
 	RCC->APB2ENR|=1CRL|=0X33000000;	   
	GPIOB->ODR|=37;
				txd            
关注
打赏
1664009229
查看更多评论
0.0383s