基于STM32的秒表设计

(仿真+程序+设计报告)

功能介绍

具体功能:

1.用三个按键控制秒表开始、暂停、清零;

2.用四位数码管显示时间;

3.精度0.1秒,最大显示999.9秒;

添加图片注释,不超过 140 字(可选)

程序

#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; // 10mS
  TIM_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);//刷新数码管显示
		
	}
}


#include "stm32f10x.h"
#include "bsp_SysTick.h"
//下面是定义STM32单片机各个引脚的地址,便于以后操作
#define    PA_ODR          (0x40010800+0x0C)
#define    PA_IDR          (0x40010800+0x08)
#define    PA(BitNo)       *(volatile  unsigned  long *)(  (0x42000000 + ((PA_ODR-0x40000000)*8 + BitNo)*4  ) )
#define    PAIN(BitNo)     *(volatile  unsigned  long *)(  (0x42000000 + ((PA_IDR-0x40000000)*8 + BitNo)*4  ) )

#define    PB_ODR          (0x40010C00+0x0C)
#define    PB_IDR          (0x40010C00+0x08)
#define    PB(BitNo)       *(volatile  unsigned  long *)(  (0x42000000 + ((PB_ODR-0x40000000)*8 + BitNo)*4  ) )
#define    PBIN(BitNo)     *(volatile  unsigned  long *)(  (0x42000000 + ((PB_IDR-0x40000000)*8 + BitNo)*4  ) )

#define    PC_ODR          (0x40011000+0x0C)
#define    PC_IDR          (0x40011000+0x08)
#define    PC(BitNo)       *(volatile  unsigned  long *)(  (0x42000000 + ((PC_ODR-0x40000000)*8 + BitNo)*4  ) )
#define    PCIN(BitNo)     *(volatile  unsigned  long *)(  (0x42000000 + ((PC_IDR-0x40000000)*8 + BitNo)*4  ) )

#define    PD_ODR          (0x40011400+0x0C)
#define    PD_IDR          (0x40011400+0x08)
#define    PD(BitNo)       *(volatile  unsigned  long *)(  (0x42000000 + ((PD_ODR-0x40000000)*8 + BitNo)*4  ) )
#define    PDIN(BitNo)     *(volatile  unsigned  long *)(  (0x42000000 + ((PD_IDR-0x40000000)*8 + BitNo)*4  ) )

#define    PE_ODR          (0x40011800+0x0C)
#define    PE_IDR          (0x40011800+0x08)
#define    PE(BitNo)       *(volatile  unsigned  long *)(  (0x42000000 + ((PE_ODR-0x40000000)*8 + BitNo)*4  ) )
#define    PEIN(BitNo)     *(volatile  unsigned  long *)(  (0x42000000 + ((PE_IDR-0x40000000)*8 + BitNo)*4  ) )
	
#define SETBIT(VAR,Place)         ( VAR |= (1<<Place) )						//置位某位变量
#define CLRBIT(VAR,Place)         ( VAR &= ((1<<Place)^0xffff) )	//清除置位
#define VALBIT(VAR,Place)         (VAR & (1<<Place))							//查询某一位
#define GETVALBIT(VAR,Place)      ((VAR & (1<<Place))>>Place)			//查询某一位并转为第0位
	








硬件设计

使用元器件:

单片机:STM32F103;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus8.9版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用Keil5 MDK版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计报告

八千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、仿真源文件 、设计报告、流程图等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

点赞分享一起学习成长。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐