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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機時鐘,秒表的程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:159243 發(fā)表于 2017-1-1 20:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar code Tab0[]=                //定義數(shù)碼管數(shù)組,沒有小數(shù)點
  5. {
  6.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  7. };
  8. uchar code Tab1[]=                //定義數(shù)碼管數(shù)組,有小數(shù)點
  9. {        
  10.         0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
  11. };

  12. sbit K1=P3^2;                        //模式選擇鍵,本程序三種模式,分別是時間顯示、秒表、時間設置
  13. sbit K2=P3^3;                        //設置時間時加一/開始(暫停)秒表按鍵
  14. sbit K3=P3^4;                        //切換設置位/清零秒表按鍵

  15. void Delay(uchar x);                //延時函數(shù)
  16. void Display0();                 //時間顯示函數(shù)
  17. void Display1();                 //秒表顯示函數(shù)
  18. void Display2();                //時間設置顯示函數(shù)
  19. void Init();                         //中斷初始化函數(shù)
  20. void Mode_K1();                        //模式切換函數(shù)
  21. void KEY_MiaoBiao();        //檢測秒表操作按鍵
  22. void KEY_Time_Set();         //檢測時間設置按鍵


  23. uchar Hours=23,Minutes=56,seconds=55;                //分別定義三個變量表示時、分、秒
  24. uchar Time0_bit=0;                        //用于定時器0的溢出標志
  25. bit Set_Time=0;                                //設置時 閃爍時長的標志位
  26. bit Set0=0;                                        //設置時間標志,確定是設置‘分’還設置‘時’
  27. uchar K1_bit=0;                                  //用于模式切換的標志
  28. uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4;                //用于秒表的變量

  29. void main()
  30. {
  31.         Init();                                                                                //中斷初始化
  32.         while(1)                                                                        //死循環(huán)
  33.                 {
  34.                         Mode_K1();                                                        //模式掃描
  35.                         switch(K1_bit)                                                 //模式選擇
  36.                                 {
  37.                                         case 0:
  38.                                                 {
  39.                                                         Display0();                        //顯示時間                                                               
  40.                                                         break;
  41.                                                 }
  42.                                         case 1:
  43.                                                 {
  44.                                                         Display1();                         //顯示秒表
  45.                                                         KEY_MiaoBiao();                //掃描秒表操作
  46.                                                         break;
  47.                                                 }
  48.                                         case 2:
  49.                                                         {
  50.                                                                 Display2();                //設置時間時的顯示程序,可閃爍定位
  51.                                                                 KEY_Time_Set();        //掃描按鍵
  52.                                                                 break;
  53.                                                         }
  54.                                 }
  55.                 }
  56. }

  57. void KEY_Time_Set()                                                                   //設置時間時的按鍵掃描函數(shù)
  58. {
  59.         if(K1_bit==2)                                                                  //判斷是否為時間設置模式
  60.                 {
  61.                         if(K2==0)                                                         //K2有按下(下同)
  62.                                 {
  63.                                         Delay(10);                                           //延時消抖(下同)
  64.                                         if(K2==0)                                         //再次檢測是否為誤按
  65.                                                 {
  66.                                                         if(Set0==0)                        //檢測是設置‘時’還是分,Set0為0時設置‘分’,Set0為1時設置‘時’
  67.                                                                 {
  68.                                                                         Minutes++;         //‘分’加1
  69.                                                                         if(Minutes==60)        //當'分'加到60時,重新賦值0
  70.                                                                                 Minutes=0;
  71.                                                                 }
  72.                                                         else
  73.                                                                 {
  74.                                                                         Hours++;          //‘時’加1
  75.                                                                         if(Hours==24)        //當'時'加到24時,重新賦值0
  76.                                                                                 Hours=0;
  77.                                                                 }
  78.                                                         while(!K2);                        //按鍵松開檢測,消除松開按鍵時的抖動干擾
  79.                                                 }
  80.                                 }
  81.                         if(K3==0)
  82.                                 {
  83.                                         Delay(10);
  84.                                         if(K3==0)
  85.                                                 {
  86.                                                         Set0=~Set0;                        //K3每按一次Set0取反,以確定是設置‘時’還是設置‘分’,Set0為0時設置‘分’,Set0為1時設置‘時’
  87.                                                         while(!K3);
  88.                                                 }        
  89.                                 }
  90.                 }
  91. }

  92. void KEY_MiaoBiao()                                                                //檢測秒表按鍵操作
  93. {
  94.         if(K1_bit==1)                                                                //判斷是否為秒表模式
  95.                 {
  96.                         if(K2==0)
  97.                                 {
  98.                                         Delay(10);
  99.                                         if(K2==0)
  100.                                                 {
  101.                                                         TR1=~TR1;                        //K2每按一次TR1取反,暫停或開始定時器1,達到暫停或開始秒表的目的
  102.                                                         while(!K2);
  103.                                                 }
  104.                                 }
  105.                         if(K3==0)
  106.                                 {
  107.                                         Delay(10);
  108.                                         if(K3==0)                                         //當K3按下時秒表所有數(shù)據(jù)清零,并停止定時器1
  109.                                                 {
  110.                                                         TR1=0;                                 //停止定時器1
  111.                                                         Miao_Biao0=0;                 //清零數(shù)據(jù)
  112.                                                         Miao_Biao1=0;
  113.                                                         Miao_Biao2=0;
  114.                                                         Miao_Biao3=0;
  115.                                                         Miao_Biao4=0;
  116.                                                         while(!K3);
  117.                                                 }
  118.                                 }
  119.                 }
  120. }

  121. void Mode_K1()                                                                        //模式選擇鍵,本程序三種模式,分別是時間顯示、秒表、時間設置
  122. {
  123.         if(K1==0)
  124.                 {
  125.                         Delay(10);
  126.                         if(K1==0)
  127.                                 {
  128.                                         K1_bit++;
  129.                                         if(K1_bit==3)
  130.                                                 {
  131.                                                         K1_bit=0;
  132.                                                 }
  133.                                         while(!K1);
  134. /***********************************************************************
  135. *************當K1_bit為0時顯示時鐘,為1時進入秒表,*********************
  136. *******************為2時進入時間設置模式********************************
  137. ***********************************************************************/
  138.                                 }
  139.                 }
  140. }
  141.         

  142. void Time1() interrupt 3                          //定時器1函數(shù)
  143. {
  144.         TH1=(65536-50000)/256;                        //重裝初值
  145.         TL1=(65536-50000)%256;

  146.         Miao_Biao0++;
  147.         if(Miao_Biao0==2)                                //以下為秒表數(shù)據(jù)處理
  148.                 {
  149.                         Miao_Biao0=0;
  150.                         Miao_Biao1++;                         //Miao_Biao1每加1次為100ms,
  151.                         if(Miao_Biao1==10)
  152.                                 {
  153.                                         Miao_Biao1=0;
  154.                                         Miao_Biao2++;
  155.                                         if(Miao_Biao2==60)
  156.                                                 {
  157.                                                         Miao_Biao2=0;
  158.                                                         Miao_Biao3++;
  159.                                                         if(Miao_Biao3==60)
  160.                                                                 {
  161.                                                                         Miao_Biao3=0;
  162.                                                                         Miao_Biao4++;
  163.                                                                         if(Miao_Biao4==10)
  164.                                                                                 Miao_Biao4=0;
  165.                                                                 }
  166.                                                 }
  167.                                 }
  168.                 }
  169. }


  170. void Time0() interrupt 1                                         //定時器0函數(shù)
  171. {
  172.         TH0=(65536-50000)/256;                                           //重裝初值
  173.         TL0=(65536-50000)%256;
  174.         Time0_bit++;
  175.         if((Time0_bit%10)==0)                                        //每溢出10次Time0_bit取反一次
  176.                 Set_Time=~Set_Time;                                          //0.5秒閃爍一次

  177.         if(Time0_bit==20)                                                //以下為時間數(shù)據(jù)處理
  178.                 {
  179.                         Time0_bit=0;
  180.                         seconds++;
  181.                         if(seconds==60)
  182.                                 {
  183.                                         seconds=0;
  184.                                         Minutes++;
  185.                                         if(Minutes==60)
  186.                                                 {
  187.                                                         Minutes=0;
  188.                                                         Hours++;
  189.                                                         if(Hours==24)
  190.                                                                 {
  191.                                                                         Hours=0;
  192.                                                                 }
  193.                                                 }
  194.                                 }

  195.                 }
  196. }

  197. void Init()                                                         //中斷初始化函數(shù)
  198. {
  199.         EA=1;                                                         //開總中斷
  200.         TMOD=0X11;                                                  //定時器工作方式選擇,定時器0和定時器1都選擇第1種工作方式
  201.         TH0=(65536-50000)/256;                        //定時器0裝初值,定時50ms
  202.         TL0=(65536-50000)%256;
  203.         ET0=1;                                                        //開定時器0開關
  204.         TR0=1;                                                           //開定時器0小開關

  205.         TH1=(65536-50000)/256;                        //定時器1裝初值,定時50ms
  206.         TL1=(65536-50000)%256;
  207.         ET1=1;                                                          //開定時器1開關
  208.         TR1=0;                                                        //關定時器1小開關
  209. }

  210. void Display2()                                                        //時間設置時的顯示函數(shù)        
  211. {
  212.         if(Set0==0)                                                        //判斷是否為設置‘時’還是‘分’
  213.                 {
  214.                         P0=Tab0[seconds%10];                //顯示秒的個位
  215.                         P1=0xdf;                                        //段選
  216.                         Delay(10);                                        //延時
  217.                         P0=0X00;                                        //消隱
  218.                
  219.                         P0=Tab0[seconds/10];                //顯示秒的十位
  220.                         P1=0xef;                                        //段選
  221.                         Delay(10);                                        //延時
  222.                         P0=0X00;                                        //消隱
  223.                         
  224.                         if(Set_Time)                                //這個if語句實現(xiàn)分鐘以0.5秒的頻率閃爍
  225.                                 {
  226.                                         P0=Tab1[Minutes%10];                //顯示分的個位,需要加上小數(shù)點做分隔符
  227.                                         P1=0xf7;                                        //段選
  228.                                         Delay(10);                                        //延時
  229.                                         P0=0X00;                                        //消隱

  230.                                         P0=Tab0[Minutes/10];                //顯示分的十位
  231.                                         P1=0xfb;                                        //段選
  232.                                         Delay(10);                                        //延時
  233.                                         P0=0X00;                                        //消隱
  234.                                 }
  235.                         else
  236.                                 {
  237.                                         P0=0x00;                //顯示分的個位,需要加上小數(shù)點做分隔符
  238.                                         P1=0xf7;                                        //段選
  239.                                         Delay(10);                                        //延時
  240.                                         P0=0X00;                                        //消隱
  241.                
  242.                                         P0=0x00;                //顯示分的十位
  243.                                         P1=0xfb;                                        //段選
  244.                                         Delay(10);                                        //延時
  245.                                         P0=0X00;                                        //消隱
  246.                                 }
  247.                         
  248.                         P0=Tab1[Hours%10];                        //顯示時的個位,需要加上小數(shù)點做分隔符
  249.                         P1=0xfd;                                        //段選
  250.                         Delay(10);                                        //延時
  251.                         P0=0X00;                                        //消隱
  252.                
  253.                         P0=Tab0[Hours/10];                        //顯示時的十位
  254.                         P1=0xfe;                                        //段選
  255.                         Delay(10);                                        //延時
  256.                         P0=0X00;                                        //消隱
  257.                 }


  258.         else                        //‘時’鐘閃爍
  259.                 {
  260.                         P0=Tab0[seconds%10];                //顯示秒的個位
  261.                         P1=0xdf;                                        //段選
  262.                         Delay(10);                                        //延時
  263.                         P0=0X00;                                        //消隱
  264.                
  265.                         P0=Tab0[seconds/10];                //顯示秒的十位
  266.                         P1=0xef;                                        //段選
  267.                         Delay(10);                                        //延時
  268.                         P0=0X00;                                        //消隱
  269.                         
  270.                         P0=Tab1[Minutes%10];                //顯示分的個位,需要加上小數(shù)點做分隔符
  271.                         P1=0xf7;                                        //段選
  272.                         Delay(10);                                        //延時
  273.                         P0=0X00;                                        //消隱

  274.                         P0=Tab0[Minutes/10];                //顯示分的十位
  275.                         P1=0xfb;                                        //段選
  276.                         Delay(10);                                        //延時
  277.                         P0=0X00;                                        //消隱
  278.                         
  279.                         if(Set_Time)                                //這個if語句實現(xiàn)‘時’鐘以0.5秒的頻率閃爍
  280.                                 {
  281.                                         P0=Tab1[Hours%10];                        //顯示時的個位,需要加上小數(shù)點做分隔符
  282.                                         P1=0xfd;                                        //段選
  283.                                         Delay(10);                                        //延時
  284.                                         P0=0X00;                                        //消隱
  285.                                 
  286.                                         P0=Tab0[Hours/10];                        //顯示時的十位
  287.                                         P1=0xfe;                                        //段選
  288.                                         Delay(10);                                        //延時
  289.                                         P0=0X00;                                        //消隱
  290.                                 }
  291.                         else
  292.                                 {
  293.                                         P0=0x00;                        //顯示時的個位,需要加上小數(shù)點做分隔符
  294.                                         P1=0xFF;                                        //段選
  295.                                         Delay(10);                                        //延時
  296.                                         P0=0X00;                                        //消隱
  297.                                 
  298.                                         P0=0X00;                        //顯示時的十位
  299.                                         P1=0xFF;                                        //段選
  300.                                         Delay(10);                                        //延時
  301.                                         P0=0X00;                                        //消隱                                
  302.                                 }               
  303.                 }
  304. }

  305. void Display1()                        //顯示秒表
  306. {
  307.         P0=Tab0[Miao_Biao1%10];                //顯示1/10秒的個位
  308.         P1=0xdf;                                        //段選
  309.         Delay(10);                                        //延時
  310.         P0=0X00;                                        //消隱

  311.         P0=Tab1[Miao_Biao2%10];                //顯示秒的個位,需要加上小數(shù)點做分隔符
  312.         P1=0xef;                                        //段選
  313.         Delay(10);                                        //延時
  314.         P0=0X00;                                        //消隱

  315.         P0=Tab0[Miao_Biao2/10];                //顯示秒的十位
  316.         P1=0xf7;                                        //段選
  317.         Delay(10);                                        //延時
  318.         P0=0X00;                                        //消隱

  319.         P0=Tab1[Miao_Biao3%10];                //顯示分的個位,需要加上小數(shù)點做分隔符
  320.         P1=0xfb;                                        //段選
  321.         Delay(10);                                        //延時
  322.         P0=0X00;                                        //消隱

  323.         P0=Tab0[Miao_Biao3/10];                //顯示分的十位
  324.         P1=0xfd;                                        //段選
  325.         Delay(10);                                        //延時
  326.         P0=0X00;                                        //消隱

  327.         P0=Tab1[Miao_Biao4%10];                //顯示時的個位,需要加上小數(shù)點做分隔符
  328.         P1=0xfe;                                        //段選
  329.         Delay(10);                                        //延時
  330.         P0=0X00;                                        //消隱
  331. }

  332. void Display0()                        //顯示時鐘
  333. {
  334.         P0=Tab0[seconds%10];                //顯示秒的個位
  335.         P1=0xdf;                                        //段選
  336.         Delay(10);                                        //延時
  337.         P0=0X00;                                        //消隱

  338.         P0=Tab0[seconds/10];                //顯示秒的十位
  339.         P1=0xef;                                        //段選
  340.         Delay(10);                                        //延時
  341.         P0=0X00;                                        //消隱

  342.         P0=Tab1[Minutes%10];                //顯示分的個位,需要加上小數(shù)點做分隔符
  343.         P1=0xf7;                                        //段選
  344.         Delay(10);                                        //延時
  345.         P0=0X00;                                        //消隱

  346.         P0=Tab0[Minutes/10];                //顯示分的十位
  347.         P1=0xfb;                                        //段選
  348.         Delay(10);                                        //延時
  349.         P0=0X00;                                        //消隱

  350.         P0=Tab1[Hours%10];                        //顯示時的個位,需要加上小數(shù)點做分隔符
  351.         P1=0xfd;                                        //段選
  352.         Delay(10);                                        //延時
  353.         P0=0X00;                                        //消隱

  354.         P0=Tab0[Hours/10];                        //顯示時的十位
  355.         P1=0xfe;                                        //段選
  356.         Delay(10);                                        //延時
  357.         P0=0X00;                                        //消隱
  358. }


  359. void Delay(uchar x)                                  //延時
  360. {
  361.         uchar i,j;
  362.         for(i=x;i>0;i--)
  363.                 for(j=110;j>0;j--);
  364. }


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

使用道具 舉報

沙發(fā)
ID:351208 發(fā)表于 2018-6-13 16:43 | 只看該作者
你好,我用這個代碼在單片機上實驗,不能正確顯示,他只亮第一個數(shù)碼管
回復

使用道具 舉報

板凳
ID:351208 發(fā)表于 2018-6-13 16:47 | 只看該作者
我用這個代碼在單片機板子上不能正確顯示時間
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频亚洲 | 免费一区二区三区 | 国产高清一区二区三区 | 天堂色区 | 一区二区三区四区国产 | 久久九 | 九九九久久国产免费 | 国产一区二区毛片 | 久久久久久久久淑女av国产精品 | 久久99视频这里只有精品 | 国产一级片免费在线观看 | 久久久av中文字幕 | 在线日韩中文字幕 | 成人精品在线观看 | 日韩av成人| 蜜桃传媒一区二区 | 亚洲精品片 | 嫩草视频在线看 | 亚洲视频欧美视频 | 日日操夜夜操天天操 | 中文字幕精品一区 | 色永久| 99久久精品视频免费 | 一级黄a视频 | 国产欧美一区二区三区另类精品 | 欧美 中文字幕 | 久久精品毛片 | 久久精品久久久久久 | 在线观看www | www日本高清视频 | 人人做人人澡人人爽欧美 | 国产二区精品视频 | 夜夜爽99久久国产综合精品女不卡 | 亚洲欧美日韩精品久久亚洲区 | 午夜一级大片 | 国产精品久久久久不卡 | 一级美国黄色片 | 国产91久久久久久 | 一区二区三区四区国产 | 精国产品一区二区三区 | 日韩精品一区二区三区 |