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

QQ登錄

只需一步,快速開(kāi)始

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

基于單片機(jī)6個(gè)數(shù)碼管顯示的數(shù)字鐘程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我上個(gè)月寫(xiě)的,因?yàn)榈谝淮螌?xiě)所以挑了個(gè)簡(jiǎn)單的數(shù)字鐘練下手。
附件里包含代碼和仿真圖。



單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. sbit no_off = P1^0;                //該按鍵用于暫停計(jì)時(shí),設(shè)置時(shí)間
  3. sbit select = P1^1;                //該按鍵選擇調(diào)秒,分鐘,還是調(diào)小時(shí),上電默認(rèn)選擇秒
  4. sbit add = P1^2;                        //該按鍵往上調(diào)
  5. sbit sub = P1^3;                        //該按鍵往下調(diào)
  6. sbit set = P1^4;                        //該按鍵用于設(shè)置鬧鐘
  7. sbit led = P3^1;                        //設(shè)置了鬧鐘,該指示燈亮,否則不亮
  8. sbit beep = P3^7;                        //用于設(shè)置鬧鐘

  9. unsigned char state = 0;                 //匹配選擇調(diào)秒、調(diào)分或者調(diào)時(shí)的狀態(tài)
  10. unsigned char hour = 0;
  11. unsigned char min = 0;
  12. unsigned char sec = 0;
  13. unsigned char set_hour=0;
  14. unsigned char set_min=0;
  15. unsigned char count = 0;
  16. unsigned char num=0;                        //該變量用來(lái)設(shè)置led閃爍,定時(shí)時(shí)間到,led閃爍1秒鐘
  17. unsigned char disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};                //共陽(yáng)數(shù)碼管字形碼

  18. void delay(unsigned int k);
  19. void scan(void);
  20. void alarm(void);
  21. void display(void);

  22. void main(void)
  23. {
  24.        
  25.         TMOD=0x11;
  26.         TH0=(65535-50000)/256;
  27.         TL0=(65535-50000)%256;
  28.         TH1=(65535-500)/256;
  29.         TL1=(65535-500)%256;
  30.         EA=1;
  31.         ET0=1;
  32.         ET1=1;
  33.         TR0=1;
  34.         TR1=0;
  35.         led=1;
  36.         while(1)
  37.         {
  38.                 scan();
  39.                 display();
  40.         }
  41. }

  42. void delay(unsigned int k)                //延時(shí)
  43. {
  44.         unsigned int i;
  45.         for(i=0;i<k;i++);
  46. }

  47. void scan(void)                                                        //按鍵掃描
  48. {
  49.         if(no_off==0)
  50.         {
  51.                 delay(1200);
  52.                 if(no_off==0) {TR0=~TR0;}
  53.                 while(!no_off);
  54.         }
  55.         if(select==0)
  56.         {
  57.                 delay(1200);
  58.                 if(select==0)
  59.                 {
  60.                         state++;
  61.                         if(state==3) state=0;
  62.                 }
  63.                 while(!select);
  64.         }
  65.   if(add==0)
  66.         {
  67.                 delay(1200);
  68.                 if(add==0)
  69.                 {
  70.                         switch(state)
  71.                         {
  72.                         case 0:{ sec++; if(sec==60) sec=0;break;}
  73.                         case 1:{ min++; if(min==60) min=0;break;}
  74.                         case 2:{ hour++; if(hour==24) hour=0;break;}
  75.                         default :        ;
  76.                         }       
  77.                 }
  78.                 while(!add);
  79.         }
  80.         if(sub==0)
  81.         {
  82.                 delay(1200);
  83.                 if(sub==0)
  84.                 {       
  85.                         switch(state)
  86.                         {
  87.                         case 0:{ sec--; if(sec==255) sec=59;break;}
  88.                         case 1:{ min--; if(min==255) min=59;break;}
  89.                         case 2:{ hour--; if(hour==255) hour=23;break;}
  90.                         default :        ;
  91.                         }
  92.                 }
  93.                 while(!sub);
  94.         }
  95.         if(set==0)
  96.         {
  97.                 delay(1200);                        //消抖
  98.                 if(set==0)
  99.                 {
  100.                         led=~led;
  101.                         set_hour=hour;        //設(shè)置鬧鐘的小時(shí)
  102.                         set_min=min;                //設(shè)置鬧鐘的分鐘
  103.                         while(!set);                //等待按鍵釋放
  104.                 }
  105.         }
  106. }

  107. void display(void)                //數(shù)碼管掃描顯示函數(shù)
  108. {
  109.         unsigned char i;
  110.         for(i=0;i<6;i++)
  111.         {
  112.                 switch(i)
  113.                 {
  114.                         case 0: {P0=disp[hour/10];P2=0x01;break;}
  115.                         case 1: {P0=disp[hour%10];P2=0x02;break;}
  116.                         case 2: {P0=disp[min/10];P2=0x04;break;}
  117.                         case 3: {P0=disp[min%10];P2=0x08;break;}
  118.                         case 4: {P0=disp[sec/10];P2=0x10;break;}
  119.                         case 5: {P0=disp[sec%10];P2=0x20;break;}
  120.                 }
  121.                 delay(200);
  122.                 P0=0xff;                        //消隱
  123.         }
  124. }

  125. void time(void) interrupt 1                //定時(shí)1s
  126. {
  127.         EA=0;TR0=0;
  128.         TH0=(65535-50000)/256;
  129.         TL0=(65535-50000)%256;
  130.         count++;
  131.         if(count==20)
  132.         {
  133.                 count=0;
  134.                 sec++;
  135.                 if(sec==60)
  136.                 {
  137.                         sec=0;
  138.                         min++;
  139.                         if(min==60)
  140.                         {
  141.                                 min=0;
  142.                                 hour++;
  143.                                 if(hour==24)
  144.                                 {
  145.                                         hour=0;
  146.                                 }
  147.                         }
  148.                 }
  149.         }
  150.                 if((min==set_min)&&(hour==set_hour)&&(led==0)&&(TR0=1)) TR1=1;                        //時(shí)間到,鬧鐘響
  151.                 if((min==set_min+1)&&(hour==set_hour)) {TR1=0;led=1;}                                                                //鬧鐘響一分鐘后關(guān)閉,同時(shí)關(guān)閉指示燈
  152.                 EA=1;TR0=1;
  153. }

  154. void alarm() interrupt 3                //鬧鐘響應(yīng)
  155. {
  156.         EA=0;TR1=0;
  157.         TH1=(65535-500)/256;
  158.         TL1=(65535-500)%256;
  159.         beep=~beep;
  160.         num++;
  161.         if(num==250)
  162.         {
  163.                 num=0;
  164.                 led=~led;                                                        //led燈閃爍
  165.         }
  166.         EA=1;TR1=1;
  167. }
復(fù)制代碼

Keil代碼下載:
數(shù)字鐘.zip (92.47 KB, 下載次數(shù): 31)


評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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