单片机的数字时钟例程

 

#include <reg52.h>

#include <absacc.h>

#define unit unsigned int

#define uchar unsigned char

 

/*定义字型字位口*/

#define DIGPORT  XBYTE [0x8000]

#define WORDPORT  XBYTE [0x4000]

 

/*定义P1口各管脚*/

sbit K0=P1^0;

sbit K1=P1^1;

sbit K2 =P1^2;

sbit BEEP=P1^3;

sbit L0=P1^4;

sbit L1=P1^5;

sbit L2=P1^6;

sbit L3=P1^7;

 

uchar data BUFFER[2]={0,0};         /*显示缓冲区(依次为低位,高位)*/

uchar data CLOCK[4]={0,0,0,0};      /*存放时钟时间(依次为百分秒,,分和时位)*/

uchar data SECOND[2]={0,0};     /*存放秒表时间(依次为百分秒,)*/

uchar data REVERSE[4]={0,0,0,0};    /*存放倒计时时间(依次为百分秒,,分和时位)*/

 

/*定义运行状态*/

uchar data STATE =0;

/*STATE=0,秒表*/

/*STATE=1,倒计时分调整*/

/*STATE=2,倒计时小时调整*/

/*STATE=3,倒计时运行*/

/*STATE=4 or 7,时钟运行*/

/*STATE=5,时钟分调整*/

/*STATE=6,时钟时调整*/

 

bit bdata SND=0;                    /*秒表START*/

bit bdata RST=0;                    /*秒表RESET*/

bit bdata STP=0;                    /*倒计时STOP*/

 

/*数码管显示编码"0""9","A","-"*/

uchar code TABLE[]={0x 3f ,0x06,0x5b,0x 4f ,0x66,0x6d,0x7d,0x07,0x 7f ,0x 6f ,0x77,0x40};

 

void display(void)

{  

    uchar i;                    /*显示缓冲区首址*/

    uchar delay;                    /*显示延时*/

    uchar disp;                     /*显示内容*/

    uchar digit;                    /*定义数码管显示位*/

    digit=0x08;

    for (i=0;i<2;i++)               /*秒表,显示百分秒和秒*/

    {

        if (BUFFER[i]>100) disp=BUFFER[i]%10+10;

        else disp=BUFFER[i]%10;    

       

        DIGPORT=digit;

        WORDPORT=TABLE[disp];

       

        for (delay=0;delay<=200;delay++);

        digit=digit>>1;

        disp=BUFFER[i]/10;

       

        DIGPORT=digit;

        WORDPORT=TABLE[disp];

       

        for (delay=0;delay<=200;delay++);

        digit=digit>>1;

    }

}

 

 

void timer0(void)  interrupt 1 using 1

{

    /*重置定时初值*/

    TH0=-5000/256;

    TL0=-5000%256;

   

    /*时钟处理*/

    CLOCK[0]=CLOCK[0]+1;

    if ((CLOCK[0]==50) && (STATE>=4))

        {

        L0=!L0;

        }

    if (CLOCK[0]==100)

        {  

        if (STATE>=4) L0=!L0;

        CLOCK[0]=0;

        CLOCK[1]=CLOCK[1]+1;

       

        if (CLOCK[1]==60)

        {

            CLOCK[1]=0;

            CLOCK[2]=CLOCK[2]+1;

            if (CLOCK[2]==60)

            {

                CLOCK[2]=0;

                CLOCK[3]=CLOCK[3]+1;

                if (CLOCK[3]==24)

                {  

                CLOCK[3]=0;

                }

            }

        }

    }  

}

 

void timer2(void) interrupt 5 using 3

{

    TF2=0;

    TH2=-5000/256;

    TL2=-5000%256;

    /*秒表处理*/

    if (STATE==0)

    {

        SECOND[0]=SECOND[0]+1;

        if (SECOND[0]==50)

        {  

        L1=!L1;

        }

        if (SECOND[0]==100)

        {  

            L1=!L1;

            SECOND[0]=0;

            SECOND[1]=SECOND[1]+1;

            if (SECOND[1]==100)

            {

                SECOND[1]=0;

            }

        }      

    }

   

    /*倒计时处理*/

    if (STATE==3)

    {

        REVERSE[0]=REVERSE[0]+1;

        if (REVERSE[0]==50)

        {  

        L2=!L2;

        }

       

    if (REVERSE[0]==100)

    {  

            L2=!L2;

            REVERSE[0]=0;

            REVERSE[1]=REVERSE[1]+1;

            if (REVERSE[1]==60)

            {

            REVERSE[1]=00;

            REVERSE[2]=REVERSE[2]-1;

               

    if ((REVERSE[2]==0) && (REVERSE[3]==0))

    {

                    TR2=0;

                    STP=1;

                    BEEP=0;

                }

    else if (REVERSE[2]==0xff)

                {  

                REVERSE[2]=59;

                REVERSE[3]=REVERSE[3]-1;

                }

            }

        }      

    }

}

 

 

void intsvr1(void)  interrupt 2 using 2

{

    if (STATE==5)

    {  

        CLOCK[2]=CLOCK[2]+1;

        if (CLOCK[2]==60) CLOCK[2]=0;

    }

    if (STATE==6)

    {  

    CLOCK[3]=CLOCK[3]+1;

    if (CLOCK[3]==24) CLOCK[3]=0;

    }

}

 

void timer1(void)  interrupt 3 using 3

{

    if (STATE==0)

    {

        if (RST)

        {  

            SECOND[0]=0;

            SECOND[1]=0;

            L1=1;

            RST=0; 

        }

       

    else

        {

            if (SND) TR2=1;

    else 

        {  

            L1=1;

            TR2=0;

            RST=1;

            }

            SND=!SND;  

        }

    }

   

    else if (STATE==1)

        {

        REVERSE[2]=REVERSE[2]+1;

        if (REVERSE[2]==60) REVERSE[2]=0;

        }

   

else if (STATE==2)

    {

        REVERSE[3]=REVERSE[3]+1;

        if (REVERSE[3]==24) REVERSE[3]=0;  

    }

   

else

    {

        if (STP)

        {  

            BEEP=1;

            L2=1;

            STP=0; 

        }

        else TR2=0;

    }

}

 

 

void main(void)

{

    uchar stabak;               /*上一次程序运行的状态*/

    P1=0x 0f ;

    EA=1; IT1=1; ET0=1;

   

    TMOD=0x61;              /*T1方式2计数,T0方式1计时*/

    TH0=-5000/256; TL0=-5000%256;

    TH1=0xff; TL1=0xff;

    T2CON=0; TH2=-5000/256; TL2=-5000%256;

   

    K0=1; K1=1; K2 =1;

    STATE=P1&0x07;

    stabak=STATE;

       

    for (;;)

    {  

    switch (STATE)

        {

        case 0:                 /*STATE=0,秒表*/

            {

                EX1=0; ET1=1; ET2=1; TR1=1;  SND=1;

                L1=1; L0=0; L2=0;

                SECOND[0]=0;

                SECOND[1]=0;

            } break;

           

        case 1:                 /*STATE=1,倒计时分调整*/

            {

                EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;

                L2=1; L0=0; L1=0;

                REVERSE[0]=0;

                REVERSE[1]=0;

            } break;

           

        case 2:                 /*STATE=2,倒计时小时调整*/

            {

                EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;

                L2=1; L0=0; L1=0;

                REVERSE[0]=0;

                REVERSE[1]=0;

            } break;

           

        case 3:                 /*STATE=3,倒计时运行*/

            {

                EX1=0; ET1=1; ET2=1; TR1=1;

                if ((REVERSE[2]==0)&&(REVERSE[3]==0)) L2=1;

                else TR2=1;

                L0=0; L1=0;

            } break;

           

        case 5:                 /*STATE=5,时钟分调整*/

            {

                IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;

                L0=1; L1=0; L2=0;

            } break;

           

        case 6:/*STATE=6,时钟时调整*/

            {

                IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;

                L0=1; L1=0; L2=0;

            } break;

           

        default:                    /*STATE=4 or 7,时钟运行*/

            {

                EX1=0; ET1=0; ET2=1; TR0=1;

                L1=0; L2=0;

            }

        }

       

    while (STATE==stabak)

        {

            switch (STATE)

                {

                case 0:             /*STATE=0,秒表*/

                {

                    BUFFER[0]=SECOND[0];

                    BUFFER[1]=SECOND[1];

                } break;

               

                case 1:             /*STATE=1,倒计时分调整*/

                {

                    BUFFER[0]=REVERSE[2];

                    BUFFER[1]=101;/*A-*/

                } break;

               

                case 2:             /*STATE=2,倒计时小时调整*/

                {

                    BUFFER[0]=110;/*-A*/

                    BUFFER[1]=REVERSE[3];

                } break;

               

                case 3:             /*STATE=3,倒计时运行*/

                {                  

                    BUFFER[0]=REVERSE[2];

                    BUFFER[1]=REVERSE[3];

                } break;

               

                case 5:             /*STATE=5,时钟分调整*/

                {

                    BUFFER[0]=CLOCK[2];

                    BUFFER[1]=101;/*A-*/

                } break;

               

                case 6:             /*STATE=6,时钟时调整*/

                {

                    BUFFER[0]=110;/*-A*/

                    BUFFER[1]=CLOCK[3];

                } break;

               

                default:                /*STATE=4 or 7,时钟运行*/

                {

                    BUFFER[0]=CLOCK[2];

                    BUFFER[1]=CLOCK[3];            

                }

            }

           

            display();

            K0=1; K1=1; K2 =1;

            STATE=P1&0x07;         

        }

        stabak=STATE;

    }  

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
8051单片机数字钟(完整)(包括原理图,c语言源代码) 键盘8为显示功能键: 按第一次——显示时间 按第二次——显示日期 按第三次——显示星期 键盘0为调节功能键: 按第一次-----1,2两位闪烁 按第二次-----4,5两位闪烁 按第三次-----7,8两位闪烁 键盘1为增加键: 1,2两位闪烁时,按一下加1 4,5两位闪烁时,按一下加1 7,8两位闪烁时,按一下加1 键盘2为减少键: 1,2两位闪烁时,按一下减1 4,5两位闪烁时,按一下减1 7,8两位闪烁时,按一下减1 上电初始时数码管显示为00-00-00 按第一次键盘8——显示时间 显示模式为:时-分-秒 在显示时间的时候按键盘0调节功能键: 按第一次-----秒的两位闪烁 按第二次-----分的两位闪烁 按第三次-----时的两位闪烁 按第四次-----秒,分,时均不闪烁,时间正常显示 当秒的两位闪烁时,按键盘1一下秒加1,按键盘2一下秒减1 当分的两位闪烁时,按键盘1一下分加1,按键盘2一下分减1 当时的两位闪烁时,按键盘1一下时加1,按键盘2一下时减1 按第二次键盘8——显示日期 显示模式为:年-月-日 在显示日期的时候按键盘0调节功能键: 按第一次-----日的两位闪烁 按第二次-----月的两位闪烁 按第三次-----年的两位闪烁 按第四次-----年,月,日均不闪烁,日期正常显示 当日的两位闪烁时,按键盘1一下日加1,按键盘2一下日减1 当月的两位闪烁时,按键盘1一下月加1,按键盘2一下月减1 当年的两位闪烁时,按键盘1一下年加1,按键盘2一下年减1 按第三次键盘8——显示星期 显示模式为:最后一位显示1—7 在显示日期的时候按键盘0调节功能键: 按第一次-----星期闪烁 按第二次-----星期正常显示 当星期闪烁时,按键盘1一下星期加1,按键盘2一下星期加减1 按第四次键盘8返回显示时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值