久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6086|回復: 2
打印 上一主題 下一主題
收起左側

單片機6位數碼管時鐘

[復制鏈接]
跳轉到指定樓層
樓主

C51單片機六位數碼管時鐘

用數碼管dot分隔時分秒

用三個按鍵設置時間:

SET鍵:小時設定->分鐘設定->結束設定,小時設定狀態時表示小時的兩位數碼管閃爍,分鐘設定時表示分鐘的兩位數碼管閃爍

CHANGE鍵:在小時設定狀態和分鐘設定狀態改變數值

SET S鍵:秒置零


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);        //初始化定時器,函數定義在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) //顯示一位數碼管,SEG = 0-9數字,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);  //顯示小時十位數

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

  73.                 }

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

  75.                 {

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

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

  78.                 }

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

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

  81.         }

  82. }

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

  84. {

  85.     UCHAR CurrKey;  


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

  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計數
  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; //閃爍循環
  138.         }
  139.         if (u_10ms>99)        // 1000 ms = 1 second
  140.         {
  141.                 u_10ms = 0;
  142.                 S_Increase();
  143.         }
  144.         key_Process();        //SET按鍵處理
  145. }
復制代碼




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

使用道具 舉報

沙發
ID:16255 發表于 2018-7-3 08:07 | 只看該作者
單片機直接掃描數碼管可能出現字符閃爍,亮度不均勻的現象。可以用74HC595讓數碼管靜態顯示。
單片機直接中斷計時可能出現走時不準,斷電時間丟失的現象?梢杂肈S1302時鐘芯片。
回復

使用道具 舉報

板凳
ID:320226 發表于 2018-7-3 12:04 | 只看該作者
一個單片機做一個時鐘諸存多得很還加二個74H太浪費了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品在线播放 | 亚洲一区不卡 | 日韩色图在线观看 | 成人欧美一区二区三区在线播放 | 亚洲视频免费一区 | 中文日韩在线视频 | 亚洲一区 | 91在线精品秘密一区二区 | 国产偷录视频叫床高潮对白 | 91中文在线观看 | 欧美日韩精品免费观看 | 国产精品一区在线播放 | 无人区国产成人久久三区 | 精品产国自在拍 | 亚洲性人人天天夜夜摸 | 国产精品美女 | 成人在线黄色 | 中文日本在线 | 久久久久亚洲精品 | 久草福利 | 国产一区二区精品 | 羞羞视频免费观 | 999久久久免费精品国产 | 色约约视频 | 欧美久久久久久久久中文字幕 | 一级欧美| 伊人在线视频 | 欧美一区二区大片 | 中文字幕乱码视频32 | 久久久久国产一级毛片 | 欧美 日韩 国产 在线 | 久久精品99 | 欧美视频在线看 | 国产欧美日韩一区 | 欧美色欧美亚洲另类七区 | 亚洲毛片在线 | 亚洲精品九九 | 成人午夜视频在线观看 | 日本精品一区二区三区视频 | 一二三四在线视频观看社区 | 国产精品.xx视频.xxtv |