欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6314|回復: 2
收起左側(cè)

單片機6位數(shù)碼管時鐘

[復制鏈接]
ID:363597 發(fā)表于 2018-7-2 23:41 | 顯示全部樓層 |閱讀模式

C51單片機六位數(shù)碼管時鐘

用數(shù)碼管dot分隔時分秒

用三個按鍵設置時間:

SET鍵:小時設定->分鐘設定->結束設定,小時設定狀態(tài)時表示小時的兩位數(shù)碼管閃爍,分鐘設定時表示分鐘的兩位數(shù)碼管閃爍

CHANGE鍵:在小時設定狀態(tài)和分鐘設定狀態(tài)改變數(shù)值

SET S鍵:秒置零

20160922120743121 .jpg

C語言代碼:

//main.c

  1. #include <REGX52.H>

  2. typedef unsigned int UINT  ;

  3. typedef unsigned char UCHAR        ;

  4. #define KEY P2

  5. #define KEYMASK   0x07  

  6. sbit LE1 = P2^6;  //定義位控口                        

  7. sbit LE2 = P2^7;  //定義段控口

  8. UCHAR KeyPressDown = 0x00;  

  9. UCHAR KeyRelease = 0x00;  

  10. UCHAR LastKey = 0x00;  

  11. UCHAR MODE ;

  12. extern UCHAR HH;

  13. extern UCHAR MM;

  14. extern UCHAR SS;

  15. extern bit T_CYCLE  ;

  16. extern void T0_Init(void);        //初始化定時器,函數(shù)定義在Timer.c

  17. UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  18. void delay(UINT t) //延時t時鐘周期

  19. {

  20.         while (t--)        ;

  21. }

  22. void H_Increase(void)        //小時增1

  23. {

  24.         if(HH<23) HH++;

  25.         else

  26.         {

  27.                 HH = 0;

  28.         }

  29. }

  30. void M_Increase(void)  //分鐘增1

  31. {

  32.         if(MM<59) MM++;

  33.         else

  34.         {

  35.                 MM = 0;

  36.                 H_Increase();

  37.         }

  38. }

  39. void S_Increase(void)  //秒增1

  40. {

  41.         if(SS<59) SS++;

  42.         else

  43.         {

  44.                 SS = 0;

  45.                 M_Increase();

  46.         }

  47. }

  48. void display(UCHAR SEG,UCHAR Digi) //顯示一位數(shù)碼管,SEG = 0-9數(shù)字,Digi = 第0-6位

  49. {

  50.         LE2 = 1;

  51.         P0 = (0x01<<Digi) ;

  52.         LE2 = 0;

  53.         P0 = 0x00;

  54.         LE1 = 1;

  55.         P0 = NUM[SEG];

  56.         if (Digi==1||Digi==3) P0 &= 0x7f        ;  //顯示分隔符

  57.         delay(50);

  58.         P0 = 0xff;

  59.         LE1 = 0;

  60. }

  61. void main(void)

  62. {

  63.     P0 = 0xff;

  64.     LE1 = 0;

  65.     LE2 = 0;

  66.         T0_Init();

  67.     while(1)

  68.         {

  69.                 if(MODE != 1 || T_CYCLE)

  70.                 {

  71.                         display(HH/10,0);  //顯示小時十位數(shù)

  72.                         display(HH%10,1);  //顯示小時個位數(shù)

  73.                 }

  74.                 if(MODE != 2  || T_CYCLE)

  75.                 {

  76.                         display(MM/10,2);  //顯示分鐘十位數(shù)

  77.                         display(MM%10,3);  //顯示分鐘個位數(shù)

  78.                 }

  79.                 display(SS/10,4);  //顯示秒十位數(shù)

  80.                 display(SS%10,5);  //顯示秒個位數(shù)

  81.         }

  82. }

  83. void key_Process(void)                 //按鍵處理程序

  84. {

  85.     UCHAR CurrKey;  


  86.     KEY |= KEYMASK;  //將按鍵對應的IO設置為輸入狀態(tài)  

  87.     CurrKey = (~KEY) & KEYMASK;  

  88.   

  89.     KeyPressDown = (~LastKey) & CurrKey;  

  90.     KeyRelease = LastKey & (~CurrKey);  

  91.   

  92.     LastKey = CurrKey;

  93.         switch(KeyRelease)

  94.         {

  95.                 case 1:

  96.                          if(MODE == 2) MODE = 0;

  97.                          else MODE ++;

  98.                          break;

  99.                 case 2:

  100.                          if(MODE == 1) H_Increase() ;

  101.                          if(MODE == 2) M_Increase() ;

  102.                          break;

  103.                 case 4:

  104.                          SS = 0;

  105.                          break;

  106.                 default: break;

  107.         }

  108. }
  109. //Timer#include <reg52.h>
  110. typedef unsigned int UINT  ;
  111. typedef unsigned char UCHAR        ;
  112. UCHAR HH = 14;         //小時初始值
  113. UCHAR MM = 2;         //分鐘初始值
  114. UCHAR SS = 55;         //秒初始值
  115. UINT u_10ms  = 0; //10ms計數(shù)
  116. bit T_CYCLE = 0;
  117. extern void key_Process(void);
  118. extern void S_Increase(void);

  119. void T0_Init(void)
  120. {
  121.         TMOD &= 0xf0;
  122.         TMOD |= 0x01;
  123.         //定時器賦初始值,定時時間為10ms。
  124.         TH0 = 0xd8;
  125.         TL0 = 0xf0;
  126.         TR0 = 1;
  127.         IE = 0x82;

  128. }

  129. void T0_INTSrv(void) interrupt 1
  130. {
  131.         //定時器重新開始計時。
  132.         TH0 = 0xd8;
  133.         TL0 = 0xf0;
  134.         u_10ms ++;
  135.         if (u_10ms%20==0)        // 200 ms
  136.         {
  137.                 T_CYCLE = !        T_CYCLE; //閃爍循環(huán)
  138.         }
  139.         if (u_10ms>99)        // 1000 ms = 1 second
  140.         {
  141.                 u_10ms = 0;
  142.                 S_Increase();
  143.         }
  144.         key_Process();        //SET按鍵處理
  145. }
復制代碼




回復

使用道具 舉報

ID:16255 發(fā)表于 2018-7-3 08:07 | 顯示全部樓層
單片機直接掃描數(shù)碼管可能出現(xiàn)字符閃爍,亮度不均勻的現(xiàn)象。可以用74HC595讓數(shù)碼管靜態(tài)顯示。
單片機直接中斷計時可能出現(xiàn)走時不準,斷電時間丟失的現(xiàn)象。可以用DS1302時鐘芯片。
回復

使用道具 舉報

ID:320226 發(fā)表于 2018-7-3 12:04 | 顯示全部樓層
一個單片機做一個時鐘諸存多得很還加二個74H太浪費了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表