• 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于STM32的数字秒表OLED显示设计Proteus仿真+程序代码+设计报告+讲解

9小时前
293
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

 

STM32的数字秒表OLED显示设计

  • 基于STM32的数字秒表OLED显示设计
    • 一、开发环境
    • 二、主要功能
    • 三、仿真设计
    • 四、程序代码
    • 五、设计说明书
    • 六、资料清单&下载链接

基于STM32的数字秒表OLED显示设计

本设计包含proteus仿真+程序代码+设计报告+讲解视频

一、开发环境

仿真图:proteus 8.17

程序编译器:keil 5

编程语言:C语言

设计编号:C0138

二、主要功能

设计一个基于STM32的数字秒表系统。

设计要求:

(1)开始/停止/清零;

(2)3组时间记录;

(3)成绩查询。

具体功能:

1、使用OLED显示秒表时间和查看历史成绩;

2、一个按键实现开始/暂停/清零,一个按键查询3组成绩;

3、按键按下有蜂鸣器响。

资料下载链接:

KEY_C0138 STM32数字秒表OLED显示

链接: https://pan.baidu.com/s/1DDNJGo5tBumhx_cnqHz9nw?pwd=bscw

提取码: bscw

以下为本设计资料展示:

三、仿真设计

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

四、程序代码

程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序有注释可以结合讲解视频理解。

#include "delay.h"#include "key.h"#include "led.h"#include "timer.h"#include "OLED_I2C.h"#include "stdio.h"/* ---- 秒表状态 ---- */#define SW_STOPPED  0#define SW_RUNNING  1#define SW_PAUSED   2#define SW_RECORD   3u8  sw_state = SW_STOPPED;u8  sw_prev  = SW_STOPPED;u16 sw_min   = 0;u8  sw_sec   = 0;u8  sw_ds    = 0;/* ---- 记录存储 ---- */typedef struct {    u16 minutes;    u8  seconds;    u8  deciseconds;} TimeRec;TimeRec records[3];u8  rec_count = 0;u8  rec_index = 0;static char dbuf[17];/* 格式化时间: "00:00.0" (7字符+结束符) */static void fmt_time(char *s, u16 min, u8 sec, u8 ds){    s[0] = '0' + (min / 10) % 10;    s[1] = '0' + (min % 10);    s[2] = ':';    s[3] = '0' + (sec / 10);    s[4] = '0' + (sec % 10);    s[5] = '.';    s[6] = '0' + ds;    s[7] = '�';}static u8 rec_empty(u8 i){    return (records[i].minutes == 0xFFFF);}static void draw_main(void){    char t[8];    /* 第1行:空白 */    OLED_ShowStr(0, 0, (unsigned char *)"                ", 2);    /* 第2行:标题 */    OLED_ShowStr(0, 2, (unsigned char *)"== STOPWATCH == ", 2);    /* 第3行:当前计时 + 状态 */    fmt_time(t, sw_min, sw_sec, sw_ds);    if (sw_state == SW_RUNNING)        sprintf(dbuf, "   %s RUN  ", t);    else if (sw_state == SW_PAUSED)        sprintf(dbuf, "   %s PAU  ", t);    else        sprintf(dbuf, "   %s STP  ", t);    OLED_ShowStr(0, 4, (unsigned char *)dbuf, 2);    /* 第4行:空白 */    OLED_ShowStr(0, 6, (unsigned char *)"                ", 2);}static void draw_record(void){    char t[8];    u8 i;    /* 第1行:标题(16字符覆盖旧内容) */    OLED_ShowStr(0, 0, (unsigned char *)"    RECORD      ", 2);    /* 第2-4行:R1 / R2 / R3,补足16字符 */    for (i = 0; i < 3; i++)    {        if (!rec_empty(i))        {            fmt_time(t, records[i].minutes, records[i].seconds, records[i].deciseconds);            sprintf(dbuf, "R%d %s      ", i + 1, t);        }        else        {            sprintf(dbuf, "R%d --:--.-      ", i + 1);        }        OLED_ShowStr(0, 2 + i * 2, (unsigned char *)dbuf, 2);    }}int main(void){    u8 i;    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    LED_Init();    OLED_Init();    OLED_CLS();    TIM2_Int_Init(99, 7199);    KEY_Init();    /* 欢迎界面 */    OLED_ShowStr(24, 0, (unsigned char *)"Digital", 2);    OLED_ShowStr(16, 2, (unsigned char *)"Stopwatch", 2);    OLED_ShowStr(24, 4, (unsigned char *)"STM32F1", 2);    delay_ms(1000);    OLED_CLS();    /* 初始化记录为空 */    for (i = 0; i < 3; i++)        records[i].minutes = 0xFFFF;    draw_main();    while (1)    {        if (flag_timer)        {            flag_timer = 0;            if (sw_state == SW_RECORD)                draw_record();            else                draw_main();        }        KEY_Handle();    }}

程序流程图:

五、设计说明书

11191字,内容包括硬件设计、软件设计、结论等。

六、资料清单&下载链接

资料下载链接:

链接: https://pan.baidu.com/s/1DDNJGo5tBumhx_cnqHz9nw?pwd=bscw

提取码: bscw

更多资源 点击下方链接:

https://docs.qq.com/sheet/DS0xIa0llTmtNakRW

以下是实物图,需要定制实物可联系。

相关推荐