基于STM32F103的模拟时钟
基于STM32F103的模拟时钟,精确到秒,具有时间设置和自动感应转向功能
标签
嵌入式系统
STM32
模拟时钟
huazi_
更新2021-02-27
1857

一,基于STM32F103的模拟时钟的基本功能

   1.时间显示功能,可以精确到秒

   2.可以通过手动设置来调整时间的时、分、秒

   3.拥有感应重力方向并自动转向功能

二、开发软件

   本项目只使用了标准固件库以及Keil MDK编译器搭建工程框架,使用基本流程创建项目。

   但是意法半导体的STM32cubemx也是值得我们学习使用的好工具。通过使用stm32cubemx 软件配置外设驱动,配置液晶驱动,按键驱动,iic驱动,rtc驱动,以及单片机内部时钟配置等,通过可视化配置外设,大大提高开发效率,keilv5用于代码编写,编译,通过板载仿真器,进行仿真,烧录。

三、硬件

   该项目使用的口袋开发平台的 STM32F103RBT6,具有128KB Flash,20KB Ram。该开发板上具有独立按键、蜂鸣器、姿态传感器、LCD等多种基础的片外外设,是一块较为完整的开发板。

FiWyFc3lfD3-d8RhPrdsd7LlT6NY

四、项目简介

    本项目目的是使用平台完成一个可以设置时间的12小时制模拟时钟,转动板子,LCD屏上的时钟会自动跟着旋转,但是按键功能提示图标不变,依旧和按键对应。作为模拟时钟表盘的设计以及转动板子时的图像旋转都要对LCD的基本功能进行考量,板子的旋转需要用到板上的姿态传感器MPU6050来感测。该项目本身(模拟时钟)并无太大难度。项目中遇到的最大困难在于对MPU6050测得的数据进行欧拉角的转化以及LCD的旋转绘制。

五、固件库的下载安装

FpWBONea2kvdaU2gIObT_8gmrgd8

   STM32F103的标准固件库的下载卡了我不少时间,不知道为什么,在官网上下载不仅下载速度巨慢,而且还失败了好几次,后来又不知什么原因下载成功了(虽然下载速度还是慢了点)

六、初始界面

FhJX39nZuj_ZwHqBJYBPslaa9ali

void LCD_Init(void)
{
	uint8_t r = 0;
	//LCD Init
	ST7789_Init();
	LCD_Fill(0, 0, LCD_H, LCD_V, BLACK);
	LCD_ShowString( 24, 190, (uint8_t*)"huazi's Clock", WHITE, BLACK, 32, 0);//可以签上自己名字
	LCD_BL_Set();
	for(r=90;r<95;r++)
	{
		Draw_Circle(120, 97, r, WHITE);//画表盘
	}
	for(r=0;r<3;r++)//画刻度
	{
		LCD_DrawLine(120-1+r,   7, 120-1+r,  22, WHITE);
		LCD_DrawLine(120-1+r, 187, 120-1+r, 172, WHITE);
		LCD_DrawLine( 30, 97-1+r,  45, 97-1+r, WHITE);
		LCD_DrawLine(210, 97-1+r, 195, 97-1+r, WHITE);
	}
	LCD_DrawLine(120+78, 97+45, 120+66, 97+38, WHITE);
	LCD_DrawLine(120-78, 97+45, 120-66, 97+38, WHITE);
	LCD_DrawLine(120+78, 97-45, 120+66, 97-38, WHITE);
	LCD_DrawLine(120-78, 97-45, 120-66, 97-38, WHITE);
	LCD_DrawLine(120+45, 97+78, 120+38, 97+66, WHITE);
	LCD_DrawLine(120+45, 97-78, 120+38, 97-66, WHITE);
	LCD_DrawLine(120-45, 97+78, 120-38, 97+66, WHITE);
	LCD_DrawLine(120-45, 97-78, 120-38, 97-66, WHITE);
	
	LCD_DrawLine(120, 97, 120, 30, RED);
	LCD_DrawLine(120, 97, 120+21, 97+36, WHITE);
	LCD_DrawPoint(120, 97, YELLOW);
	
}

七、时钟界面

	Draw_Clock(RX, RY, 90, 10);
	LCD_DrawLine(RX, RY, clock[oldstate][Minute][time[Minute]][X], clock[oldstate][Minute][time[Minute]][Y], WHITE);//分针
	LCD_DrawLine(RX, RY, clock[oldstate][Hour][time[Hour]*5+5*time[Minute]/60][X], clock[oldstate][Hour][time[Hour]*5+5*time[Minute]/60][Y], BLUE);//时针
	LCD_DrawLine(RX, RY, clock[oldstate][Second][time[Second]][X], clock[oldstate][Second][time[Second]][Y], RED);//秒针
	
	LCD_ShowString( 4, 200, (uint8_t*)"-   +   >   *", WHITE, BLACK, 32, 0);//按键提示

八、设置时间界面

LCD_ShowString(clkset[oldstate][0][X], clkset[oldstate][0][Y], (uint8_t*)" Set Time", WHITE, BLACK, 32, oldstate);
LCD_ShowIntNum(clkset[oldstate][1][X], clkset[oldstate][1][Y], time[Hour]  , 2, BLACK, WHITE, 32, oldstate);
LCD_ShowString(clkset[oldstate][2][X], clkset[oldstate][2][Y], (uint8_t*)":", WHITE, BLACK, 32, oldstate);
LCD_ShowIntNum(clkset[oldstate][3][X], clkset[oldstate][3][Y], time[Minute], 2, WHITE, BLACK, 32, oldstate);
LCD_ShowString(clkset[oldstate][4][X], clkset[oldstate][4][Y], (uint8_t*)":", WHITE, BLACK, 32, oldstate);
LCD_ShowIntNum(clkset[oldstate][5][X], clkset[oldstate][5][Y], time[Second], 2, WHITE, BLACK, 32, oldstate);

九、mpu6050驱动

  姿态角有三个方向,本项目并不需要航向角,有两种解决办法。

方法一:直接读取加速度值经过各种算法进行零点偏移矫正然后再通过如下公式进行计算

//roll横滚角 pitch俯仰角 由加速计求得
roll=atan(ax/sqrt(ay^2+az^2));
pitch=atan(ay/sqrt(ax^2+az^2));

方法二:使用官方的DMP eMPL库

六、总结

   总之,通过这次项目,我更加地了解了单片机的工作模式以及STM32的开发应用,学习了STM32cubemx的使用,大大提高了开发效率,为以后的学习打下了夯实的基础,受益匪浅,收获颇多。感谢硬禾学堂组织的这次活动,让我有了提高自己的机会。

附件下载
clock_Pocket.zip
模拟时钟
团队介绍
南昌大学信息工程学院电赛基地
团队成员
江中华
普普通通大二学子一枚
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号