找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11548|回复: 4
收起左侧

4位共阳数码管电子钟原理图及单片机程序流程图等

[复制链接]
ID:546954 发表于 2019-5-25 15:30 | 显示全部楼层 |阅读模式
原理图用PROTEL99SE画的,整点报时(倒数几秒蜂鸣器响),4位数码管显示时和分,两个发光二极管闪烁代表秒信号。详细的程序清单和流程图。

程序流程图:
0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. void delay();
  5. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  6.                     0x07,0x7f,0x6f,0x00,0x7c,0x39,0x5e,
  7.                     0x79,0x71};//共阴数码管代码
  8. uint x,y,q,b,s,g,cunshi,cunfen,t0;
  9. uchar sigh,sigh2=1,sigh3,banmiao,miaozt,nz;//banmiao是半秒标志位,miaozt是让调时时小数点不闪
  10. uint nshi,nfen;//闹钟时、分变量
  11. int bxshi,bsshi;//报时时间段变量,上下限  
  12. int miao,fen,shi;
  13. uchar count1,count2,count3,count4,count5;
  14. sbit K1=P1^0;//位选0到3
  15. sbit K2=P1^1;
  16. sbit K3=P1^2;        
  17. sbit K4=P1^3;
  18. sbit deep=P2^0;
  19. sbit an1=P0^0;
  20. sbit an2=P0^1;
  21. sbit an3=P0^2;
  22. sbit an4=P0^3;
  23. sbit hong=P2^2;
  24. void init();
  25. void display(int q,int b,int s,int g);
  26. void ajcl();//按键及处理
  27. void baoshiyf();//报时与否函数
  28. void kaiji();//开机系统检测
  29. void nzzx();//闹钟执行
  30. void main()
  31. {
  32.      init();
  33.      while(1)
  34.          {
  35.                   kaiji();
  36.                   ajcl();
  37.                   display(q,b,s,g);
  38.                   baoshiyf();  
  39.                   nzzx();        
  40.     }                  
  41. }
  42. void init()
  43. {
  44.    hong=1;        
  45.    P3=0xc0;
  46.    K1=0;K2=0;K3=0;K4=0;
  47.    P3=0xc0;
  48.    K1=1;K2=1;K3=1;K4=1;
  49.    TMOD=0x11;ET1=1;x=65000;
  50.    TH0=(65536-50000)/256;
  51.    TL0=(65536-50000)%256;
  52.    TH1=65000/256;
  53.    TL1=65000%256;
  54.    EA=1;
  55.    ET0=1;
  56.    TR0=1;
  57.    deep=0;
  58.    nz=1;
  59.    bxshi=6;bsshi=22;
  60. }
  61. void ajcl()                                                             //按键及处理
  62. {
  63.   
  64.    
  65.    if(an1==0)   { y=200; while(y--); if(an1==0) count1++;
  66.                          while(!an1) {display(q,b,s,g);}        }                                    //1键按键计数
  67.    
  68.    if(an2==0)   { y=200; while(y--); if(an2==0) count2++;
  69.                          while(!an2) {display(q,b,s,g);}        }                                    //2键按键计数
  70.    
  71.    if(count4==0)
  72.    {
  73.     if(an3==0)   { y=200; while(y--); if(an3==0) count3++;
  74.                           while(!an3) {display(q,b,s,g);}        }                                    //3键按键计数
  75.    }

  76.    if(count3==0 || count3==3)
  77.    {
  78.     count3=0;
  79.     if(an4==0)   { y=200; while(y--); if(an4==0) count4++;
  80.                           while(!an4) {display(q,b,s,g);}}                                          //4键按键计数
  81.    }

  82.    P0=0xff;

  83.     q=cunshi/10; b=cunshi%10; s=cunfen/10; g=cunfen%10;
  84.           ////////////////////////////////////////接下来按an4触发可调时间
  85.       if (count4 && !count3)
  86.            {  
  87.               cunshi = shi; cunfen = fen;
  88.                   miaozt=1;

  89.              switch(count4)
  90.              {
  91.                   case 1 : if((shi==0)&&count2)   shi=24        ;
  92.                             shi = shi+count1;      count1=0;
  93.                                         shi = shi-count2;      count2=0;
  94.                                         if(shi==24)            shi=0;
  95.                                         if (banmiao)          {q=10;   b=10;  }
  96.                                         else                  {q=shi/10; b=shi%10;}   break;

  97.                   case 2 : if((fen==0)&&count2)  fen=60;
  98.                             fen = fen+count1;     count1=0;
  99.                                         fen = fen-count2;     count2=0;
  100.                                     if(fen==60)           fen=0;
  101.                                         if (banmiao)          {s=10;   g=10;  }
  102.                                         else                  {s=fen/10; g=fen%10;}   break;

  103.                   case 3 : miao=0;count4=0;                               break;
  104.               }
  105.             }
  106.             ////////////////////////////////////////接下来按an3触发可定闹钟和报时时间段                                
  107.       if (count3 && (!count4))
  108.           {
  109.                cunshi = nshi; cunfen = nfen;
  110.                    miaozt=1;
  111.                
  112.                switch(count3)
  113.                   {                           
  114.                             case 1 :  s=nfen/10;             g=nfen%10;
  115.                                            if((nshi==0)&&count2)  nshi=24;
  116.                                nshi = nshi+count1;    count1=0;
  117.                                            nshi = nshi-count2;    count2=0;
  118.                                            if(nshi==24)           nshi=0;
  119.                                            if (banmiao)           {q=10;   b=10;  }
  120.                                            else                   {q=nshi/10; b=nshi%10;}    break;
  121.                   
  122.                             case 2 :  q=nshi/10;              b=nshi%10;
  123.                                            if((nfen==0)&&count2)  nfen=60;
  124.                                nfen = nfen+count1;    count1=0;
  125.                                            nfen = nfen-count2;    count2=0;
  126.                                            if(nfen==60)           nfen=0;
  127.                                            if (banmiao)           {s=10;   g=10;  }
  128.                                            else                   {s=nfen/10; g=nfen%10;}     break;
  129.                                     
  130.                                         case 3 :  cunshi=shi; cunfen=fen;                   break;
  131.                                  
  132.                                         case 4 :  cunshi = bxshi; cunfen = bsshi;
  133.                                                    s=bsshi/10;              g=bsshi%10;
  134.                                                if((bxshi==0)&&count2)   bxshi=24;
  135.                                                            bxshi = bxshi+count1;     count1=0;
  136.                                            bxshi = bxshi-count2;     count2=0;
  137.                                            if(bxshi==24)             bxshi=0;
  138.                                            if (banmiao)             {q=10;   b=10;  }
  139.                                            else                     {q=bxshi/10; b=bxshi%10;}    break;         
  140.                                                          
  141.                                         case 5 :  cunshi = bxshi; cunfen = bsshi;
  142.                                                    q=bxshi/10;               b=bxshi%10;
  143.                                                if((bsshi==0)&&count2)   bsshi=24;
  144.                                                            bsshi = bsshi+count1;     count1=0;
  145.                                            bsshi = bsshi-count2;     count2=0;
  146.                                            if(bsshi==24)             bsshi=0;
  147.                                            if (banmiao)             {s=10;   g=10;  }
  148.                                            else                     {s=bsshi/10; g=bsshi%10;}    break;           

  149.                                     case 6 :  count3=0; cunshi=shi; cunfen=fen;                     break;         
  150.                 }
  151.            }
  152.                
  153.                    ///////////////////////////////////////////时分   秒切换
  154.        if(count1 && (!count3) && (!count4) )
  155.           {
  156.                 if(count1==1)
  157.                 {  q=10; b=10; s=miao/10; g=miao%10; miaozt=1; }
  158.                 else count1=0 ;
  159.               }
  160.            
  161. }  

  162. void timer0() interrupt 1
  163. {  
  164.    t0++;
  165.    TH0=(65536-50000)/256;
  166.    TL0=(65536-50000)%256;
  167.    
  168.    if(t0==10)   {banmiao=1;miaozt=1;}
  169.    if(t0==20)   {banmiao=0;miaozt=0;t0=0;miao++;sigh=1;}
  170.    if(miao==11) {sigh2=0;           }
  171.    if(miao==60) {miao=0;fen++;sigh3=1;}                        
  172.    if(fen==60)  {fen=0;shi++;       }
  173.    if(shi==24)  {shi=0;             }
  174.    cunshi=shi;  cunfen=fen;
  175. }
  176. void timer1() interrupt 3
  177. {         
  178.    TH1=x/256;
  179.    TL1=x%256;
  180.    deep=~deep;
  181. }   


  182. void display(int q,int b,int s,int g)
  183. {
  184.         P3=~table[g];
  185.         K4=0; delay();
  186.         K4=1;         
  187.         P3=~table[s];                  
  188.         K3=0; delay();         
  189.         K3=1;         
  190.         P3=t0<9?(P3=~(table[b]+0x80)):(P3=~table[b]);         
  191.         K2=0; delay();         
  192.         K2=1;         
  193.         P3=~table[q];         
  194.         K1=0; delay();         
  195.         K1=1;              
  196. }
  197. void baoshiyf()
  198. {
  199.       if( ((shi+1) >= bxshi) && (shi < bsshi)  )
  200.           {
  201.            if( fen==59 )
  202.            {
  203.                     if(( (miao==56) || (miao==57) || (miao==58) || (miao==59) )&&(t0<8))
  204.                  {x=65000;nz=0;TR1=1;}
  205.                if(( (miao==56) || (miao==57) || (miao==58) || (miao==59) )&&(t0>7))  TR1=0;nz=1;
  206.            }
  207.                    if( sigh &&(fen==0) && (miao==0) && (t0<14) )
  208.                    {
  209.                                   x=65150;
  210.                                 nz=0;TR1=1;
  211.                    }
  212.                    if( sigh&& (fen==0) && (miao==0) && (t0==14) )
  213.                             TR1=0;nz=1;
  214.           }
  215.           if(shi==bsshi)
  216.           {
  217.             if(sigh &&(fen==0) && (miao==0) && (t0<14) )
  218.                 { x=65150; nz=0;TR1=1;}
  219.                 if( sigh&& (fen==0) && (miao==0) && (t0==14) ) TR1=0;nz=1;
  220.            }
  221. }

  222. void kaiji()
  223. {
  224.           if(sigh2)
  225.           {               
  226.                if( (miao!=0) && (t0<5) )
  227.                    {x=64800;nz=0;TR1=1;}
  228.                    if( (miao!=0) && (t0>4) )
  229.                    TR1=0;nz=1;
  230.                    if (t0<13)  hong=1;
  231.                    else       hong=0;
  232.           }
  233. }

  234. void delay()
  235. {
  236.          uint x,y;
  237.          for(x=50;x>0;x--)
  238.          for(y=1;y>0;y--);
  239. }

  240. void nzzx()
  241. {        if(sigh3)
  242.         {
  243.           if((nshi==shi)&&(nfen==fen)&&(miao<31))
  244.           { x=65300; TR1=1; }
  245.          else
  246.              if(nz)
  247.           { TR1=0; }
  248.         }
  249. }
复制代码
0.png
所有资料51hei提供下载:
电子钟原理图及程序(4位共阳数码管).rar (114.33 KB, 下载次数: 105)
回复

使用道具 举报

ID:641479 发表于 2020-3-28 18:14 | 显示全部楼层
能问一下三极管用的什么型号吗  9012和9013   还是9014和9015
回复

使用道具 举报

ID:727275 发表于 2020-5-19 17:44 | 显示全部楼层
感谢楼主分享4位共阳数码管电子钟原理图
回复

使用道具 举报

ID:338810 发表于 2021-6-28 10:39 | 显示全部楼层
4位共阳数码管电子钟原理图,下载看看
回复

使用道具 举报

ID:885016 发表于 2021-6-30 16:17 来自手机 | 显示全部楼层
没找到电路图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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