0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何配置定时器中断并执行数码管刷新函数?

jf_qE49KoVBr8 来源:CW32生态社区 2024-05-14 14:22 次阅读

5.1.数码管动态显示原理

所谓动态扫描显示即轮流向各位数码管送出段码和位码,利用发光管的余辉和人眼视觉暂留作用,使人眼的感觉好像各位数码管同时都在显示。明确了原理,我们要使电压电流表的三个位同时显示不同的值需要用到CW32的定时器功能,在定时器的中断服务程序里面执行显示刷新的动作。

5.2.定时器中断配置

在配置定时器之前需要注意是否将系统时钟树配置完成,定时器利用了高级外设时钟 PCLK,在之前的时钟配置中,我们将高级外设时钟 PCLK的频率配置成了6MHz,这将影响我们对定时器的预分频和装填计数值的配置。

在本次实验中,我们使用定时器BTIM1进行中断配置,代码如下:

#include "BTIM1.h"


void Btim1_Init(void)
{
    BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;
    __RCC_BTIM_CLK_ENABLE();          //使能BTIM的时钟
    NVIC_EnableIRQ(BTIM1_IRQn);       //使能BTIM1的中断


    BTIM_TimeBaseInitStruct.BTIM_Mode      = BTIM_Mode_TIMER;//将定时器配置为计时模式
    BTIM_TimeBaseInitStruct.BTIM_Period    = 6000 - 1;      // 1ms采集1次
    BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV1; // 6MHZ÷1÷6000 = 1000Hz
    BTIM_TimeBaseInitStruct.BTIM_OPMode    = BTIM_OPMode_Repetitive;//配置定时器连续运行


    BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct);  //初始化BTIM1
    BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); //配置BTIM1的中断,定时器溢出产生中断
    BTIM_Cmd(CW_BTIM1, ENABLE);                  //使能BTIM1           
}

5.3.数码管动态显示

在上一节的数码管显示数字的数码管显示模块Seg_Dis.c文件中,我们还需要添加三个函数和定义一个数组 Seg_Reg 来完成动态显示的功能。

uint8_t Seg_Reg[3] = {0,0,0};   //这个数组存放数码管显示三位的数字,0~9


void Close_Com(void)      //关闭所有数码管的显示,防止重影
{
  GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET);    //PB07,COM1
  GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET);    //PC03,COM2
  GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET);    //PC02,COM3
}


void Display(uint32_t value)
{
  uint8_t Hundreds;// 百位数
  uint8_t Tens;    // 十位数
  uint8_t Units;   // 个位数


  Units     = value % 10;      //分别取余获得位数的值
  Tens      = value / 10 % 10;
  Hundreds  = value / 100 % 10;


  Seg_Reg[0] = Hundreds;       //将个十百位的数字分别存放进数组等待调用  
  Seg_Reg[1] = Tens;
  Seg_Reg[2] = Units;
}


void Dis_Refresh(void)      //函数将在定时器中断里调用,不断刷新数码管
{
/*静态变量从作用域上分属于局部变量;从生命周期上来看,它与用户程序的生命周期相同。*/
  static uint8_t num = 0;      //这里的静态临时变量num,轮询Seg_Reg数组


  Close_Com();                 //先关闭公共端,防止重影
  Seg_Dis(num,Seg_Reg[num]);   //调用显示函数
  num++;
  if(num > 2)
  {
    num = 0;               
  }
}

最后在定时器中断里不断调用显示刷新函数完成数码管的刷新显示:

void BTIM1_IRQHandler(void)        //BTIM1的中断服务程序
{
  static uint32_t Cnt=0;           //Cnt作为计数标志位控制刷新函数是否执行
  if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
  {
    BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);  //清除中断标志位
    Cnt++;
    if (Cnt > 2)                  //3ms显示一个数码管
    {
      Cnt = 0;
      Dis_Refresh();             //数码管扫描显示
    }
  }
}

5.4.实验效果

最终的实验效果如下图所示,人眼已经看不出闪烁,但实际上数码管是依次刷新显示。

5b121adc-11a8-11ef-a297-92fbcf53809c.png

图5-1 数码管动态显示效果图



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数码管
    +关注

    关注

    32

    文章

    1882

    浏览量

    91064
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114721
  • 时钟树
    +关注

    关注

    0

    文章

    54

    浏览量

    10741
  • 定时器中断
    +关注

    关注

    0

    文章

    49

    浏览量

    11167
  • 电压电流表
    +关注

    关注

    0

    文章

    25

    浏览量

    2076

原文标题:CW32数字电压电流表软件教程-实验四:数码管动态显示

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    定时器中断实现数码管的动态扫描!

    /21/2013 * 修改时间: * 功能说明:用定时器中断实现数码管的动态扫描,大家可以对比用普通的delay()函数来实现动态扫描有什么区别
    发表于 11-21 20:57

    如何解决无缘蜂鸣器频率 被数码管刷新干扰

    中断会影响无缘蜂鸣器的声音频率。调试过程:一:定时器0刷新数码管,主函数中判断时间,如果时间到就闹钟。结果:蜂鸣器频率被
    发表于 12-12 15:42

    如何解决 无缘蜂鸣器频率 被 数码管刷新干扰

    无缘蜂鸣器响。(闹铃2秒钟)4、通过按键调整DS1302的初始值,来更改当前时间(或闹钟时间)遇到问题:刷新数码管定时器中断会影响无缘蜂鸣器的声音频率。调试过程:一:
    发表于 12-12 16:13

    请问定时刷新数码管出现亮暗不一是为什么?如何解决?

    我采用使用定时器刷新数码管的办法,但是有个别的位显示发亮,有的显示发暗。有时不稳定。硬件检测无问题。程序在开始编程的时候还算稳定。但是在主函数中又加入些代码后。变成这个样子。加入的代码
    发表于 07-06 16:24

    STM32F103RBT6定时器是怎样去刷新LED数码管更新数码管显示的

    STM32F103RBT6定时器是怎样去刷新LED数码管更新数码管显示的?调整LED亮度的方式有哪些?
    发表于 12-15 06:59

    基于单片机的综合应用程序数码管【C语言】定时器控制数码管

    基于单片机的综合应用程序数码管【C语言】定时器控制数码管
    发表于 01-06 13:44 27次下载

    LESSON3_数码管静态显示及定时器中断应用

    LESSON3_数码管静态显示及定时器中断应用
    发表于 02-18 18:21 0次下载

    LESSON3_数码管静态显示及定时器中断应用

    数码管静态显示及定时器中断应用 可以给初学者学习使用 如果有需要可以下载。
    发表于 03-14 10:40 1次下载

    LESSON3_数码管静态显示及定时器中断应用

    LESSON3_数码管静态显示及定时器中断应用。
    发表于 04-29 16:50 5次下载

    LESSON3_数码管静态显示及定时器中断应用

    数码管是如何显示出字符的 数码管静态显示与动态显示原理 中断概念 单片机的定时器应用
    发表于 07-01 17:17 1次下载

    基于8051的Proteus仿真-定时器控制数码管显示

    基于8051的Proteus仿真-定时器控制数码管显示
    发表于 09-01 23:33 19次下载

    数码管显示的原理静态显示及中断概念单片机的定时器应用视频教程

    本文档的主要内容详细介绍的是数码管显示的原理静态显示及中断概念单片机的定时器应用视频教程包括了:1.数码管是如何显示出字符的,2.数码管静态
    发表于 03-26 14:35 15次下载
    <b class='flag-5'>数码管</b>显示的原理静态显示及<b class='flag-5'>中断</b>概念单片机的<b class='flag-5'>定时器</b>应用视频教程

    蓝桥杯开发板CT107D---使用定时器中断动态刷新数码管的消隐

    CT107D开发板的定时器中断刷新数码管的消隐名词位选:选择第几个数码管亮段暄:选择数码管亮什么
    发表于 11-23 16:21 15次下载
    蓝桥杯开发板CT107D---使用<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>动态<b class='flag-5'>刷新</b><b class='flag-5'>数码管</b>的消隐

    51学习打三天--数码管显示的原理-加入中断系统程序--加入定时器!!!需要回头多看看。

    中断系统 4. 定时器....三、数码管显示的原理、数码管的静态显示1. 引脚第二功能1.1TXD...
    发表于 11-29 13:06 18次下载
    51学习打三天--<b class='flag-5'>数码管</b>显示的原理-加入<b class='flag-5'>中断</b>系统程序--加入<b class='flag-5'>定时器</b>!!!需要回头多看看。

    CW32数字电压电流表软件教程-实验四:数码管动态显示

    显示不同的值需要用到CW32的定时器功能,在定时器中断服务程序里面执行显示刷新的动作。有关CW32的
    的头像 发表于 05-31 15:23 507次阅读
    CW32数字电压电流表软件教程-实验四:<b class='flag-5'>数码管</b>动态显示