基于51单片机,通过定时器实现的时钟程序

//使用定时器设计一个时钟
//数码管:Datapros(),DigDisplay()
//定时器初始化
//中断函数,主函数
//临时变量:a,秒:sec,分:min,时:hour

#include<reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar a=0,sec=0,min=0,hour=0;
uchar DataTime[8];

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

 //延时函数
void delay(uchar i)
{
    while(i--);
}

//数码管显示函数
void DigDisplay()
{
    uchar i;
    for(i=0;i<8;i++)       //动态扫描显示8个数码管
    {
        switch(i)
        {
            case(0):
                LSA=0;LSB=0;LSC=0;break;
            case(1):
                LSA=1;LSB=0;LSC=0;break;
            case(2):
                LSA=0;LSB=1;LSC=0;break;
            case(3):
                LSA=1;LSB=1;LSC=0;break;
            case(4):
                LSA=0;LSB=0;LSC=1;break;
            case(5):
                LSA=1;LSB=0;LSC=1;break;
            case(6):
                LSA=0;LSB=1;LSC=1;break;
            case(7):
                LSA=1;LSB=1;LSC=1;break;            
        }
        P0=DataTime[i];          //给P0口赋值,时对应的数码管输出对应的值
        delay(100);
        P0=0x00;           //消隐
    }
}

//对得到的时间进行处理,供P0口使用
void Datapros()
{
    DataTime[0]=smgduan[sec%10];         //取余得到秒的个位    ,通过smgduan[]得到对应的十六进制数
    DataTime[1]=smgduan[sec/10];         //取余得到秒的十位
    DataTime[2]=0x40;                      //显示一条横线
    DataTime[3]=smgduan[min%10];
    DataTime[4]=smgduan[min/10];
    DataTime[5]=0x40;
    DataTime[6]=smgduan[hour%10];
    DataTime[7]=smgduan[hour/10];        
    
}
 //定时器初始化
void TimerInit()
{
    TMOD=0X01;       //选择定时器0,方式1
    TH0=0Xd8;          //对TH0和TL0赋初值为10ms,
    TL0=0Xf0;            
    EA=1;
    ET0=1;
    TR0=1;
}

void main()
{
    TimerInit();
    while(1)
    {
        Datapros();    
        DigDisplay();    
    }    
}


void Timer() interrupt 1
{
    TH0=0Xd8;
    TL0=0Xf0;
    a++;
    if(a==99)           // TH0和TL0溢出一次为10ms,溢出100次为1s.
    {
        sec++;             //+1s
        a=0;
        if(sec==60)
        {
            min++;          //+1分钟
            a=0;
            sec=0;
            if(min==60)
            {
                hour++;
                a=0;
                sec=0;
                min=0;
                if(hour==24)
                {
                    a=0;
                    hour=0;
                    min=0;
                    sec=0;

                    
                    }    
            }
            
        }    
    }    
}

原文地址:https://www.cnblogs.com/hexia7935/p/13904690.html