找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2442|回复: 0
打印 上一主题 下一主题
收起左侧

用定时器做时钟的仿真

[复制链接]
跳转到指定楼层
楼主
用定时器做时钟的仿真,可调节时间,两个“-”1秒闪烁一次

下面是源代码
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00,
                        0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
uchar mstcnt1=0;
uchar miao_ss=0;
char k1num=0,snum,fnum;
sbit k1=P1^0;                 // 设置
sbit k2=P1^1;                 //加
sbit k3=P1^2;                 //减

sbit LED=P1^7;

/*函数声明*/
void delay(uchar k );      //延时子程序
void time_pro( );    //时间处理子程序
void display( );       //显示子程序
void keyscan( );                //键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
   {
    for(j=0;j<125;j++)
     {;}
   }
}     
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
        if(seconde==60)                    //秒钟设为60进制
          { seconde=0;
            minite++;
           if( minite==60)              //分钟设为60进制
              { minite=0;
                hour++;
              if(hour==24)              //时钟设为24进制
                 {hour=0; }
              }
          }

}
/*****************************/
/* 显示子程序*/
/*****************************/
void display(void)   
{  
   if(k1num==0)
        {
                snum=30;
                fnum=30;
        }
        
        if(k1num==1)                //如果k1num=1,分位闪烁
        {
                fnum++;
                snum=30;                // snum=15,每分钟闪烁2次;snum=30,每分钟闪烁1次;
        }
        
        if(k1num==2)
        {
                snum++;
                fnum=30;
        }
        



        if(snum>=30)

        {
        P2=0xfe;
        P0=dispcode[hour/10];                 //显示小时的十位
        delay(4);

                        P2=0xfd;
                P0=dispcode[hour%10];        //显示小时的个位+秒点闪烁
                        delay(4);
                        

                if(snum==60)
                        snum=0;
       }

           if(seconde%2)
           {
           P2=0xfb;
                P0=dispcode[10];
                delay(4);
                }
               
                else{P2=0xfb;
                P0=dispcode[11];
                delay(4);}         
            
    if(fnum>=30)
                {
                P2=0xf7;
        P0=dispcode[minite/10];               //显示分的十位
        delay(4);

            P2=0xef;
        P0=dispcode[minite%10];        //显示分的个位
        delay(4);
                }

                if(fnum==60)
                        fnum=0;

        /*        P2=0xdf;
                P0=dispcode[10];
                delay(4);*/


            P2=0xbf;
        P0=dispcode[seconde/10];             //显示秒的十位
        delay(4);

            P2=0x7f;
        P0=dispcode[seconde%10];             //显示秒的个位
        delay(4);        
                        
               
}
                     

/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
    if(k1==0)                     //设置
       {
           delay(30);
               if(k1==0)
                   {   while(!k1);
                       k1num++;
                      if(k1num==1)   //这句不写,调时间时,秒走时;
                        {TR0=0; }           //这句写上,调时间时,秒停止走时;
                                                if(k1num==3)
                                                {
                                                seconde=0;
                                                k1num=0;
                                                TR0=1;}
                   }
       }


if(k1num==1)
   {
        if(k3==0)                    //按键3分的调整减
       {
            delay(30);
               if(k3==0)
                 { while(!k3);
                    minite--;
                    if(minite==-1)
                      {minite=59;}
       }
     }

        if(k2==0)                    //按键2分的调整加
       {
            delay(30);
               if(k2==0)
                 { while(!k2);
                    minite++;
                    if(minite==60)
                      {minite=0;}
       }
     }

    }


if(k1num==2)
        {
        if(k2==0)                   //按键2小时的调整加
       {
            delay(30);
               if(k2==0)
                   {
                                           while(!k2);
                       hour++;
                    if(hour==24)
                      {hour=0; }
                 }
       }


           if(k3==0)                   //按键3小时的调整减
       {
            delay(30);
               if(k3==0)
                   {
                                           while(!k3);
                       hour--;
                    if(hour==-1)
                      {hour=23; }
                         }
       }

         }
}
void timer0(void) interrupt 1      //定时器0方式1,50ms中断一次
    {                                                                          //晶振 12MHz
        TH0=0x3c;
                TL0=0xb0;
        mstcnt++;
        if(mstcnt==20)
        {
            seconde++;
            mstcnt=0;    //注意点。对计数单元的清零十分的重要,本次调试中就是
                //    ss=!ss;
                //        LED=ss;
                }               //因为忽略了这一点,给我造成了很大的被动。

}


/*void timer1(void) interrupt 3      //定时器0方式1,50ms中断一次
    {                                                                          //晶振 12MHz
        TH0=0x3c;
                TL0=0xb0;
            miao_ss++;
                if(miao_ss==10)
                {   
                        miao_ss=0;     
                //        P0=dispcode[10];
                        LED=!LED;
                        
                //        delay(5);
                //        P0=dispcode[11];
                  }        
}          */

/**************************/
/*主函数*/
/**************************/
void main(void)
{      
//        P1=0xff;                //初始化p1口,全设为1      
        TMOD = 0x11; //time0为定时器,方式1
        TH0=0x3c;             //预置计数初值
        TL0=0xb0;
        EA=1;
        ET0=1;
        ET1=1;
        TR1=1;
        TR0=1;
    while (1)
        {   
   keyscan( );    //按键扫描
   time_pro( ); //时间处理
   display( ); //显示时间
        }
}                                                                //仿真通过 8位数码管显示88—88—88样式的时钟


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表