一、环境介绍
MCU: STM32F103C8T6
姿态传感器: MPU6050
OLED显示屏: 0.96寸SPI接口OLED
温度传感器: DS18B20
编译软件: keil5
二、功能介绍完整项目源码下载地址: https://download.csdn.net/download/xiaolong1126626497/18657534
时钟可以根据MPU6050测量的姿态自动调整显示画面方向,也就是倒着拿、横着拿、反着拿都可以让时间显示是正对着自己的,时间支持自己调整,支持串口校准。可以按键切换页面查看环境温度显示。
支持串口时间校准:
三、核心代码
#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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?