⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clockof51mcu.txt

📁 这是基于ATMEL89S51上的一个电子时钟源代码程序,有相当完美的注释解说,希望对大家有所帮助.
💻 TXT
字号:

/*************************************************************\
项目名称:数字钟
功能:日历,时间,码表,闹钟
备注:晶振11.0592

\*************************************************************/


#include<at89x52.h>
#include<intrins.h>
#include<math.h>

#define uint  unsigned int
#define uchar unsigned char
#define set     P3_7
#define key1    P3_6
#define key2    P3_5
#define nr      P3_4
#define ringing P1_3

bit          rng;       //      全局铃声控制
uint         count;        //       用于计次,单位   10ms
uint         mcount;    //      码表计数
uchar        rcount;    //      响铃时间,单位   10ms
uchar        cstate;    //      显示的状态,也是全局状态
uchar        kstate;    //      按键的状态
bit          stop;
uchar time[]={52,37,8};
uchar date[]={30,5,7,20};
uchar alarm[]={40,8};
uchar makeit[]={0x00,0x00,0x00,0x00};
//时间数组,分别为秒,分,时(3);日,月,年(4);码表(4);闹钟(2)
uchar k[]  ={0x02,0x04,0x01,0x08,0x20,0x40,0x10,0x80};                 //数码管的位置,片选数码管
uchar dat[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};                  //数码管的数据
uchar leddata[]={ 
                 0x41,  //"0"
                0xF5,  //"1"
                0x29,  //"2"
                0x31,  //"3"
                0x95,  //"4"
                0x13,  //"5"
                0x03,  //"6"
                0x75,  //"7"
                0x01,  //"8"
                0x11,  //"9"
                0x05,  //"A"
                0x83,  //"B"
                0x4B,  //"C"
                0xA1,  //"D"
                0x0B,  //"E"
                0x0F,  //"F"
                0x85,  //"H"
                0xCB,  //"L"
                0x45,  //"n"
                0xC1,  //"u"
                0x0D,  //"P"
                0xA3,  //"o"
                0xBF,  //"-"
                0xFF,  //熄灭
                0xF5  //自定义
                            };


void delay(int m)     //0.1MS
{
m*=20;
while(m--){}
}

void time_init()
{
      EA = 1;                           /* 开总中断 */

    ET0 = 1;                          /* 允许定时器0中断 */
    ET1 = 1;                          /* 允许定时器1中断 */

    TMOD = 0x11;                      /* 定时器工作方式选择 */

    TL0 = 0xFF;     
    TH0 = 0xDB;                       /* 定时器赋予初值 10MS*/

    TL1 = 0xFF;     
    TH1 = 0xDB;                       /* 定时器赋予初值 10MS*/

    TR0 = 1;                          /* 启动定时器 0*/
//    TR1 = 1;                          /* 启动定时器 1*/

    count=0;                          //10MS指针为0
}

void timer0(void) interrupt 1 using 0
{
    TR0 = 0;
    TL0=0xFF;
    TH0=0xDB;
    TR0 = 1;
     count++;
    } /* 定时器0中断 */     //10MS 中断一次
void timer1(void) interrupt 3 using 0
{
    TR1 = 0;
    TL1=0xFF;
    TH1=0xDB;
    rcount--;
    mcount++;
    TR1 = 1;
    if (rcount==0&&stop==1) TR1 = 0;ringing=0;
    }  /* 定时器1中断 */


void show()                               //LED显示数据
{
uchar i;         //扫描第i个数码管
uchar j;         //第j遍


for (j=0;j<3;j++) {
   for(i=0;i<8;i++) {
       P2=0xff-k[i];
       P0=leddata[dat[i]];
       delay(10) ;    
     }
   }
} 
 
void ring(bit rt)                 //响铃
{
    if (rt) rcount=10; 
    else  rcount=500;
    if (rng) ringing=1;
    else {ringing=0;
           return;}
    TR1 = 0;
    TL1 =0xFF;
    TH1 =0xDB;
    TR1 = 1;
    return;
} 
    
void main()
{

/**************系统初始化*****************/
   int k1;     //一个计数变量
   k1=0;
   time_init();
   cstate=0;
   kstate=0;
   P3=0xff;
   stop=0;
   rng=1;
/*****************************************/   
   while(1)
   {
           switch(cstate)
            { case 0: 
                    
                        dat[0]=time[0]%10; 
                        dat[1]=time[0]/10;
                        dat[2]=time[1]%10;
                        dat[3]=time[1]/10;
                        dat[4]=time[2]%10;
                        dat[5]=time[2]/10;
                        dat[6]=23;
                        dat[7]=23;
                        show();
                        switch(kstate){                 //这部分用于按键识别
                                 case 0:
                                    if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}    
                                    else kstate=0;
                                    break;
                                 case 1: 
                                     if (set==0)          kstate=2;
                                    if (key1==0)         kstate=3;
                                    if (key2==0)         kstate=4;
                                    if (nr==0)           kstate=5; 
                                     if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
                                     break;    
                                 case 2: 
                                    if (set==1)  {kstate=0;cstate=1;k1=0;}
                                    break;
                                case 3: 
                                    if (key1==1) {kstate=0;k1++;if(k1==3) k1=0;}
                                    break;
                                case 4: 
                                    if (key2==1) {kstate=0;time[k1]++;         }
                                    break;
                                 case 5:
                                    if (nr==1)   {kstate=0;rng=!rng;}
                                      break;
                                }
                        break;

                case 1:                           
                         dat[0]=date[0]%10; 
                        dat[1]=date[0]/10;
                        dat[2]=date[1]%10;
                        dat[3]=date[1]/10;
                        dat[4]=date[2]%10;
                        dat[5]=date[2]/10;
                        dat[6]=date[3]%10;
                        dat[7]=date[3]/10;
                        show();
                        switch(kstate){                 //这部分用于按键识别
                                 case 0:
                                    if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}    
                                    else kstate=0;
                                    break;
                                 case 1: 
                                     if (set==0)          kstate=2;
                                    if (key1==0)         kstate=3;
                                    if (key2==0)         kstate=4;
                                    if (nr==0)           kstate=5; 
                                     if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
                                     break;    
                                 case 2: 
                                    if (set==1)  {kstate=0;cstate=2;k1=0;}
                                    break;
                                case 3: 
                                    if (key1==1) {kstate=0;k1++;if(k1==3) k1=0;}
                                    break;
                                case 4: 
                                    if (key2==1) {kstate=0;date[k1]++;}
                                    break;
                                 case 5:
                                    if (nr==1)   {kstate=0;rng=!rng;}
                                      break;
                                } break;

                 case 2:  //这里是闹钟
                        dat[0]=alarm[0]%10; 
                        dat[1]=alarm[0]/10;
                        dat[2]=alarm[1]%10;
                        dat[3]=alarm[1]/10;
                        dat[4]=23;
                        dat[5]=23;
                        dat[6]=23;
                        dat[7]=23;
                        show();
                        switch(kstate){                 //这部分用于按键识别
                                 case 0:
                                    if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}    
                                    else kstate=0;
                                    break;
                                 case 1: 
                                     if (set==0)          kstate=2;
                                    if (key1==0)         kstate=3;
                                    if (key2==0)         kstate=4;
                                    if (nr==0)           kstate=5; 
                                     if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
                                     break;    
                                 case 2: 
                                    if (set==1)  {kstate=0;cstate=3;k1=0;  }
                                    break;
                                case 3: 
                                    if (key1==1) {kstate=0;k1++;if(k1==2) k1=0;}
                                    break;
                                case 4: 
                                    if (key2==1) {kstate=0;alarm[k1]++;if(alarm[0]>=60){alarm[1]++;alarm[0]=0;}
                                    if(alarm[1]>=24){alarm[1]=0;}             }  //在这里加上闹铃进位
                                    break;
                                 case 5:
                                    if (nr==1)   {kstate=0;rng=!rng;}
                                      break;
                                }  break;
                    case 3:    //这里是码表
                        dat[0]=makeit[0]%10; 
                        dat[1]=makeit[0]/10;
                        dat[2]=makeit[1]%10;
                        dat[3]=makeit[1]/10;
                        dat[4]=makeit[2]%10;
                        dat[5]=makeit[2]/10;
                        dat[6]=makeit[3]%10;
                        dat[7]=makeit[3]/10;
                        show();
                        switch(kstate){                 //这部分用于按键识别
                                 case 0:
                                    if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}    
                                    else kstate=0;
                                    break;
                                 case 1: 
                                     if (set==0)          kstate=2;
                                    if (key1==0)         kstate=3;
                                    if (key2==0)         kstate=4;
                                    if (nr==0)           kstate=5; 
                                     if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
                                     break;    
                                 case 2: 
                                    if (set==1)  {kstate=0;cstate=0;k1=0;
                                       {mcount=0;makeit[0]=0;makeit[1]=0;makeit[2]=0;makeit[3]=0;k1=0;}
                                        }
                                    break;
                                case 3:          //start
                                    if (key1==1) {kstate=0; stop=0;ringing=0; TR1 =1;}                
                                    break;
                                case 4:          //stop    and clear
                                    if (key2==1) {kstate=0;  rcount=0;stop=1; TR1 =0; 
                                        if(k1) {mcount=0;makeit[0]=0;makeit[1]=0;makeit[2]=0;makeit[3]=0;k1=0;}
                                            else k1=1;
                                    
                                    }     
                                    break;
                                 case 5:            
                                    if (nr==1)   {kstate=0;  rng=!rng;}
                                      break;
                                }
           makeit[0]=mcount;
           if (mcount>=100)    {mcount=0;}
           if (makeit[0]>=100) {makeit[1]++;makeit[0]=0;}
           if (makeit[1]>=60)  {makeit[2]++;makeit[1]=0;}
           if (makeit[2]>=60)  {makeit[3]++;makeit[2]=0;}
           if (makeit[3]>=24)  {makeit[3]=0;}
                    
                     //码表

            }/* 全局显示*/
                /*下面为时钟累加*/    
              if (count>=100)    {time[0]++;  count=0;}
           if (time[0]>=60)   {time[1]++;time[0]=0;}
           if (time[1]>=60)   {time[2]++;time[1]=0;}
           if (time[2]>=24)   {date[0]++;time[2]=0;}
           switch(date[1]){
             case 1:
             case 3:
             case 5:
             case 7:
             case 8:
             case 10:
             case 12: if (date[0]>=32)   {date[1]++;date[0]=1;}   break;
             case 4:
             case 6:
             case 9:
             case 11: if (date[0]>=31)   {date[1]++;date[0]=1;}   break;
             case 2:  if ((date[2]!=0 && (date[2]%4==0))||(date[2]==1&&date[3]%4>0)) 
                              {if (date[0]>=30)   {date[1]++;date[0]=1;}}
                                       else {if (date[0]>=29)   {date[1]++;date[0]=1;}}     break;
             }
           if (date[1]>=13)    {date[2]++;date[1]=1;}
           if (date[2]>=100)   {date[2]=0;}
              if (date[3]>=100)   {date[3]=0;}
           P1=P3;
           if (time[1]==alarm[0]&&time[2]==alarm[1]) ring(0);                   
           //在这里加入闹铃比对 
   }


}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -