实验条件:Cube IDE +Protuse
任务目标: STM32F103R6T6系列的MCU引脚上接有8个共阴极的七段数码管,原理图见如下Protuse图,实现复用STM32F103R6T6微控制器的TIM2进行定时,定时时长为1s,编程实现数字时钟的功能,然后通过8位的数码管显示,时钟的格式:23-45-56,原理图如下。
一 、Protuse模型的搭建(更换8位8段数码管),其他设置同“中断方式实现数码管显示(IDE+Protuse)”
二、Cube MX的设置 (本实验移植“中断方式实现数码管显示(IDE+Protuse)”)
1. 芯片选择“STM32F103R6T6”
2.引脚配置
数码管位码操作:PB1~PB8 (输出)
数码管段码操作:PC1-PC8 (输出)
3.1 复位及时钟控制(同“中断方式实现数码管显示(IDE+Protuse)”)
3.2 调试接口(同“中断方式实现数码管显示(IDE+Protuse)”)
3.3 Timer设置
3.4 中断的优先级设置(1的优先级大于2的优先级)
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. 运行结果
文章来源:https://www.toymoban.com/news/detail-771548.html
文章来源地址https://www.toymoban.com/news/detail-771548.html
到了这里,关于六位数字时钟(IDE+Protuse)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!