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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7757|回復: 0
收起左側

數碼管+單片機定時器,做了個時鐘,在設置時間的時候,怎樣讓分鐘閃爍?

[復制鏈接]
ID:161933 發表于 2017-5-27 20:59 | 顯示全部樓層 |閱讀模式
用數碼管+定時器,做了個時鐘,在設置時間的時候,怎樣讓 分鐘 小時 實現閃爍的效果?,現在也能設置時間,就是沒有閃爍 的效果,不知道 調整到哪一位了。請教,大家有什么好辦法。感謝。


IMG_20170527_155035.jpg





  1. /*******************************************************************************
  2. * 實 驗 名                 : 動態數碼管顯示時鐘
  3. * 使用的IO             : 數碼管使用:段數據:P0,位選:P2.2,P2.3,P2.4
  4. * 實驗效果       : 數碼管顯示76543210。
  5. * 注    意                 :
  6. *******************************************************************************/
  7. #include<regA51.h>
  8. #define GPIO_DIG P0                        //數碼段數據
  9. sbit LSA=P2^2;                                        //位選控制口
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. sbit K1=P3^0;                                                //選擇調時位
  13. sbit K2=P3^1;                                                //+1
  14. sbit K3=P3^2;                                                //K3暫停,進入調時狀態

  15. unsigned int Time;                        //用來計時間的值
  16. unsigned char SetPlace;                //設置修改位
  17. unsigned char hour=10,minute=59,second=55;

  18. unsigned char code DIG_CODE[17]={
  19. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  20. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  21. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼

  22. void Delay1ms(unsigned int c)   //誤差 0us
  23. {
  24.     unsigned char a,b;
  25.         for (; c>0; c--)
  26.         {
  27.                 for(b=199;b>0;b--)
  28.                 {
  29.                         for(a=1;a>0;a--);
  30.                 }
  31.         }
  32. }

  33. /*******************************************************************************
  34. * 函 數 名         : TimerConfiguration()
  35. * 函數功能                   : 配置定時器值
  36. * 輸    入         : 無
  37. * 輸    出         : 無
  38. *******************************************************************************/                  

  39. void TimerConfiguration()
  40. {
  41.     TMOD = 0x02;         //選擇工作方式2,自動賦初值
  42.     TH0 = 0x06;                 //設置初始值 250 us
  43.     TL0 = 0x06;
  44.     EA = 1;                         //打開總中斷
  45.     ET0 = 1;                 //打開定時器0中斷
  46.     TR0 = 1;                 //啟動定時器0
  47. }
  48. /*******************************************************************************
  49. * 函 數 名         : Timer0()
  50. * 函數功能                   : 定時器0中斷函數
  51. * 輸    入         : 無
  52. * 輸    出         : 無
  53. *******************************************************************************/                  

  54. void Timer0() interrupt 1
  55. {
  56.                 Time++;
  57. }
  58. /*******************************************************************************
  59. * 函 數 名         : Int0Configuration()
  60. * 函數功能                   : 配置外部中斷0
  61. * 輸    入         : 無
  62. * 輸    出         : 無
  63. *******************************************************************************/                  

  64. void Int0Configuration()
  65. {
  66.         //設置INT0
  67.         IT0=1;//跳變沿出發方式(下降沿)
  68.         EX0=1;//打開INT0的中斷允許。
  69.         EA=1;//打開總中斷        
  70. }
  71. /*******************************************************************************
  72. * 函 數 名         : Int0() interrupt 0
  73. * 函數功能                   : 外部中斷0的中斷函數
  74. * 輸    入         : 無
  75. * 輸    出         : 無
  76. *******************************************************************************/                  

  77. void Int0() interrupt 0                 
  78. {        if(K3==0)
  79.         Delay1ms(10);
  80.         if(K3==0)
  81.         {
  82.                 TR0=~TR0;
  83.                 SetPlace=1;
  84.         }
  85. }

  86. void DigDisplay()
  87. {
  88.         unsigned char i;
  89.         unsigned int j;
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 switch(i)         //位選,選擇點亮的數碼管,
  93.                 {
  94.                         case(0):
  95.                                 {LSA=0;LSB=0;LSC=0;
  96.                                  GPIO_DIG=DIG_CODE[second%10];
  97.                                  j=10;                                                 //掃描間隔時間設定
  98.                                  while(j--);        
  99.                                  GPIO_DIG=0x00;//消隱
  100.                                 } break;//顯示第0位
  101.                         case(1):
  102.                                 {LSA=1;LSB=0;LSC=0;
  103.                                  GPIO_DIG=DIG_CODE[second/10];
  104.                                  j=10;                                                 //掃描間隔時間設定
  105.                                  while(j--);        
  106.                                  GPIO_DIG=0x00;//消隱
  107.                                 } break;//顯示第1位
  108.                         case(2):
  109.                                 {LSA=0;LSB=1;LSC=0;
  110.                                  GPIO_DIG=0X40;
  111.                                 j=10;                                                 //掃描間隔時間設定
  112.                                 while(j--);        
  113.                                 GPIO_DIG=0x00;//消隱
  114.                                 }break;//顯示第2位
  115.                         case(3):
  116.                                 {LSA=1;LSB=1;LSC=0;
  117.                                   GPIO_DIG=DIG_CODE[minute%10];
  118.                                  j=10;                                                 //掃描間隔時間設定
  119.                                  while(j--);        
  120.                                  GPIO_DIG=0x00;//消隱
  121.         }break;//顯示第3位
  122.                         case(4):
  123.                                 {LSA=0;LSB=0;LSC=1;
  124.                                   GPIO_DIG=DIG_CODE[minute/10];
  125.                                  j=10;                                                 //掃描間隔時間設定
  126.                                  while(j--);        
  127.                                  GPIO_DIG=0x00;//消隱
  128.                                 }break;//顯示第4位
  129.                         case(5):
  130.                                 {LSA=1;LSB=0;LSC=1;
  131.                                   GPIO_DIG=0X40;
  132.                                  j=10;                                                 //掃描間隔時間設定
  133.                                  while(j--);        
  134.                                  GPIO_DIG=0x00;//消隱
  135.                                 }break;//顯示第5位
  136.                         case(6):
  137.                                 {LSA=0;LSB=1;LSC=1;
  138.                                   GPIO_DIG=DIG_CODE[hour%10];
  139.                                  j=10;                                                 //掃描間隔時間設定
  140.                                  while(j--);        
  141.                                  GPIO_DIG=0x00;//消隱
  142.                                 }break;//顯示第5位
  143.                         case(7):
  144.                                 {LSA=1;LSB=1;LSC=1;
  145.                                   GPIO_DIG=DIG_CODE[hour/10];
  146.                                  j=10;                                                 //掃描間隔時間設定
  147.                                  while(j--);        
  148.                                  GPIO_DIG=0x00;//消隱
  149.                                 }break;//顯示第5位
  150.                 }
  151.         }
  152. }

  153. void main(void)
  154. {
  155.         unsigned char i;
  156.         TimerConfiguration();
  157.         Int0Configuration();
  158.         while(1)
  159.         {        /*計時函數*/
  160.                 if(Time>=3997)                                         //一秒鐘,改變數值
  161.                 {
  162.                         Time=0;
  163.                         second++;
  164.                         if(second==60)
  165.                         {
  166.                                 second=0;
  167.                                 minute++;
  168.                                 if(minute==60)
  169.                                 {
  170.                                         minute=0;
  171.                                         hour++;
  172.                                         if(hour==24)
  173.                                         {
  174.                                                 hour=0;        
  175.                                         }
  176.                                 }                                
  177.                         }                                       
  178.                 }        
  179.             //--顯示時鐘--//
  180.                 DigDisplay();

  181.                 if(TR0==0)
  182.                 {        if(K1==0)                        //檢測按鍵K1是否按下
  183.                         {
  184.                                 Delay1ms(10);        //消除抖動
  185.                                 if(K1==0)
  186.                                 {  
  187.                                         SetPlace++;
  188.                                         Delay1ms(100);
  189.                                         if(SetPlace>=3)
  190.                                                 SetPlace=0;                                       
  191.                                 }
  192.                                 while((i<50)&&(K1==0))         //檢測按鍵K1是否松開
  193.                                 {
  194.                                         Delay1ms(1);
  195.                                         i++;
  196.                                 }
  197.                                 i=0;                        
  198.                         }
  199.                         switch(SetPlace)
  200.                                 {case 0 :
  201.                                         {
  202.                                          if(K2==0)                //檢測按鍵K2是否按下
  203.                                                 {
  204.                                                 Delay1ms(10);        //消除抖動
  205.                                                 if(K2==0)
  206.                                                         {
  207.                                                         second++;
  208.                                                         Delay1ms(100);
  209.                                                         if(second>=60)
  210.                                                         second=0;
  211.                                                         }
  212.                                                 }
  213.                                                 DigDisplay();
  214.                                          }break;
  215.                                 case 1 :
  216.                                         {
  217.                                          if(K2==0)                //檢測按鍵K2是否按下
  218.                                                 {
  219.                                                 Delay1ms(10);        //消除抖動
  220.                                                 if(K2==0)
  221.                                                         {
  222.                                                         minute++;
  223.                                                         Delay1ms(100);
  224.                                                         if(minute>=60)
  225.                                                         minute=0;
  226.                                                         }
  227.                                                 }
  228.                                         DigDisplay();
  229.                                         }break;
  230.                                 case 2 :
  231.                                         {
  232.                                          if(K2==0)                //檢測按鍵K2是否按下
  233.                                                 {                                                                                                                                                                                                        
  234.                                                 Delay1ms(10);        //消除抖動
  235.                                                 if(K2==0)
  236.                                                         {
  237.                                                         hour++;
  238.                                                         Delay1ms(100);
  239.                                                         if(hour>=24)
  240.                                                         hour=0;
  241.                                                         }
  242.                                                 }
  243.                                                 DigDisplay();
  244.                                          }break;
  245.                                 }
  246.                 }
  247.         }
  248. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线国产视频 | 免费九九视频 | 久久精品久久久久久 | 亚洲午夜精品一区二区三区他趣 | 欧美1区2区 | 高清一区二区三区 | 国产精品色婷婷久久58 | 亚洲综合视频 | 成年人在线 | 国产99精品| 麻豆一区| 国产精品区二区三区日本 | 国产精品久久久久久久久免费高清 | 涩爱av一区二区三区 | 自拍偷拍第一页 | 夜夜爽99久久国产综合精品女不卡 | 亚洲热在线视频 | 九九看片| 久久99久久98精品免观看软件 | 国产欧美日韩综合精品一区二区 | 黄色日本片| 一区二区三区视频在线免费观看 | 久久青青 | 亚洲视频免费在线播放 | 日韩一区二区久久 | 国产精品久久久久久久久免费樱桃 | 国产一区二区电影 | 日韩午夜影院 | 剑来高清在线观看 | 免费在线播放黄色 | 精品96久久久久久中文字幕无 | 国产男人的天堂 | 欧美不卡| 激情av| 久久久久久国产精品免费免费狐狸 | 国产精品免费看 | 一级全黄少妇性色生活免费看 | 涩涩视频网| hitomi一区二区三区精品 | 日本一区二区三区免费观看 | 亚洲欧美aⅴ |