之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧 
 
程序- /*        本程序仅应用于‘4位单片机电子钟电路’
 -         2051
 -         晶振 3.579MHz
 -                 main.c
 - */
 - #include <STC11.H>
 - #define uint unsigned int
 - #define uchar unsigned char
 - uchar code table[]={0xfd,0x25,0xbb,0xaf,0x67,0xcf,0xdf,0xa5,0xff,0xef};         //0~9仅限本电路,正常显示
 - uchar code table2[]={0xfc,0x24,0xba,0xae,0x66,0xce,0xde,0xa4,0xfe,0xee};
 - uchar x,h,m,s,flag,ID,flag_set;                        //ID=1调整分钟 ID=2调整时钟
 - void delay(uint a)                  //延时函数0~65535
 - {
 -         while(a--);
 - }
 - void display()                                  //显示函数
 - {
 -         uchar x=1000;                          //x延时时间
 -         if(flag_set!=1)
 -         {
 -                 P37=0;                                          //显示分个位
 -                 P1=table[m%10];
 -                 delay(x);
 -                 P37=1;
 -                 P32=0;                                          //显示分十位
 -                 P1=table[m/10];
 -                 delay(x);
 -                 P32=1;
 -   }
 -         else
 -         {
 -                 if (flag)
 -                 {
 -                         P37=0;                                          //显示分个位
 -                         P1=0x01;
 -                         delay(x);
 -                         P37=1;
 -                         P32=0;                                          //显示分十位
 -                         P1=0x01;
 -                         delay(x);
 -                         P32=1;
 -                 }
 -                 else
 -                 {
 -                         P37=0;                                          //显示分个位
 -                         P1=table[m%10];
 -                         delay(x);
 -                         P37=1;
 -                         P32=0;                                          //显示分十位
 -                         P1=table[m/10];
 -                         delay(x);
 -                         P32=1;
 -                 }
 -         }
 -         if(flag_set!=2)
 -         {
 -                 P31=0;                                          //显示时个位
 -                 P1=table[h%10];
 -                 delay(x);
 -                 P31=1;
 -                 if (flag)                                 //闪烁秒和显示时十位
 -                 {
 -                         P30=0;
 -                   P1=table[h/10];
 -                   delay(x);
 -                   P30=1;
 -                 }
 -                 else
 -                 {
 -                   P30=0;
 -                   P1=table2[h/10];
 -                   delay(x);
 -                   P30=1;
 -                 }
 -         }
 -         else
 -         {
 -                 if(flag)
 -                 {
 -                         P31=0;                                          //显示时个位
 -                         P1=0x01;
 -                         delay(x);
 -                         P31=1;
 -                         P30=0;
 -                   P1=0x01;
 -                   delay(x);
 -                   P30=1;
 -                 }
 -                 else
 -                 {
 -                         P31=0;                                          //显示时个位
 -                         P1=table[h%10];
 -                         delay(x);
 -                         P31=1;
 -                         P30=0;                                          //显示时十位
 -                   P1=table[h/10];
 -                   delay(x);
 -                   P30=1;
 -                 }
 -         }
 - }
 - void keyscan()
 - { uchar x=1000;                                          //x消抖延时系数
 -         delay(x);
 -   if(P34==0)
 -         { while(P34==0)
 -                                         display();
 -                 ID++;
 -           switch(ID)
 -           {
 -                    case 1:                                                                                 //set m        flag_set=1
 -                                 flag_set=1;
 -                                 while(P34)
 -                                 {if(P35==0)
 -                                   {        while(P35==0)
 -                                                                         display();
 -                                                 m++;
 -                                                 if(m==60)
 -                                                         m=0;
 -                                   }
 -                                   else
 -                                   {
 -                                                 display();
 -                                         }
 -                                 }
 -                                 break;
 -                 case 2:                                                                                                 //set h    flag_set=2
 -                         flag_set=2;
 -                   while(P34)
 -                                 {if(P35==0)
 -                                   {        while(P35==0)
 -                                                                         display();
 -                                                 h++;
 -                                                 if(h==24)
 -                                                         h=0;
 -                                   }
 -                                   else
 -                                   {
 -                                                 display();
 -                                         }
 -                                 }
 -                                 break;
 -                 case 3:
 -                 ID=0;
 -                 flag_set=0;
 -                 break;
 -           }
 -         }
 - }
 - void main(void)
 - {
 -         TH0=(65536-29825)/256;          //中断初始化,100ms
 -         TL0=(65536-29825)%256;
 -         TMOD=0x01;                                //定时器0方式1
 -         ET0=1;                                          //中断T0允许
 -         TR0=1;                                          //开T0
 -         //EX0=1;                                        //开外部中断0
 -         //IT0=1;                                        //下降沿触发
 -         EA=1;                                                  //开总中断
 -         while(1)
 -         {
 -           display();
 -                 if (P34==0)
 -                         keyscan();
 -         }
 - }
 - void t0() interrupt 1
 - {        x++;
 -         if(x%5==0)                                  //闪烁标志
 -                  flag=~flag;
 -         if(x==10)                                          //定时1s
 -         { x=0;
 -           s++;
 -           if(s==60)
 -           {        s=0;
 -                         m++;
 -                         if(m==60)
 -                         {        m=0;
 -                                 h++;
 -                                 if(h==24)
 -                                 {        h=0;        }
 -                   }
 -                 }
 -   }
 -         TH0=(65536-29825)/256;                  //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
 -         TL0=(65536-29825)%256;
 - }
  
  
 
 
 |