找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机89c52时钟程序+3个按键 注释非常详细

[复制链接]
跳转到指定楼层
楼主
三个按键:
key0 //调整键--模式
key1//加1键
key2//减1键
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
#include  <reg51.h>
#define uchar unsigned char
uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳极数码管显示"0~9","灭"和"-"的字段码
//uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共阴数码管
uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位选
uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//显示数据缓冲区,时十、个位、分十、个位、秒十、个位初始为0,0x0b为"-"编码
uchar data timedat[3]={0x00,0x00,0x00};  //分别为秒、分和小时的计数值(记录K1和K2次数)
uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;
//定义定时次数变量,调整模式变量,按加1键次数变量,按减1键次数变量
sbit  key0=P1^0 ;  //调整键--模式
sbit  key1=P1^1 ;  //加1键
sbit  key2=P1^2 ;  //减1键
//---------------------------------------
void  delay1ms( unsigned  int  z )  //定义延时1ms函数
{ unsigned  int  x, y ;
for  ( x=z;  x>0;  x-- )
                for  ( y=120; y>0 ;  y-- )        ;
}
//---------------------------------------
//按键处理函数。如果没有按键则时钟正常走时。当按K0键1次→暂停走时进入调小时状态;再按K0键1次→进入调分钟状态;再按K0键1次→回到正常走时状态。对于K1和K2键,如果正常走时下→按K1K2键不起作用;如果进入调时或者调分状态→按K1键可对时或分加1操作,小时加到24则回0,分钟加到60则回0。按K2键可对时或分减1操作,小时减到负则回23,分钟减到负则回59。
void keyscan(  void )
{        EA=0;  //关中断
        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (key0==0)         { delay1ms(10);         while (key0==0);
                        num++; TR0=0; ET0=0;  // 调整键K0每按1次--模式变量num加1
                        if (num>=3)         {num=0;  ET0=1;  TR0=1;  }  // 启动T0校时
        }
                if (num!=0)        //模式变量不等于0
{        if (key1==0)        // K1键确实按下
         {        delay1ms(10);         while (key1==0);           timedat[num]++;  //记录按键K1按下次数
                                if (num==2) n1=24;  else n1=60;                //模式变量等于小时2--则回迟到一天或60分钟
if (timedat[num]>=n1)          { timedat[num]=0; }          }
                }
                if (num!=0)
                 {        if (key2==0)        
{        delay1ms(10);        while (key2==0);                 timedat[num]--;  //记录按键K2按下次数
                                if (num==2) n2=23;else n2=59;                        
                                if (timedat[num]<=0)                  {timedat[num]=n2; }          }
                }
                 EA=1;
        }
//---------------------------------------
//数码管显示函数。时间显示先秒个位计算显示→秒十位计算显示→再分个位计算显示→分十位显示→再时个位计算显示→时十位显示。
         void  display( void )
        {          uchar k;
                if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
                 dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒
dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分
dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //时
for ( k=0;  k<8;  k++ )
                        {         P0=tab[ dis[k] ];  P2=wetab[k];    delay1ms(1);     P2=0x00;         }
        }        
//---------------------------------------
//主函数,时间显示先秒个位计算显示,然后是秒十位计算显示;再就是分个位计算显示,然后是分十位显示;再就是时个位计算显示,然后是时十位显示。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。
         void main( void )
        {   TMOD=0x01;   //T0定时50ms,方式1
                EA=1;  ET0=1;  TR0=1;  //开中断,允许T0中断,启动T0
                TH0=0x3c;  TL0=0xb0;
                while (1)
                        {         display( ) ;
                                keyscan( ) ;
                        }
}
//定时器/计数器T0中断服务函数。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。
  void  timer0(void)  interrupt  1
{ ET0=0; TR0=0;   //不许T0中断也不启动
TH0=0x3c;  TL0=0xb0;  
TR0=1;  //启动T0
ms50++;
P1=0xf7;
         if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (ms50==20)         {        ms50=0x00;  timedat[0]++;  //变量m回0,且秒加1
                if (timedat[0]==60)          {         timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1
                        if (timedat[1]==60)         {         timedat[1]=0;timedat[2]++;  //分到60后回0,且时加1
                                if (timedat[2]==24)         {         timedat[2]=0;         }         }        }  //时到24后回0

        }
        ET0=1;   //允许T0中断
}

全部资料51hei下载地址:
shumaguanshizho时钟.zip (81.22 KB, 下载次数: 42)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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