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

描述

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分