首页  /  单片机教程  /  分钟秒表  /  

分钟秒表

点击打开在线编译器,边学边练

数码管的基础知识已经讲解的差不多了,我们做道题目来结束本章的学习内容。

 

1.题目要求

开发板上电瞬间需要做到如下图的“0.00”所示

5.png

右边两个数码管用来做60秒计时,带小数点显示的数码管用来做一分钟过后的累加,当还没到达10分钟时,最左端的数码管(也就是数码管3)不允许亮,计时到“59.59”之后再过一秒就要变为“0.00”。


2.程序分析

同样我们需要定义Second用来做秒数自增的变量,分钟的累加也需要一个Minute变量。

当Second等于60的瞬间,需要“Second=0; Minute++;”

同理当Minute等于60的瞬间,需要“Minute=0;”

我们也知道开发板一上电就需要三个数码管一起点亮,所以LedBuff[0]、LedBuff[1]、LedBuff[2]每次从头循环都需要实时更新状态值的,反倒是LedBuff[3]只有当Minute大于等于10时,才会去更新内容,才会改变之前的“LedBuff[3]=0xFF;”变成可点亮数码管的显示。


3.代码

#include <reg52.h> 
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓存区

void main()
{  
    unsigned int i=0,x;
    unsigned char Second=0,Minute=0;//定义一个秒数自增和一个分数自增的变量
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
    
    while(1)
    {   
        LedBuff[0]=LedChar[Second%10];   
        LedBuff[1]=LedChar[(Second/10)%10];
        LedBuff[2]=0x7F & LedChar[Minute%10];
        if(Minute>=10)LedBuff[3]=LedChar[(Minute/10)%10];//Minute没到达10之前不更新LedBuff[3]的初始值
   
        if(Minute==0)LedBuff[3]=0xFF;//Minute到达60就归0了,所以不显示Minute的十位了
        for(x=0;x<29480;x++)//循环持续1秒的时间
        { 
            P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用
            switch(i)
            {
                case 0:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;
      
                case 1:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;     
      
                case 2:
                ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break;  
      
                case 3:
                ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0=LedBuff[3];i=0;break; 
            }  
        } 
        Second++;//一秒之后变量自加1 
        if(Second>=60){Second=0;Minute++;}
        if(Minute>=60)Minute=0;
    }
}

这代码是让数码管显示按秒数自增的,大家想观察到了“59.59”之后数码管会怎么样显示但又不想等1个小时,那么把 “unsigned char Second=0,Minute=0;”初始时的Second改为50,Minute改为59看看10秒后数码管怎么显示。


本文固定URL:https://www.dotcpp.com/course/198

上一课:数码管小数点
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)