基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)

  • 视频演示
  • 1.主要功能
  • 2.仿真
  • 3. 程序
  • 4. 设计报告
  • 5.资料清单&下载链接

仿真图proteus 8.9

程序编译器:keil 5

编程语言:C语言

设计编号:C0078

视频演示

基于STM32的简易电子秒表proteus仿真设计

1.主要功能

结合实际情况,基于STM32F103单片机设计一个电子秒表。该设计应满足的功能要求为:

1、以STM32为最小系统电路进行连接,用四位数码管显示计时时间。

2、三个按键作为开始、清零、暂停来控制秒表的计时。

3、计时精确度为0.1S,最大可以显示999.9s

主要硬件设备:STM32F103单片机、四位数码管。

以下为本设计资料展示:

2.仿真

整体设计方案

该系统为电子秒表设计系统,其主要的硬件设计:以stm32为最小系统电路进行连接,用数码管显示秒表计时时间。

测试如下所示:

开始仿真后显示000.0,等待开始按键按下后开始计时,0.1秒增加一次计时。

按下暂停按键后暂停计时,显示当前计时的时间。如下图所示:

3. 程序

主函数:

#include "stm32f10x.h"
#include "main.h"//定义数码管的引脚
#define   SEG_A   PC(12)
#define   SEG_B   PC(11)
#define   SEG_C   PC(10)
#define   SEG_D   PC(9)
#define   SEG_E   PC(8)
#define   SEG_F   PC(7)
#define   SEG_G   PC(6)
#define   SEG_DP   PC(5)#define   SEG1   PC(4)
#define   SEG2   PC(3)
#define   SEG3   PC(2)
#define   SEG4   PC(1)
//定义数按键的引脚
#define   K1   PBIN(15)
#define   K2   PBIN(14)
#define   K3   PBIN(13)
//共阳数码管段码表0-F
const char  CAseg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阴数码管段码表0-F
const char  CCseg_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u8 Time_count=0;//计时时间//初始化引脚
void GPIO_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_All);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_All);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure); }//把数值输出到具体的单片机引脚
void Drv_SEG(u8 num)
{SEG_A=GETVALBIT(num,0);SEG_B=GETVALBIT(num,1);SEG_C=GETVALBIT(num,2);SEG_D=GETVALBIT(num,3);SEG_E=GETVALBIT(num,4);SEG_F=GETVALBIT(num,5);SEG_G=GETVALBIT(num,6);SEG_DP=GETVALBIT(num,7);
}
//驱动数码管的函数
//mode =0表示共阳,mode=1表示共阴,可以通过这个修改
//m是要显示的数字,比如1.0就是m=10,放大10倍
void Show_num(u16 m)
{u8 num=0,n=0;static u8 temp_flag=0;//数码管消隐SEG1=0;SEG2=0;SEG3=0;SEG4=0;switch(temp_flag){case 0://左侧第1位数码管      n=m/1000;//取数据num=CAseg_table[n];//查询数码管的断码表Drv_SEG(num);SEG1=1;//打开数码管显示temp_flag++;break;case 1://左侧第2位数码管n=m%1000/100;//取数据num=CAseg_table[n];//查询数码管的断码表Drv_SEG(num);SEG2=1;//打开数码管显示temp_flag++;break;case 2://左侧第3位数码管n=m%100/10;//取数据num=CAseg_table[n]&0x7f;//查询数码管的断码表Drv_SEG(num);SEG3=1;//打开数码管显示temp_flag++;break;case 3://左侧第4位数码管n=m%10;//取数据num=CAseg_table[n];//查询数码管的断码表Drv_SEG(num);SEG4=1;//打开数码管显示temp_flag=0;break;}Delay_ms(10);//延时
}//获取独立按键数据
u8 Get_key_num()
{u8 temp_key=0;static u8 flag=0;if((flag==0)&&((K1==0)||(K2==0)||(K3==0))){flag=1;//按键只获取一次按键数值SysTick_Delay_Ms(10);//消除抖动//如果有对应的按键按下就返回对应按键数值if(K1==0){temp_key=1;}else if(K2==0){temp_key=2;}else if(K3==0){temp_key=3;}}else if((K1==1)&&(K2==1)&&(K3==1)){flag=0;//所有按键都弹起就清除标志}return temp_key;
}//定时器初始化
void  TimInit(void)
{NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_DeInit(TIM2);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_TimeBaseStructure.TIM_Period = 999; // 10mSTIM_TimeBaseStructure.TIM_Prescaler = (80-1); // 10uS,这里配合仿真是8M,所以是80,如果是72M那么就是720,仿真没有备倍频TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_PrescalerConfig(TIM2, 80-1, TIM_PSCReloadMode_Immediate); // 10uS,这里配合仿真是8M,所以是80,如果是72M那么就是720,仿真没有备倍频TIM_ClearFlag(TIM2, TIM_FLAG_Update);  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);         TIM_Cmd(TIM2, ENABLE);}//定时器服务函数
void  TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); if(++Time_count>250)Time_count=250;//时间计时}
}int main(void)
{u8 key_num=0;//按键数值u16 dis_num=0;u8 mode=0;GPIO_Config();      //初始化引脚TimInit();       //初始化定时器while(1){key_num=Get_key_num();//读取按键switch(key_num){case 1://开始按键TIM_Cmd(TIM2, ENABLE);mode=1;//开始break;case 2://暂停按键TIM_Cmd(TIM2, DISABLE);mode=2;//暂停break;case 3://清除按键TIM_Cmd(TIM2, DISABLE);Time_count=0;dis_num=0;mode=0;//清除显示break;}if(mode==1)//开始{if(Time_count>=10)//每0.1s增加1{Time_count=0;if(++dis_num>9999)dis_num=9999;//最大999.9s}}Show_num(dis_num);//刷新数码管显示}
}

4. 设计报告

报告部分内容

二、主控制器选择

2.1 stm32f103芯片的概述

STM32单片机有很多个系列,其中包括基本型、USB基本型、增强型以及互联型几大系列,这写系列的STM32单片机都是具有性能高、功耗低、成本低等特点。其内部结构图如图 2.2所示:

​ 图 2.2 STM32内部结构图

本课题采用的是STM32F103C8T6单片机芯片,这是是一款ARM M3内核的增强型微控制器,这款内核的工作频率是能够达到72MHz的,它拥有着128K字节的闪存和极其丰富的外设,如GPIO口,串口,定时器,中断,数模转换,实时时钟,看门狗,SPI,IIC,CAN总线等部分组成。STM32F103系列单片机的性能在同一个类别的产品中是最高的,它能够在-40°C -85°C温度下正常地进行工作,工作的电压范围为2V-3.6V,具有低功耗的节能工作模式,闪存存储器的容量为64K字节。

5.资料清单&下载链接

百度网盘分享下载链接:
https://docs.qq.com/doc/DS21hQUpNd3JabkZt

基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)相关推荐

  1. 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc

    嵌入式系统设计实验综合设计报告 PAGE 四川师范大学成都学院通信工程学院 基于STM32的简易电子计算器设计与实现 实验综合设计报告 学生姓名 陶龑 学 号 2016301033 所在学院 通信工程 ...

  2. c语言计算器开题报告,基于单片机的简易电子计算器设计开题报告.doc

    第 PAGE 3页 授人以渔能力为本 毕业设计开题报告 学生姓名 学生学号 毕业设计题目 基于单片机的简易电子计算器设计 1.选题背景(含国内外相关研究综述及评价)与意义 随着社会的发展,科学的进步, ...

  3. 基于51单片机的简易电子数字计算器Proteus仿真

    资料编号:089 采用51单片机,使用矩阵键盘,可以计算加减乘除,进行简易计算: 全套资料齐全:具体功能请看下面演示视频 89-基于51单片机的简易电子数字计算器Proteus仿真 单片机最小系统介绍 ...

  4. 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现

    基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...

  5. 基于STM32的简易示波器项目(含代码)——HAL库

            前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的.巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主 ...

  6. 基于51单片机的电子秒表

    基于51单片机的电子秒表 电子秒表 基于51单片机的电子秒表 摘要 1 引言 段数码管以及按键的使用 2 总体设计方案 2.1 设计思路 2.2 设计方框图 3 设计原理分析 3.1 时钟电路的设计 ...

  7. 基于STM32单片机智能手环脉搏心率计步器体温显示设计

    " 基于STM32单片机智能手环脉搏心率计步器体温显示设计." (获取方式:在"智能车杂谈"微信回复:009). 01 材料准备 清单列表 1.ADXL345模 ...

  8. 基于STM32大棚DHT11温湿度监测的Proteus仿真

    本设计仅供学习参考 基于STM32大棚DHT11温湿度监测的Proteus仿真 (代码+仿真+原理图+PCB) 原理图:Altium Designer 仿真图protues 8.9 程序编译器:kei ...

  9. 2个相同的 stm32 can通讯不成功_一文读懂,基于 STM32 和 CAN 总线的温度监控系统的设计方法...

    1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的桥接,CAN 从站主要实现温度的采集.CAN 从站 ...

最新文章

  1. Spring Cloud构建分布式电子商务平台:服务消费(基础)
  2. 成功解决ValueError: ‘usecols‘ must either be list-like of all strings, all unicode, all integers or a ca
  3. python爬虫深入爬取_Python爬虫初学(一)—— 爬取段子
  4. 单一职责原则--设计模式系列
  5. springboot 多线程_机密文档!阿里产出SpringBoot/Cloud,细节爆炸
  6. ad09只在一定范围内查找相似对象_重磅!Excel更新了超级查找函数XLOOKUP,可以对VLOOKUP说拜拜了...
  7. java中的设计模式
  8. Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7)
  9. Python 父类调用子类方法
  10. 由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle
  11. 浅谈软件项目中的需求分析与需求管理
  12. 乾颐堂军哥华为HCNP真题讲解(2017至2018版)真题更新版到来
  13. DX 系列之 ComboBoxEdit
  14. 无线ap ntp服务器,我有一优科 ZoneFlex 7982 的无线AP,怎样可以进AP系统进行设置...
  15. 【Mybatis学习】Mybatis 缓存
  16. 五一期间完成了某市交警系统的一个系统升级迁移项目
  17. 什么是Ruby之道?
  18. 蓦然回首,灯火阑珊——自考总结
  19. 令人拍案叫绝的Wasserstein GAN 及代码(WGAN两篇论文的中文详细介绍)
  20. 卷积神经网络CNN——使用keras识别猫咪

热门文章

  1. linux - Android安卓是什么
  2. html音乐转码,浏览器音频兼容和ffmpeg的音频转码使用
  3. pdf书签目录一键生成,再也不怕找不到了
  4. 计算一个实数的平方根
  5. “名师讲坛”课程资源库使用情况分析
  6. Apache软件基金会项目介绍
  7. 微信公众号支付验证签名失败及其它坑总结
  8. 【深入理解计算机系统CSAPP】第六章 存储器层次结构
  9. 案例:购买飞机票的价格
  10. 【堡垒机小知识】堡垒机是硬件还是软件?