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

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

3天内不再提示

使用定时器和数码管实现简易秒计时器

CHANBAEK 来源: Zi Jin Code 作者: 锟酱不是酱 2023-11-02 10:50 次阅读

从今天开始,我们利用上前几天学习的定时器数码管,一起设计一个简单的秒计时器

项目工作流程:单片机开机机器自动启动计时器,计时器从0开始计时,每一秒加一,直到9999后自动复位成0000。

这个项目中我们使用到数码管和单片机C51的Timer0,定时器每次定时5ms,每次满5ms的时候输出一次一位的显示,同时数码管位控为一一位,移到最后一位数码管就自动回到第一位,累计计满200次5ms(也就是1秒以后),计时器+1,直到9999

我们用一个数组存下寄存器的数值,这个数组是Time[4],其中Time[0]对应个位,Time[1]对应十位,Time[2]对应百位,Time[3]对应千位

计算出初始值为60928,换算

TH0 = 0xEE;
TL0 = 0x00;

整个项目的电路图:

图片

这里不得不提醒一下,我们之前设计的电路图中,左边的数码管是第一位

图片

//从左往右数:最左边第一位数码管,接下来是二,三,四


sbit Smg_1 = P2^0;//第一位数码管接在P2.0
sbit Smg_2 = P2^1;//第一位数码管接在P2.1
sbit Smg_3 = P2^2;//第一位数码管接在P2.2
sbit Smg_4 = P2^3;//第一位数码管接在P2.3


//整个数码管取模
unsigned char code Smgbit[] = {0xFE,0XFD,0xFB,0xF7};

现在,为了让数码管配合我们存放时间的变量Time[],所以我们换了一下数码管的位,现在是左边第一位是第一位

图片

不过这个大家不用记住,我们的工程用到的时候要我会跟大家说的,所以本工程中的数码管的位控

//从左往右数:最左边第一位数码管,接下来是二,三,四


sbit Smg_1 = P2^3;//第一位数码管接在P2.0
sbit Smg_2 = P2^2;//第一位数码管接在P2.1
sbit Smg_3 = P2^1;//第一位数码管接在P2.2
sbit Smg_4 = P2^0;//第一位数码管接在P2.3


//整个数码管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};

程序大概流程(画的有点丑,见谅):

图片

程序框图:

图片

代码:

//这个代码展示的是一个0~9999秒的计时器
#include< reg52.h >


unsigned char Time[4] = {0,0,0,0};//我们的计时器时间的变量
//这四个TIME元素分别代表千位(TIME(3))百位(TIME(2))十位(TIME(1))个位(TIME(0))
//----------------------------------------------------------------


//----------------------------------------------------------------


unsigned char code Smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管取模


unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
//数码管位控
//操作的时候直接用P2 = Smgbit[0~3]对应1~4位数码管


unsigned char SmgSelect = 0;//数码管选位
//这里不得不特别说明
//SmgSelect不仅仅是控制我们的数码管位控,还控制着数码管显示时对描述位置的选位操作


//Smgbit  0  1  2  3
//数码管  1  2  3  4 位
//秒数   个 十  百 千


//----------------------------------------------------------------


unsigned char TimerCount = 0;//这个变量记录定时器定时溢出次数
//(定时器一次定时5ms)
//----------------------------------------------------------------




  unsigned char a = 0;
//----------这个是一个临时变量
void main()
{//注意设置定时器初始值要在main函数里面设置

  TMOD = 0x01;

  /*设置定时器模式寄存器TMOD为 0000 0001
  GATE = 0
  C/T = 0
  M1 =0
  M0 = 1
  标准16位定时器
  */

  //先设置定时器初始值,我们一次延迟5ms,计算得初始值为60928
  TL0 = 0x00;//设置定时器初始值低位
  TH0 = 0xEE;//设置定时器初始值高位

  TR0 = 1;//记得一定要设置定时器开启
  while(1)
  {
    if (TF0 == 1)
      { 
        P2 =  0xFF;//注意每次写数码管之前都要把所有的数码管关闭


        a = Time[SmgSelect];
        P0 = Smg[a];
        //这个过程先从Time[]里面取出位数的数值
        //再把这个数值送到Smgbit里面选择出这位数对应的数码管取模
        //最后把这个取模的数据送给P0 IO组,显示
        P2 = Smgbit[SmgSelect];
        //选择数码管位置

        SmgSelect++;

        if (SmgSelect >3){SmgSelect = 0;}//如果选位变量超过3,归零

        TimerCount++;

        if(TimerCount > 200)
        {
          Time[0]++;
          TimerCount = 0;
          //检测第一位有没有满
          if(Time[0] >9)
          {
            Time[0] = 0;
            Time[1]++;
          }
          //检测第二位有没有满
          if(Time[1] >9)
          {
            Time[1] = 0;
            Time[2]++;
          }
          //检测第三位有没有满
          if(Time[2] >9)
          {
            Time[2] = 0;
            Time[3]++;
          }
          //检测第三位有没有满
          if(Time[3] >9)
          {
            Time[3] = 0;
          }    
        }
        TL0 = 0x00;//设置定时器初始值低位
        TH0 = 0xEE;//设置定时器初始值高位
        TF0 = 0;//设置好初始值后再复位定时器
      }
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6044

    文章

    44632

    浏览量

    639384
  • 寄存器
    +关注

    关注

    31

    文章

    5377

    浏览量

    121394
  • 数码管
    +关注

    关注

    32

    文章

    1887

    浏览量

    91491
  • 定时器
    +关注

    关注

    23

    文章

    3256

    浏览量

    115515
收藏 人收藏

    评论

    相关推荐

    4位数码管计时器

    4位数码管计时器
    发表于 04-12 00:33

    定时器问题

    我用两个定时器到数计时,通过数码管来显示,第一个计时器正常计时,可是第二个60
    发表于 11-06 16:20

    通过定时器来控制跑时间间隔,数码管的动态显示能实现

    大大……通过定时器来控制跑的时间间隔,然后用其中两个数码管来显示!这个用数码管的动态显示能实现吗?请各位大大们教教小弟……如图
    发表于 05-12 23:40

    数码管10计时程序

    数码管10计时程序,C51单片机之数码管实现99计时
    发表于 07-14 07:50

    51单片机如何实现数码管99计时

    51单片机99计时C语言源程序51单片机实现数码管99计时,其实很简单,就是使用
    发表于 07-15 06:25

    基于单片机的时钟计时器系统设计与制作 精选资料分享

    基于单片机的时钟计时器系统设计与制作[摘要]这次课程设计以STC89C51单片机为核心,辅以必要的电路,设计了一个简易的电子时钟,它由5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达
    发表于 07-21 07:47

    请问51单片机定时器数码管如何实现9999到0的倒计时C语言?

    请问51单片机定时器数码管如何实现9999到0的倒计时C语言?
    发表于 10-14 06:02

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

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

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

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

    定时器1计数,数码管显示0-999程序代码【下载】

    定时器1计数,数码管显示0-999
    发表于 12-20 14:23 18次下载

    51单片机+4位数码管计时器按键可调节

    51单片机+4位数码管计时器按键可调节4位数码管计时,采用定时器proteus仿真源代码#in
    发表于 11-20 10:36 29次下载
    51单片机+4位<b class='flag-5'>数码管</b><b class='flag-5'>计时器</b>按键可调节

    51单片机数码管显示60计时(C语言)

    51单片机数码管显示60计时基于普中51单片机开发板,运用定时器/计数0和1,实现60
    发表于 11-21 17:21 71次下载
    51单片机<b class='flag-5'>数码管</b>显示60<b class='flag-5'>秒</b>倒<b class='flag-5'>计时</b>(C语言)

    STM32+Proteus仿真实现滴答定时器计时和数码管实时显示功能

    STM32+Proteus仿真实现滴答定时器计时和数码管实时显示功能
    发表于 11-24 21:06 73次下载
    STM32+Proteus仿真<b class='flag-5'>实现</b>滴答<b class='flag-5'>定时器</b><b class='flag-5'>计时</b><b class='flag-5'>和数码管</b>实时显示功能

    EDA程序设计之计时器设计

    计时器的设计1. 设计任务 设计并制作一台计时器。2. 设计要求① 用EDA实训仪的I/O设备和PLD芯片实现计时器的设计。② 计时器能够显
    发表于 08-22 10:16 2次下载

    用555定时器怎样实现15计时电路?

    用555定时器怎样实现15计时电路 555定时器是一种常用的集成电路,它可以将电路中的电压信号转换为周期性的脉冲信号或方波信号,是数字电路
    的头像 发表于 09-02 16:20 4762次阅读