找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4848|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

用數(shù)碼管顯示電子鐘,程序簡(jiǎn)單,適合初學(xué)者(內(nèi)含代碼及注解及仿真)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  1. #include <reg51.h>

  2. unsigned char code smg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,

  3.                           0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};        //字形代碼,分別為0-9,a-f,-,全滅



  4. unsigned char num[8]={0,0,16,0,0,16,0,0};       //顯示緩沖區(qū)

  5. unsigned char w;// 移位控制

  6. unsigned char miao,fen,shi;    //時(shí)間

  7. unsigned char t,i;// 記錄定時(shí)器中斷次數(shù)

  8. bit qd=1;     //時(shí)鐘啟?刂莆

  9. sbit wei =P3^0;     //定義P3.0端口為移位按鍵

  10. sbit tiao=P3^1;     //定義P.1端口為調(diào)整按鍵

  11. void delay(unsigned int T)   //延時(shí)子函數(shù)

  12. {

  13.     unsigned char b,c;

  14.     for(c=T;c>0;c--)

  15.         for(b=90;b>0;b--);

  16. }

  17. /*=======================================================

  18.                           ------- 主程序 ------

  19. =======================================================*/

  20. void main()

  21. {                   // 定時(shí)器1,外部中斷0的初始化

  22.         TMOD=0x10;      //設(shè)置定時(shí)器T1為方式1模式

  23.         ET1=1;          //允許定時(shí)器T1中斷

  24.         TL1=0xE0;      //設(shè)定定時(shí)器T1初值

  25.         TH1=0xB1;      //設(shè)定定時(shí)器T1初值

  26.         EX0=1;         //使能外部中斷

  27.         IT0=1;         //指定外部中斷0下降沿觸發(fā)

  28.         EX1=1;         //開外部中斷1

  29.         IT1=1;         //外部中斷1下降沿觸發(fā)方式

  30.         PT1=1;

  31.         EA=1;                //總中斷允許                          

  32.         TR1=1;      //啟動(dòng)定時(shí)器T1

  33.         

  34.         miao=0,fen=0,shi=0;

  35.         num[0]=shi/10;//時(shí)高位

  36.         num[1]=shi%10;//時(shí)低位

  37.         num[3]=fen/10;//分高位

  38.         num[4]=fen%10;//分地位

  39.         num[6]=miao/10;//秒高位

  40.         num[7]=miao%10;//秒地位

  41.         t=0;    //定時(shí)器中斷次數(shù)初始化

  42.         w=0;    //閃爍控制位,初始無閃爍位

  43.         qd=1;   //時(shí)鐘啟停標(biāo)志位

  44.         while(1)

  45.         {        if(t==50)     // 時(shí)間的控制

  46.                 {        t=0;      

  47.                    miao++;    //秒自增

  48.                    if(miao==60)  //如果秒等于60

  49.                    {miao=0;fen++;   //0賦值給秒,分自增

  50.                             if(fen==60)   //如果分等于60

  51.                               {fen=0;shi++;    //把0賦值給分,時(shí)自增

  52.                                      if(shi==24) shi=0;}   //如果時(shí)等于24,把0賦值給時(shí)

  53.                    }       // 下面是顯示緩沖區(qū)內(nèi)容的計(jì)算

  54.                    num[0]=shi/10;num[1]=shi%10;

  55.                    num[3]=fen/10;num[4]=fen%10;

  56.                    num[6]=miao/10;num[7]=miao%10;

  57.                 }

  58.         }

  59. }

  60. /*=======================================================

  61.                 ------- 定時(shí)器1中斷程序 ------

  62. =======================================================*/

  63. void timer1() interrupt 3

  64. {        static unsigned char ss,g;

  65.         TL1=0xE0;

  66.         TH1=0xB1;         //定時(shí)20Ms          循環(huán)

  67.   if(qd) t++;//-----時(shí)鐘計(jì)時(shí)         

  68.         if(w==1||w==2||w==3||w==4||w==5||w==6)

  69.         {        ss++;//調(diào)位閃爍

  70.           if(ss<30)//顯示滅

  71.                           {

  72.                                   switch(w)        //選擇滅的顯示位

  73.                                   {

  74.                                   case 1:g=0;break;//時(shí)高位

  75.                                         case 2:g=1;break;//時(shí)地位

  76.                                         case 3:g=3;break;//分高位

  77.                                         case 4:g=4;break;//分低位

  78.                                         case 5:g=6;break;//秒高位

  79.                                         case 6:g=7;break;//秒低位

  80.                                   }

  81.                                 for(i=0;i<8;i++)//輸出顯示

  82.                                 {

  83.                                         P2=i;

  84.                                         if(i==g)P0=0X00;//需要調(diào)整的位滅

  85.                                         else  P0=smg[num[i]];//正常顯示

  86.                                         delay(4);

  87.                                 }

  88.                    }

  89.                           else if(ss>=30)//+++++++++++++亮

  90.                           {

  91.                                  for(i=0;i<8;i++)

  92.                                   {

  93.                                         P2=i;

  94.                                         P0=smg[num[i]];//正常顯示

  95.                                         delay(3);

  96.                                   }

  97.                                   if(ss==60) ss=0;

  98.                     }

  99.         }

  100.         else//-------不調(diào)整時(shí)正常顯示

  101.         {

  102.                 for(i=0;i<8;i++)

  103.                 {

  104.                         P2=i; //把i賦值給P2

  105.                     P0=smg[num[i]];//正常顯示

  106.                         delay(3);

  107.                 }         

  108.         }

  109. }


  110. /*=======================================================

  111.                         ------- 外部中斷1中斷程序 ------

  112. 說明:調(diào)整時(shí)分秒的每一位

  113. =======================================================*/

  114. void  shezhi() interrupt  2

  115. { if(wei==0) //調(diào)整位的按鍵按下了

  116.   {w++;

  117.           if(w==7)  //如果w等于7

  118.                   w=0;   //把0賦值給w

  119.           if(w==0) qd=1;  //如果w等于0,把1賦值給qd

  120.            else     qd=0;  //否則把0賦值給qd

  121.   }

  122.   else if(tiao==0&& w!=0)//調(diào)整數(shù)據(jù)的按鍵按下了

  123.   {

  124.         if(w==1) //如果w等于1,調(diào)整時(shí)的十位

  125.         {

  126.                 num[0]++;   //時(shí)高位增加

  127.                 if(num[0]==3) num[0]=0;

  128.         }

  129.         else if (w==2)//如果w等于2,調(diào)整時(shí)的個(gè)位

  130.         {

  131.                 num[1]++;   //時(shí)低位增加

  132.                 if( (num[0]==2 && num[1]==4 ) ||

  133.                     (num[0]==1 && num[1]==10) ||

  134.                         (num[0]==0 && num[1]==10)   )

  135.                 num[1]=0;         

  136.         }

  137.         else if (w==3)//如果w等于3,調(diào)整分的十位

  138.         {

  139.             num[3]++;   //分高位增加

  140.                 if(num[3]==6) num[3]=0;     //分高位等于6,把0賦值給分高位

  141.         }

  142.         else if (w==4)//如果w等于4,調(diào)整分的個(gè)位

  143.         {

  144.             num[4]++;    //分低位增加

  145.                 if(num[4]==10) num[4]=0;   //分低位等于10,把0賦值給分低位

  146.         }

  147.         else if (w==5)//如果w等于5,調(diào)整秒的十位

  148.         {

  149.             num[6]++;    //秒高位增加

  150.                 if(num[6]==6) num[6]=0;   //秒高位等于6,把0賦值給秒高位

  151.         }

  152.         else if (w==6)//如果w等于6,調(diào)整秒的個(gè)位

  153.         {

  154.             num[7]++;    //秒低位增加

  155.                 if(num[7]==10) num[7]=0;  //秒低位等于10,把0賦值給秒低位

  156.         }



  157.         miao=num[7]+num[6]*10;

  158.         fen =num[4]+num[3]*10;

  159.         shi =num[1]+num[0]*10;

  160.   }

  161. }
復(fù)制代碼

Desktop.zip (70.58 KB, 下載次數(shù): 48)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:489282 發(fā)表于 2021-11-11 15:53 | 只看該作者
原理圖在哪
回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2021-11-11 16:25 | 只看該作者

在下載的壓縮包里面有仿真原理圖

51hei.gif (304.71 KB, 下載次數(shù): 40)

51hei.gif
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表