2051时针程序练手,全是自己写的,有仿真文件

2020-02-03 10:08发布

本帖最后由 PRO 于 2012-10-17 15:48 编辑

之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧
__.JPG (93.88 KB, 下载次数: 0) 下载附件 2012-10-17 15:47 上传
程序

  1. /*        本程序仅应用于‘4位单片机电子钟电路’
  2.         2051
  3.         晶振 3.579MHz
  4.                 main.c
  5. */
  6. #include <STC11.H>
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. uchar code table[]={0xfd,0x25,0xbb,0xaf,0x67,0xcf,0xdf,0xa5,0xff,0xef};         //0~9仅限本电路,正常显示
  10. uchar code table2[]={0xfc,0x24,0xba,0xae,0x66,0xce,0xde,0xa4,0xfe,0xee};
  11. uchar x,h,m,s,flag,ID,flag_set;                        //ID=1调整分钟 ID=2调整时钟
  12. void delay(uint a)                  //延时函数0~65535
  13. {                                          
  14.         while(a--);
  15. }

  16. void display()                                  //显示函数
  17. {       
  18.         uchar x=1000;                          //x延时时间
  19.        
  20.         if(flag_set!=1)
  21.         {
  22.                 P37=0;                                          //显示分个位
  23.                 P1=table[m%10];
  24.                 delay(x);
  25.                 P37=1;
  26.                
  27.                 P32=0;                                          //显示分十位
  28.                 P1=table[m/10];                                         
  29.                 delay(x);
  30.                 P32=1;
  31.   }
  32.         else
  33.         {
  34.                 if (flag)
  35.                 {
  36.                         P37=0;                                          //显示分个位
  37.                         P1=0x01;
  38.                         delay(x);
  39.                         P37=1;
  40.        
  41.                         P32=0;                                          //显示分十位
  42.                         P1=0x01;                                         
  43.                         delay(x);
  44.                         P32=1;
  45.                 }
  46.                 else
  47.                 {
  48.                         P37=0;                                          //显示分个位
  49.                         P1=table[m%10];
  50.                         delay(x);
  51.                         P37=1;
  52.                        
  53.                         P32=0;                                          //显示分十位
  54.                         P1=table[m/10];                                         
  55.                         delay(x);
  56.                         P32=1;
  57.                 }
  58.         }
  59.        
  60.         if(flag_set!=2)
  61.         {
  62.                 P31=0;                                          //显示时个位
  63.                 P1=table[h%10];
  64.                 delay(x);
  65.                 P31=1;
  66.        
  67.                 if (flag)                                 //闪烁秒和显示时十位
  68.                 {
  69.                         P30=0;                                          
  70.                   P1=table[h/10];
  71.                   delay(x);
  72.                   P30=1;
  73.                 }
  74.                 else
  75.                 {
  76.                   P30=0;                                          
  77.                   P1=table2[h/10];
  78.                   delay(x);
  79.                   P30=1;
  80.                 }
  81.         }
  82.         else
  83.         {
  84.                 if(flag)
  85.                 {
  86.                         P31=0;                                          //显示时个位
  87.                         P1=0x01;
  88.                         delay(x);
  89.                         P31=1;
  90.                
  91.                         P30=0;                                          
  92.                   P1=0x01;
  93.                   delay(x);
  94.                   P30=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         P31=0;                                          //显示时个位
  99.                         P1=table[h%10];
  100.                         delay(x);
  101.                         P31=1;

  102.                         P30=0;                                          //显示时十位
  103.                   P1=table[h/10];
  104.                   delay(x);
  105.                   P30=1;
  106.                 }                
  107.         }                                          
  108. }

  109. void keyscan()                          
  110. { uchar x=1000;                                          //x消抖延时系数
  111.         delay(x);
  112.   if(P34==0)
  113.         { while(P34==0)
  114.                                         display();
  115.                 ID++;
  116.           switch(ID)
  117.           {
  118.                    case 1:                                                                                 //set m        flag_set=1
  119.                                 flag_set=1;                                                         
  120.                                 while(P34)
  121.                                 {if(P35==0)
  122.                                   {        while(P35==0)
  123.                                                                         display();
  124.                                                 m++;
  125.                                                 if(m==60)
  126.                                                         m=0;         
  127.                                   }
  128.                                   else
  129.                                   {       
  130.                                                 display();
  131.                                         }
  132.                                 }       
  133.                                 break;

  134.                 case 2:                                                                                                 //set h    flag_set=2
  135.                         flag_set=2;                                                                         
  136.                   while(P34)
  137.                                 {if(P35==0)
  138.                                   {        while(P35==0)
  139.                                                                         display();
  140.                                                 h++;
  141.                                                 if(h==24)
  142.                                                         h=0;         
  143.                                   }
  144.                                   else
  145.                                   {       
  146.                                                 display();
  147.                                         }
  148.                                 }       
  149.                                 break;

  150.                 case 3:
  151.                 ID=0;
  152.                 flag_set=0;
  153.                 break;
  154.           }
  155.                
  156.         }
  157.        
  158. }

  159. void main(void)
  160. {
  161.         TH0=(65536-29825)/256;          //中断初始化,100ms
  162.         TL0=(65536-29825)%256;       
  163.         TMOD=0x01;                                //定时器0方式1
  164.         ET0=1;                                          //中断T0允许
  165.         TR0=1;                                          //开T0
  166.         //EX0=1;                                        //开外部中断0
  167.         //IT0=1;                                        //下降沿触发
  168.         EA=1;                                                  //开总中断         

  169.         while(1)
  170.         {       
  171.           display();
  172.                 if (P34==0)
  173.                         keyscan();       
  174.         }
  175. }

  176. void t0() interrupt 1
  177. {        x++;
  178.         if(x%5==0)                                  //闪烁标志
  179.                  flag=~flag;
  180.         if(x==10)                                          //定时1s
  181.         { x=0;
  182.           s++;
  183.           if(s==60)
  184.           {        s=0;
  185.                         m++;
  186.                         if(m==60)
  187.                         {        m=0;
  188.                                 h++;
  189.                                 if(h==24)
  190.                                 {        h=0;        }
  191.                   }
  192.                 }       
  193.   }
  194.         TH0=(65536-29825)/256;                  //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
  195.         TL0=(65536-29825)%256;       
  196. }


复制代码 四位单片机电子钟.zip (18.33 KB, 下载次数: 6) 2012-10-17 15:10 上传 点击文件名下载附件      仿真文件

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。