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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4546|回復: 1
收起左側

單片機C51電子時鐘按鍵式程序及仿真

[復制鏈接]
ID:439430 發表于 2018-12-4 17:50 | 顯示全部樓層 |閱讀模式
電子時鐘仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機源程序如下:
  1. #include "reg52.H"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. sbit K1 = P3^4;//設置鍵
  5. sbit K2 = P3^5;//加鍵
  6. sbit K3 = P3^6;//減鍵
  7. sbit K4 = P3^7;//日期時間切換鍵
  8. unsigned char  pre_key = 0x0f;//記錄按鍵狀態
  9. unsigned char  key_value;//獲取到按鍵的值
  10. #define  DIG_SEG   P0         //段選
  11. #define  DIG_PLA   P2   //位選
  12. unsigned char code dig_tab[18] =//共陰數碼管碼表
  13. {
  14.                 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0、1、2、3、4、5、6、7、
  15.                 0x7f,0x6f,0x77,0x00,0x39,0x5e,0x79,0x71,//8、9、A、B、C、D、E、F、
  16.                 0x40,0x00//-
  17. };
  18. unsigned char dig_show_fir;//數碼管第一位顯示值
  19. unsigned char dig_show_two;//數碼管第二位顯示值
  20. unsigned char dig_show_thr;//數碼管第三位顯示值
  21. unsigned char dig_show_fou;//數碼管第四位顯示值
  22. unsigned char dig_show_fiv;//數碼管第五位顯示值
  23. unsigned char dig_show_six;//數碼管第六位顯示值
  24. unsigned char dig_show_sev;//數碼管第七位顯示值
  25. unsigned char dig_show_eig;//數碼管第八位顯示值
  26. unsigned char dig_show_tmp = 0;//顯示臨時變量
  27. unsigned char now_window;//當前顯示窗口
  28. unsigned char now_win_sta;//當前顯示狀態
  29. unsigned char win_sta_tmp;//顯示狀態臨時變量
  30. unsigned char tim_flg;//倒計時標志1S一次
  31. unsigned char nian,yue,ri,shi,fen,miao;//定義時分秒年月日
  32. signed char tim_temp[3] = {0};//時分秒設置臨時變量
  33. #define  FLIOPE   200//數碼管閃爍時間常量
  34. #define  FLICLO   400//數碼管閃爍時間常量
  35. unsigned char   part;//數碼管閃爍標志設置的時候
  36. unsigned int    sci_count;//數碼管閃爍時間
  37. unsigned char   curr_menu;

  38. unsigned char alm_tim_cnt;//報警時間計數
  39. unsigned char alm_flag;//報警標志
  40. unsigned char dist_yel_alm;//東西南北黃燈閃爍區分變量
  41. void init_all_hardware(void);//初始化硬件
  42. void delay_ms(unsigned int cnt);//延時函數
  43. void time_init(void);//定時器初始化
  44. void key_scan(void);//按鍵掃描
  45. void key_service(void);//按鍵處理函數
  46. void dis_dri(void);//動態數碼管掃描
  47. void display_service(void);//數碼顯示處理
  48. void timing_service(void);//倒計時函數
  49. void main(void)
  50. {
  51.         init_all_hardware();//初始化硬件,IO和定時器
  52.                 while(1)
  53.                 {
  54.                         key_scan();//按鍵掃描
  55.                         key_service();//按鍵服務處理函數
  56.                         display_service();//數碼顯示處理
  57.                         timing_service();//倒計時函數
  58.                 }
  59. }
  60. /******************************************************
  61. ** 函數名:init_all_hardware
  62. ** 描述  :初始化所有硬件,及其變量參數。
  63. ** 輸入  :無
  64. ** 輸出  :無
  65. ** 調用  :主程序
  66. ******************************************************/
  67. void init_all_hardware(void)
  68. {
  69.                    delay_ms(100);
  70.                 time_init();//定時器初始化
  71.                 key_value = 0;
  72.                 dig_show_fir = 17;//開機不顯示
  73.                 dig_show_two = 17;//開機不顯示
  74.                 dig_show_thr = 17;//開機不顯示
  75.                 dig_show_fou = 17;//開機不顯示
  76.                 dig_show_fiv = 17;//開機不顯示
  77.         dig_show_six = 17;//開機不顯示
  78.         dig_show_sev = 17;//開機不顯示
  79.         dig_show_eig = 17;//開機不顯示
  80.                 shi = 8; //初始化時分秒
  81.                 fen = 12;
  82.                 miao = 35;
  83.                 nian = 16;//初始化年月日
  84.                 yue  = 1;
  85.                 ri   = 4;
  86.                 part = 0;
  87.                 sci_count = 0;
  88.                 curr_menu = 0;
  89.                 now_window = 1;
  90.                 now_win_sta = 1;
  91.         EA=1;
  92.                 delay_ms(1000);//延時1S
  93. }
  94. /*******************************************************************************
  95. * 函 數 名         : delay_ms
  96. * 函數功能                   : 延時函數,延時1ms
  97. * 輸    入         : cnt
  98. * 輸    出         : 無
  99. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  100. *******************************************************************************/
  101. void delay_ms(unsigned int cnt)   //
  102. {
  103.         unsigned int x;
  104.         for( ; cnt>0; cnt--)
  105.         {
  106.                 for(x=110; x>0; x--);//軟件延時為1MS
  107.         }
  108. }
  109. /******************************************************
  110. ** 函數名:time_init
  111. ** 描述  :定時器初始化
  112. ** 輸入  :無
  113. ** 輸出  :無
  114. ******************************************************/
  115. void time_init(void)
  116. {
  117.           TMOD |= 0x01;//time0 工作方式為1
  118.           TH0 = 0xf8;//裝載初值
  119.           TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
  120.       TR0 = 1;//開啟定時器
  121.           ET0 = 1;//打開中斷
  122.           ES = 1;
  123. }
  124. /******************************************************
  125. ** 函數名:key_scan
  126. ** 描述  :按鍵掃描
  127. ** 輸入  :無
  128. ** 輸出  :無
  129. ******************************************************/
  130. void key_scan(void)
  131. {
  132.           P3 |=0xf0;//P3高四位置高
  133.           if (pre_key==(P3&0xf0))return;//按鍵狀態未改變時繼續
  134.           pre_key = P3&0xf0;//保存當前最新按鍵狀態
  135.           if (!K1)//特殊模式按鍵
  136.           {
  137.                   delay_ms(10);//延時10ms
  138.                   if(!K1)//還判斷為按下
  139.                   {
  140.                             key_value = 1;//觸發按鍵值
  141.                   }
  142.           }
  143.           if (!K2)//特殊模式按鍵
  144.           {
  145.                   delay_ms(10);//延時10ms
  146.                   if(!K2)//還判斷為按下
  147.                   {
  148.                             key_value = 2;//觸發按鍵值
  149.                   }
  150.           }
  151.           if (!K3)//特殊模式按鍵
  152.           {
  153.                   delay_ms(10);//延時10ms
  154.                   if(!K3)//還判斷為按下
  155.                   {
  156.                             key_value = 3;//觸發按鍵值
  157.                   }
  158.           }
  159.           if (!K4)//特殊模式按鍵
  160.           {
  161.                   delay_ms(10);//延時10ms
  162.                   if(!K4)//還判斷為按下
  163.                   {
  164.                             key_value = 4;//觸發按鍵值
  165.                   }
  166.           }

  167. }
  168. /******************************************************
  169. ** 函數名:key_service
  170. ** 描述  :按鍵服務函數
  171. ** 輸入  :無
  172. ** 輸出  :無
  173. ** 調用  :主程序
  174. ******************************************************/
  175. void key_service(void)
  176. {
  177.                 switch(now_window)//選擇不同窗口
  178.                 {
  179.                         case 1:
  180.                         {
  181.                                 switch(key_value)
  182.                                 {
  183.                                         case 1://切換到設置日期
  184.                                         {
  185.                                                 now_window = 3;
  186.                                                 now_win_sta = 31;
  187.                                                 tim_temp[0] = shi;
  188.                                                 tim_temp[1] = fen;
  189.                                                 tim_temp[2] = miao;
  190.                                                 part = 1;
  191.                                                 curr_menu = 1;
  192.                                         }
  193.                                         key_value = 0;
  194.                                         break;
  195.                                         case 4://切換到顯示日期
  196.                                         {
  197.                                                 now_window = 2;
  198.                                                 now_win_sta = 2;
  199.                                         }
  200.                                         key_value = 0;
  201.                                         break;
  202.                                 }
  203.                         }
  204.                         break;
  205.                         case 2:
  206.                         {
  207.                                 switch(key_value)
  208.                                 {
  209.                                         case 4://切換到顯示時間
  210.                                         {
  211.                                                 now_window = 1;
  212.                                                 now_win_sta = 1;
  213.                                         }
  214.                                         key_value = 0;
  215.                                         break;
  216.                                 }
  217.                         }
  218.                         break;
  219.                         case 3:
  220.                         {
  221.                                 switch(key_value)
  222.                                 {
  223.                                         case 1://設置日期
  224.                                         {
  225.                                                 if (curr_menu<4)
  226.                                                         curr_menu++;
  227.                                                 if (curr_menu == 2)
  228.                                                 {
  229.                                                         part = 2;
  230.                                                         now_win_sta = 31;
  231.                                                 }
  232.                                                 else if(curr_menu == 3)
  233.                                                 {

  234.                                                         part = 3;
  235.                                                         now_win_sta = 31;
  236.                                                 }
  237.                                                 else if (curr_menu == 4)
  238.                                                 {
  239.                                                         curr_menu = 0;
  240.                                                         now_window = 1;
  241.                                                         now_win_sta = 1;
  242.                                                 }
  243.                                         }
  244.                                         key_value = 0;
  245.                                         break;
  246.                                         case 2://日期加
  247.                                         {
  248.                                                 if(curr_menu == 1)
  249.                                                 {
  250.                                                         if (++tim_temp[2]>59)
  251.                                                         {
  252.                                                                 tim_temp[2] = 0;
  253.                                                         }
  254.                                                         miao = tim_temp[2];
  255.                                                 }
  256.                                                 else if (curr_menu == 2)
  257.                                                 {
  258.                                                         if (++tim_temp[1]>59)
  259.                                                         {
  260.                                                                 tim_temp[1] = 0;
  261.                                                         }
  262.                                                         fen = tim_temp[1];
  263.                                                 }
  264.                                                 else if (curr_menu == 3)
  265.                                                 {
  266.                                                         if (++tim_temp[0]>23)
  267.                                                         {
  268.                                                                 tim_temp[0] = 0;
  269.                                                         }
  270.                                                         shi = tim_temp[0];
  271.                                                 }
  272.                                         }
  273.                                         key_value = 0;
  274.                                         break;
  275.                                         case 3://日期減
  276.                                         {
  277.                                                 if(curr_menu == 1)
  278.                                                 {
  279.                                                         if (--tim_temp[2]<0)
  280.                                                         {
  281.                                                                 tim_temp[2] = 59;
  282.                                                         }
  283.                                                         miao = tim_temp[2];
  284.                                                 }
  285.                                                 else if (curr_menu == 2)
  286.                                                 {
  287.                                                         if (--tim_temp[1]<0)
  288.                                                         {
  289.                                                                 tim_temp[1] = 59;
  290.                                                         }
  291.                                                         fen = tim_temp[1];
  292.                                                 }
  293.                                                 else if (curr_menu == 3)
  294.                                                 {
  295.                                                         if (--tim_temp[0]<0)
  296.                                                         {
  297.                                                                 tim_temp[0] = 23;
  298.                                                         }
  299.                                                         shi = tim_temp[0];
  300.                                                 }
  301.                                         }
  302.                                         key_value = 0;
  303.                                         break;
  304.                                 }
  305.                         }
  306.                         break;
  307.                 }
  308. }
  309. /*******************************************************************************
  310. * 函 數 名         : dis_dri
  311. * 函數功能                   : 數碼管掃描函數
  312. * 輸    入         : 無
  313. * 輸    出         : 無
  314. *******************************************************************************/
  315. void dis_dri(void)
  316. {
  317.                            static unsigned char dis_step = 1;
  318.                            DIG_SEG = 0x00;
  319.                            switch(dis_step)
  320.                            {
  321.                                   case 1:  //顯示第1位
  322.                                   {
  323.                                            dig_show_tmp=dig_tab[dig_show_fir];

  324.                                                    DIG_SEG = dig_show_tmp;
  325.                                                    DIG_PLA = 0xfe;
  326.                                   }
  327.                                   break;
  328.                                   case 2:  //顯示第2位
  329.                                   {
  330.                                            dig_show_tmp=dig_tab[dig_show_two];

  331.                                                    DIG_SEG = dig_show_tmp;
  332.                                                    DIG_PLA = 0xfd;
  333.                                   }
  334.                                   break;
  335.                   case 3:  //顯示第3位
  336.                                   {
  337.                                            dig_show_tmp=dig_tab[dig_show_thr];

  338.                                                    DIG_SEG = dig_show_tmp;
  339.                                                    DIG_PLA = 0xfb;
  340.                                   }
  341.                                   break;
  342.                   case 4:  //顯示第4位
  343.                                   {
  344.                                            dig_show_tmp=dig_tab[dig_show_fou];

  345.                                                    DIG_SEG = dig_show_tmp;
  346.                                                    DIG_PLA = 0xf7;
  347.                                   }
  348.                                   break;
  349.                   case 5:  //顯示第5位
  350.                                   {
  351.                                            dig_show_tmp=dig_tab[dig_show_fiv];

  352.                                                    DIG_SEG = dig_show_tmp;
  353.                                                    DIG_PLA = 0xef;
  354.                                   }
  355.                                   break;
  356.                   case 6:  //顯示第6位
  357.                                   {
  358.                                            dig_show_tmp=dig_tab[dig_show_six];

  359.                                                    DIG_SEG = dig_show_tmp;
  360.                                                    DIG_PLA = 0xdf;
  361.                                   }
  362.                                   break;
  363.                   case 7:  //顯示第7位
  364.                                   {
  365.                                            dig_show_tmp=dig_tab[dig_show_sev];

  366.                                                    DIG_SEG = dig_show_tmp;
  367.                                                    DIG_PLA = 0xbf;
  368.                                   }
  369.                                   break;
  370.                   case 8:  //顯示第8位
  371.                                   {
  372.                                            dig_show_tmp=dig_tab[dig_show_eig];

  373.                                                    DIG_SEG = dig_show_tmp;
  374.                                                    DIG_PLA = 0x7f;
  375.                                   }
  376.                                   break;

  377.                            }
  378.                            dis_step++;
  379.                            if(dis_step>8)        //掃描完4個數碼管后,重新從第一個開始掃描
  380.                            {
  381.                                   dis_step=1;
  382.                            }
  383. }
  384. /*******************************************************************************
  385. * 函 數 名       : display_service()
  386. * 函數功能                 : 顯示服務函數
  387. * 輸    入       : 無
  388. * 輸    出       : 無
  389. *******************************************************************************/
  390. void display_service(void)
  391. {
  392.                         switch(now_window)
  393.                         {
  394.                                  case 1://顯示時間
  395.                                  {
  396.                                         if (now_win_sta == 1)//刷新顯示
  397.                                         {
  398.                                                 now_win_sta = 0;
  399.                                                 dig_show_fir = miao/10;//顯示秒
  400.                                                 dig_show_two = miao%10;//顯示秒
  401.                                                 dig_show_fou = 16;//顯示-
  402.                                                 dig_show_six = fen/10;//顯示分
  403.                                                 dig_show_thr = fen%10;//顯示分
  404.                                                 dig_show_fiv = 16;//顯示-
  405.                                                 dig_show_sev = shi/10;//顯示時
  406.                                                 dig_show_eig = shi%10;//顯示時
  407.                                         }
  408.                                  }
  409.                                  break;
  410.                                  case 2://顯示日期
  411.                                  {
  412.                                         if (now_win_sta == 2)//刷新顯示
  413.                                         {
  414.                                                 now_win_sta = 0;
  415.                                                 dig_show_fir = ri/10;//顯示秒
  416.                                                 dig_show_two = ri%10;//顯示秒
  417.                                                 dig_show_fou = 16;//顯示-
  418.                                                 dig_show_six = yue/10;//顯示分
  419.                                                 dig_show_thr = yue%10;//顯示分
  420.                                                 dig_show_fiv = 16;//顯示-
  421.                                                 dig_show_sev = nian/10;//顯示時
  422.                                                 dig_show_eig = nian%10;//顯示時
  423.                                         }
  424.                                  }
  425.                                  break;
  426.                                  case 3:
  427.                                  {

  428.                                                 if(now_win_sta ==31)
  429.                                                 {
  430.                                                         now_win_sta = 0;
  431.                                                         dig_show_fir = tim_temp[2]/10;//顯示秒
  432.                                                         dig_show_two = tim_temp[2]%10;//顯示秒
  433.                                                         dig_show_fou = 16;//顯示-
  434.                                                         dig_show_six = tim_temp[1]/10;//顯示分
  435.                                                         dig_show_thr = tim_temp[1]%10;//顯示分
  436.                                                         dig_show_fiv = 16;//顯示-
  437.                                                         dig_show_sev = tim_temp[0]/10;//顯示時
  438.                                                         dig_show_eig = tim_temp[0]%10;//顯示時
  439.                                                 }
  440.                                                 switch (part)//設置時候閃爍
  441.                                                 {
  442.                                                         case 1://秒閃爍
  443.                                                         {
  444.                                                                 if (sci_count == FLIOPE)
  445.                                                                 {
  446.                                                                         dig_show_fir = tim_temp[2] / 10;
  447.                                                                         dig_show_two = tim_temp[2] % 10;
  448.                                                                 }
  449.                                                                 else if (sci_count > FLICLO)
  450.                                                                 {
  451.                                                                         sci_count = 0;
  452.                                                                         dig_show_fir = 17;
  453.                                                                         dig_show_two = 17;
  454.                                                                 }
  455.                                                         }
  456.                                                         break;
  457.                                                         case 2://分閃爍
  458.                                                         {
  459.                                                                 if (sci_count == FLIOPE)
  460.                                                                 {
  461.                                                                         dig_show_six = tim_temp[1] / 10;
  462.                                                                         dig_show_thr = tim_temp[1] % 10;
  463.                                                                 }
  464.                                                                 else if (sci_count > FLICLO)
  465.                                                                 {
  466.                                                                         sci_count = 0;
  467.                                                                         dig_show_six = 17;
  468.                                                                         dig_show_thr = 17;
  469.                                                                 }
  470.                                                         }
  471.                                                         break;
  472.                                                         case 3://時閃爍
  473.                                                         {
  474.                                                                 if (sci_count == FLIOPE)
  475.                                                                 {
  476.                                                                         dig_show_sev = tim_temp[0] / 10;
  477.                                                                         dig_show_eig = tim_temp[0] % 10;
  478.                                                                 }
  479.                                                                 else if (sci_count > FLICLO)
  480.                                                                 {
  481.                                                                         sci_count = 0;
  482.                                                                         dig_show_sev = 17;
  483.                                                                         dig_show_eig = 17;
  484.                                                                 }
  485.                                                         }
  486.                                                         break;
  487.                                                 }
  488.                                  }
  489.                                  break;
  490.                         }
  491. }
  492. /******************************************************
  493. ** 函數名:timing_service
  494. ** 描述  :定時1秒函數
  495. ** 輸入  : 無
  496. ** 輸出  :無
  497. ** 調用  :中斷調用
  498. ******************************************************/
  499. void timing_service(void)//倒計時函數
  500. {
  501.                          if (tim_flg == 1)
  502.                          {
  503.                 tim_flg = 0;
  504.                                 now_win_sta = 1;
  505.                                 miao++;
  506.                                 if(miao==60)//六十秒到了嗎
  507.                     {
  508.                                          fen++;//分加加
  509.                             miao=0;
  510.                             if(fen==60)//六十分到了嗎
  511.                         {
  512.                                            shi++;
  513.                            fen=0;
  514.                            if(shi==24)//24小時到了嗎
  515.                            {
  516.                                                   shi=0;    //時清零
  517.                          fen=0;
  518.                          miao=0;
  519.                                                  ri++;
  520.                                                  if (ri==30)
  521.                                                  {
  522.                                                          ri = 1;
  523.                                                  }
  524.                            }
  525.                         }
  526.                     }
  527.             }
  528. }
  529. /******************************************************
  530. ** 函數名:time0_interrupt
  531. ** 描述  :按鍵掃描函數
  532. ** 輸入  :無
  533. ** 輸出  :無
  534. ******************************************************/
  535. void time0_interrupt() interrupt 1
  536. {
  537.        static unsigned int base_2ms_buff;
  538.            static unsigned int samping_cnt = 0;//1//1S鐘計時
  539.            TF0 = 0;//清除標志
  540.            TR0 = 0;
  541.            dis_dri();//動態掃描數碼管
  542.            if (++samping_cnt  > 500)
  543.            {
  544.                         samping_cnt = 0;
  545.                         if (now_window!=3)
  546.                         {
  547.                                 tim_flg = 1;
  548.                         }
  549.            }
  550.            if (++base_2ms_buff==50)
  551.            {
  552.                         base_2ms_buff = 0;
  553.                         if (alm_tim_cnt)
  554.             alm_tim_cnt--;
  555.            }
  556.        if (++sci_count > 2000)
  557.        {
  558.                         sci_count = 0;
  559.        }
  560.            TR0 = 1;
  561.            TH0 = 0xf8;
  562.            TL0 = 0x2f;//裝載初值2ms(65535-63535)
  563. }
復制代碼

所有資料51hei提供下載:
電子鐘程序程序及電路.zip (63.26 KB, 下載次數: 54)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:928002 發表于 2021-6-18 15:54 | 顯示全部樓層
謝了,下載就能用。就是程序說明有點少。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美第一页 | 免费视频中文字幕 | 色爱区综合 | 久久精品视频9 | 一区二区av| 一级片在线观看视频 | 韩国欧洲一级毛片 | 日韩一区二区在线视频 | 红桃视频一区二区三区免费 | 亚洲综合色婷婷 | 精品一区二区三区免费视频 | 成人在线视频网站 | 午夜精品福利视频 | 中文一区| 欧美福利视频一区 | 在线中文一区 | 亚洲视频精品在线 | 精品一区二区三区在线观看国产 | 伊人99| 日韩在线xx | 成人性视频免费网站 | 欧美激情精品久久久久 | 一呦二呦三呦国产精品 | 一级做a| 91在线观看免费视频 | 亚洲性视频 | 精品久久香蕉国产线看观看亚洲 | 免费在线观看一区二区三区 | 国产一级视频免费播放 | 国产伦一区二区三区视频 | 亚洲精品一二区 | 91一区二区 | 国产成人精品午夜视频免费 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 国产精品久久久久久久久久三级 | 欧美精品国产一区二区 | 日韩成人精品在线 | 国产成人精品一区二 | 成人国产网站 | 国产精品a级| 亚洲精选一区二区 |