六位数字时钟(IDE+Protuse)

这篇具有很好参考价值的文章主要介绍了六位数字时钟(IDE+Protuse)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验条件:Cube IDE +Protuse

任务目标: STM32F103R6T6系列的MCU引脚上接有8个共阴极的七段数码管,原理图见如下Protuse图,实现复用STM32F103R6T6微控制器的TIM2进行定时,定时时长为1s,编程实现数字时钟的功能,然后通过8位的数码管显示,时钟的格式:23-45-56,原理图如下。

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

 一 、Protuse模型的搭建(更换8位8段数码管),其他设置同“中断方式实现数码管显示(IDE+Protuse)”

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

二、Cube MX的设置 (本实验移植“中断方式实现数码管显示(IDE+Protuse)”)

 1. 芯片选择“STM32F103R6T6”

 2.引脚配置 

数码管位码操作:PB1~PB8 (输出)

数码管段码操作:PC1-PC8  (输出)

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

3.1 复位及时钟控制(同“中断方式实现数码管显示(IDE+Protuse)”)

3.2 调试接口(同“中断方式实现数码管显示(IDE+Protuse)”)

3.3  Timer设置

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

 3.4 中断的优先级设置(1的优先级大于2的优先级)

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

 4. 时钟配置与工程配置(同“中断方式实现数码管显示(IDE+Protuse)”)

 三 、Cube IDE程序编写

1. user的文件夹和.c和.h的文件添加(同“中断方式实现数码管显示(IDE+Protuse)”)

2. display.h程序如下

#ifndef DISPLAY_H
#define DISPLAY_H
#include "gpio.h"

#define t 1  //延时时间,数值越大,仿真中会出现数字的闪烁

void display_0 (); //数字0的显示
void display_1 (); //数字1的显示
void display_2 (); //数字2的显示
void display_3 (); //数字3的显示
void display_4 (); //数字4的显示
void display_5 (); //数字5的显示
void display_6 (); //数字6的显示
void display_7 (); //数字7的显示
void display_8 (); //数字8的显示
void display_9 (); //数字9的显示
void display_ (); //数字-的显示

void display (); //判断当前计数的函数
void display_shi ();//时间“时”的显示
void display_fen ();//时间“分时”的显示
void display_miao ();//时间“秒时”的显示
#endif

  3. display.c程序如下

#include "display.h"
#include "gpio.h"
#include "stdio.h"
#include "math.h"

void display_0 ()
{
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_1 ()
{
	HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_2 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|D_Pin|E_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, C_Pin||F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_3 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, E_Pin|F_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_4 ()
{
	HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_5 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|C_Pin|D_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, B_Pin|E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_6 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, B_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_7 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_8 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, DP_Pin, GPIO_PIN_RESET);
}
void display_9 ()
{
	HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_ ()
{
	HAL_GPIO_WritePin(GPIOC,G_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display(num)
{
	switch (num)
	{
	case 0:
		display_0 ();
	break;
	case 1:
		display_1 ();
	break;
	case 2:
		display_2 ();
	break;
	case 3:
		display_3 ();
	break;
	case 4:
		display_4 ();
	break;
	case 5:
		display_5 ();
	break;
	case 6:
		display_6 ();
	break;
	case 7:
		display_7 ();
	break;
	case 8:
		display_8 ();
	break;
	case 9:
	display_9 ();
    break;
	}
}
void display_shi(shi)
{
	display (shi/10);
	HAL_GPIO_WritePin(GPIOB,W1_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W2_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
	display (shi%10);
	HAL_GPIO_WritePin(GPIOB,W2_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
	display_ ();
	HAL_GPIO_WritePin(GPIOB,W3_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W4_Pin|W5_Pin|W6_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_fen(fen)
{
	display (fen/10);
	HAL_GPIO_WritePin(GPIOB,W4_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W5_Pin|W6_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
	display (fen%10);
	HAL_GPIO_WritePin(GPIOB,W5_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W6_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
	display_ ();
	HAL_GPIO_WritePin(GPIOB,W6_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W5_Pin|W7_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_miao(miao)
{
	display (miao/10);
	HAL_GPIO_WritePin(GPIOB,W7_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin|W8_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
	display (miao%10);
	HAL_GPIO_WritePin(GPIOB,W8_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin|W7_Pin, GPIO_PIN_SET);
	HAL_Delay(t);
	HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}

 5. 主函数的编写

5.1 添加头文件

/* USER CODE BEGIN Includes */
#include "display.h"
/* USER CODE END Includes */

  5.2 定义变量

/* USER CODE BEGIN PV */
uint8_t hour;
uint8_t second;
uint8_t minute;
/* USER CODE END PV */

5.3 中断的开启

  /* USER CODE BEGIN 2 */
__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);
HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */

5.4 while()函数的编写

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
display_miao(second);
display_fen (minute);
display_shi (hour);
  }
  /* USER CODE END 3 */

5.5 回调函数的编写

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		second++;
		if(second==60)
			{
			second=0;
			minute++;
			}
		if(minute==60)
		{
		minute=0;
		hour++;
		}
		if(hour==60)
		{
		hour=0;
		}


	}
}
/* USER CODE END 4 */

6. 编译程序并生成hex文件。

7. 运行结果

6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件

 6位数码管显示数字,# IDE+Protuse嵌入式开发,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-771548.html

到了这里,关于六位数字时钟(IDE+Protuse)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包