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;//设置好初始值后再复位定时器
      }
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620828
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89946
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112036
收藏 人收藏

    评论

    相关推荐

    4位数码管计时器

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

    按键和数码管

    三位数码管实现显示由T0计时器控制的数,s1控制T0的开启与关闭,s1按下弹起后数码管要显示此时的(计数/2)。怎么办,只有一个显示函数调用,且都是void display(temp)
    发表于 07-10 19:29

    定时器问题

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

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

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

    基于51计时器 数码管显示

    给别人弄的60S倒计时数码管显示,需要的看看。#include#define uint unsigned int#define uchar unsigned char***it P2_2 = P2
    发表于 12-27 22:51

    数码管10计时程序

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

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

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

    定时器怎样去实现1数码管数字自动加一并循环?

    定时器怎样去实现1数码管数字自动加一并循环?其代码程序怎样去编写?
    发表于 07-16 08:09

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

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

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

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

    51单片机定时器的使用/按键检测及数码管的动态显示

    数字时钟的显示及修改实验目的掌握定时器的使用、按键检测及数码管的动态显示。实验内容1、绘制如下proteus仿真图2、利用定时器定时功能,用6位
    发表于 11-19 06:27

    怎样写一个百计时器应用的单片机程序

    。项目名称: 百计时器应用的的单片机:AT89c52应用到的知识 : 1.定时器的应用2.数码管的写法3.中断1.要想写成,这个秒表的
    发表于 12-13 06:57

    定时器的原理及常用工作方式

    实验目的:1、掌握定时器的原理及常用工作方式;2、能够根据特定任务需求选择合适的工作方式实现定时;3、理解多位数码管显示的原理。实验要求:1、基于普中开发板设计
    发表于 01-07 08:18

    数码管动态显示之倒计时器设计资料分享

    1、数码管动态显示之倒计时器设计下面将介绍数码管显示的最后一个实例,该例的实现目标为通过拨码开关输入BCD码设置起始时间(单位为,高两位和
    发表于 07-27 16:50

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

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