【STM32 HAL Proteus】数码管显示定时学习教程

 实现目标

1、STM32 基于HAL库定时器的使用;

2、加强数码管的学习。

3、具体目标:利用定时器3实现一个60秒的定时,定时时间在数码管上显示,定时时间到,蜂鸣器响一声作为提示功能。


一、STM32 定时器的中断回调函数

        自动生成的代码中,中断回调函数都有一个__weak 关键字,加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。

二、原理图设计

三、STM32CubeMX 配置

1.定时器时钟配置

2.定时器3、数码管、蜂鸣器的配置

   

3.开启定时器3中断

四、程序设计

1.变量定义及函数声明

//共阳数码管码表
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

int s ,flag;


void HC595_Send_Byte(unsigned  char byte);	
void for_delay_us(uint32_t nus);

2.打开定时器3中断

开启定时中断函数:   HAL_TIM_Base_Start_IT(&htimx);   //x  为要开启的定时器号,下面代码为开启定时器2中断,x= 3

HAL_TIM_Base_Start_IT(&htim3);//开启定时器3中断

3.重写中断回调函数

中断回调函数内尽量少放我们处理的代码。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == htim3.Instance) //1S进入1次中断
	{			
			s++;//秒 ++
			if ( s >= 60)//1s 到
			{
				s = 0;			
				flag = 1;
			}	
	}  
}

4.74HC595驱动程序、自写延时函数

void HC595_Send_Byte(unsigned  char byte)
{
	unsigned  char i;
	for (i = 0; i < 8; i ++)  //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
	{
	  /****  步骤1:将数据传到DS引脚    ****/
		if (byte & 0x80)        //先传输高位,通过与运算判断第八是否为1
		  HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_SET); //如果第八位是1,则与 595 DS连接的引脚输出高电平
		else                    //否则输出低电平
		  HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_RESET);		
			
		/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
      HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_RESET);	 // SHCP拉低	          
      for_delay_us(5);	// 适当延时	
		
      HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_SET);		// SHCP拉高, SHCP产生上升沿	
      for_delay_us(5);				
		  byte <<= 1;		// 左移一位,将低位往高位移,通过	if (byte & 0x80)判断低位是否为1
	}
	
	/**  步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器  **/ 
   HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_RESET);	// 将STCP拉低
   for_delay_us(5);		
   HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_SET);// 再将STCP拉高,STCP即可产生一个上升沿	
   for_delay_us(5);	
}

/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
	 uint32_t Delay = nus * 168/4;
	 do
	 {
	 }
	 while (Delay --);
}

5.while(1)中实现的功能函数

		if (flag == 1)
		{
			flag = 0;
			HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
			HAL_Delay(200);
			HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
			HAL_Delay(200);			
		
		}
	
		HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);		
		HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);		
		HC595_Send_Byte(table[s/10]);//函数调用			
        for_delay_us(5);	// 适当延时	
		HC595_Send_Byte(0xff);	//	消影
		
		HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);		
		HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);		
		HC595_Send_Byte(table[s%10]);//函数调用			
        for_delay_us(5);	// 适当延时	
		HC595_Send_Byte(0xff);//	消影	

五、实验现象

六、仿真实现


总结

作者:面包板扎

物联沃分享整理
物联沃-IOTWORD物联网 » 【STM32 HAL Proteus】数码管显示定时学习教程

发表评论