基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)
基于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的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)相关推荐
- 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc
嵌入式系统设计实验综合设计报告 PAGE 四川师范大学成都学院通信工程学院 基于STM32的简易电子计算器设计与实现 实验综合设计报告 学生姓名 陶龑 学 号 2016301033 所在学院 通信工程 ...
- c语言计算器开题报告,基于单片机的简易电子计算器设计开题报告.doc
第 PAGE 3页 授人以渔能力为本 毕业设计开题报告 学生姓名 学生学号 毕业设计题目 基于单片机的简易电子计算器设计 1.选题背景(含国内外相关研究综述及评价)与意义 随着社会的发展,科学的进步, ...
- 基于51单片机的简易电子数字计算器Proteus仿真
资料编号:089 采用51单片机,使用矩阵键盘,可以计算加减乘除,进行简易计算: 全套资料齐全:具体功能请看下面演示视频 89-基于51单片机的简易电子数字计算器Proteus仿真 单片机最小系统介绍 ...
- 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现
基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...
- 基于STM32的简易示波器项目(含代码)——HAL库
前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的.巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主 ...
- 基于51单片机的电子秒表
基于51单片机的电子秒表 电子秒表 基于51单片机的电子秒表 摘要 1 引言 段数码管以及按键的使用 2 总体设计方案 2.1 设计思路 2.2 设计方框图 3 设计原理分析 3.1 时钟电路的设计 ...
- 基于STM32单片机智能手环脉搏心率计步器体温显示设计
" 基于STM32单片机智能手环脉搏心率计步器体温显示设计." (获取方式:在"智能车杂谈"微信回复:009). 01 材料准备 清单列表 1.ADXL345模 ...
- 基于STM32大棚DHT11温湿度监测的Proteus仿真
本设计仅供学习参考 基于STM32大棚DHT11温湿度监测的Proteus仿真 (代码+仿真+原理图+PCB) 原理图:Altium Designer 仿真图protues 8.9 程序编译器:kei ...
- 2个相同的 stm32 can通讯不成功_一文读懂,基于 STM32 和 CAN 总线的温度监控系统的设计方法...
1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的桥接,CAN 从站主要实现温度的采集.CAN 从站 ...
最新文章
- Spring Cloud构建分布式电子商务平台:服务消费(基础)
- 成功解决ValueError: ‘usecols‘ must either be list-like of all strings, all unicode, all integers or a ca
- python爬虫深入爬取_Python爬虫初学(一)—— 爬取段子
- 单一职责原则--设计模式系列
- springboot 多线程_机密文档!阿里产出SpringBoot/Cloud,细节爆炸
- ad09只在一定范围内查找相似对象_重磅!Excel更新了超级查找函数XLOOKUP,可以对VLOOKUP说拜拜了...
- java中的设计模式
- Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7)
- Python 父类调用子类方法
- 由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle
- 浅谈软件项目中的需求分析与需求管理
- 乾颐堂军哥华为HCNP真题讲解(2017至2018版)真题更新版到来
- DX 系列之 ComboBoxEdit
- 无线ap ntp服务器,我有一优科 ZoneFlex 7982 的无线AP,怎样可以进AP系统进行设置...
- 【Mybatis学习】Mybatis 缓存
- 五一期间完成了某市交警系统的一个系统升级迁移项目
- 什么是Ruby之道?
- 蓦然回首,灯火阑珊——自考总结
- 令人拍案叫绝的Wasserstein GAN 及代码(WGAN两篇论文的中文详细介绍)
- 卷积神经网络CNN——使用keras识别猫咪