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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4264|回復: 6
收起左側

設計一個簡易單片機秒表,按鍵k1按下后,開始計時 如果再次按下開始按鍵,則暫停計時

[復制鏈接]
ID:972882 發表于 2021-10-17 23:44 | 顯示全部樓層 |閱讀模式
目前K2沒反應(沒報錯)

單片機源程序如下:
  1. #include <REG52.H>

  2. sbit k1 = P3 ^ 2; //開始按鍵k1

  3. sbit k2 = P3 ^ 3; //暫停按鍵k2

  4. /*全局變量及函數聲明*/
  5. unsigned char flag2=0;
  6. unsigned char flag = 0;     //運行標記
  7. unsigned char second;
  8. unsigned char second2;
  9. void delay1s();             //定時器計時1s的函數

  10. void disp(unsigned char i); //數碼管顯示函數

  11. void delay(unsigned int i); //粗略延時函數

  12. unsigned char isStarted();  //判斷是否開始按鍵按下函數

  13. unsigned char isPaused();   //判斷是否暫停按鍵按下函數
  14. unsigned char isclear();
  15. /*------聲明結束-----------*/

  16. void main()

  17. {
  18. unsigned char second2= 0;
  19.     unsigned char second = 0; //秒計數變量

  20.     disp(second);             //一開始顯示"00"

  21.     while (1)

  22.     {

  23.         while (!isStarted())

  24.             ; //檢測開始按鍵是否按下,按下則結束此處的循環等待,往下執行

  25.         while (flag)

  26.         {

  27.             disp(second); //把秒數寫入顯示函數

  28.             delay1s();    //調用1s函數

  29.             second++;     //隔1s,秒數加1

  30.             if (second == 100)

  31.                 second = 0; //當定時到100,則變成0
  32. isclear();
  33.             isPaused();     //調用暫停按鍵函數,檢測暫停按鍵是否按下

  34.         }

  35.     }
  36. while(flag2)

  37.     disp(second2);            //一開始顯示"00"
  38.                   while (1)

  39.     {

  40.         while (!isStarted())

  41.             ; //檢測開始按鍵是否按下,按下則結束此處的循環等待,往下執行

  42.         while (flag2)

  43.         {
  44. P1=0XC0;
  45.                                         P2=0XC0;
  46.             disp(second); //把秒數寫入顯示函數

  47.             delay1s();    //調用1s函數

  48.             second++;     //隔1s,秒數加1

  49.             if (second == 100)

  50.                 second = 0; //當定時到100,則變成0
  51. isclear();
  52.             isPaused();     //調用暫停按鍵函數,檢測暫停按鍵是否按下

  53.         }

  54.     }
  55. }



  56. //定時器計時1s的函數

  57. void delay1s()

  58. {

  59.     unsigned char i;

  60.     for (i = 0; i < 20; i++) //因為計數器每計50000次就耗時50ms,所以20次循環則為1s

  61.     {

  62.         //isPaused(); //調用暫停按鍵函數,檢測暫停按鍵是否按下。優點:不用長按暫停鍵就可以停止計時;缺點:每次計時要檢測耗費時間,影響定時準確性。

  63.         /*1、設置定時器工作方式(只需要設置1次即可)*/

  64.         TMOD = 0x10; //定時器T1設置為工作方式1,16位計數器

  65.         /*2、給計數器賦初始值*/

  66.         /*只要每次對計數器重新賦值,就按照下面設置的值在TR1啟動后開始計數*/

  67.         TH1 = (65536 - 50000) / 256; //把初始值寫入計數器的高8位

  68.         TL1 = (65536 - 50000) % 256; //把初始值寫入計數器的低8位

  69.         /*3、啟動定時器*/

  70.         TR1 = 1; //啟動定時器T ReadyGo

  71.         /*4、檢測計數器是否溢出*/

  72.         while (TF1 == 0)

  73.             ; //當還沒有溢出就等待,當溢出時TF1自動為1

  74.         /*5、手動清除溢出標記*/

  75.         TF1 = 0; //必須手動對溢出標記清零,以便開始下一次計數定時

  76.     }

  77. }



  78. //數碼管顯示函數

  79. void disp(unsigned char i)

  80. {

  81.     unsigned char code led[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

  82.     //定義0~9顯示碼,共陽極數碼管

  83.     P1 = led[i / 10]; //把秒數的十位寫給P1口

  84.     P2 = led[i % 10]; //把秒數的個位寫給P2口

  85. }



  86. //粗略延時函數

  87. void delay(unsigned int i)

  88. {

  89.     while (i--)

  90.         ;

  91. }

  92. //判斷是否開始按鍵按下函數

  93. unsigned char isStarted()

  94. {

  95.     if (k1 == 0)

  96.     {

  97.         delay(1000);

  98.         if (k1 == 0)

  99.         {

  100.             while (!k1)

  101.                 ;

  102.             flag = 1; //把運行標記設置為1

  103.         }

  104.     }

  105.     return flag;

  106. }

  107. //判斷是否暫停按鍵按下函數

  108. unsigned char isPaused()

  109. {

  110.     if (k1 == 0)

  111.     {

  112.         delay(1000);

  113.         if (k1 == 0)

  114.         {

  115.             while (!k1)

  116.                 ;

  117.             flag = 0; //把運行標記設置為0

  118.         }

  119.     }

  120.     return flag;

  121. }

  122. unsigned char isclear()

  123. {

  124.     if (k2 == 0)

  125.     {

  126.         delay(1000);

  127.         if (k2 == 0)

  128.         {

  129.             while (!k2)

  130.                 ;

  131.           flag2=1;
  132.         }

  133.     }

  134. return flag2;

  135. }
復制代碼


作業4-制作簡易秒表(外部中斷、定時器中斷).zip

33.16 KB, 下載次數: 12

C語言程序

作業3-使用定時器制作簡易秒表.zip

22.45 KB, 下載次數: 14

prpteus圖

回復

使用道具 舉報

ID:972882 發表于 2021-10-17 23:45 | 顯示全部樓層
各位大神能否幫我看看我這個程序為什么K2沒反應(沒報錯)
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:972882 發表于 2021-10-17 23:46 | 顯示全部樓層
能否有條件在該程序原來的基礎上修改一部分讓K2正常運行
回復

使用道具 舉報

ID:332444 發表于 2021-10-18 08:13 | 顯示全部樓層
回復

使用道具 舉報

ID:839438 發表于 2021-10-18 10:06 | 顯示全部樓層
if (k2 == 0)

    {

        delay(1000);

        if (k2 == 0)

        {

           

          flag2=1;
        }
while (!k2)

                ;
    }感覺是這樣的
回復

使用道具 舉報

ID:161164 發表于 2021-10-18 17:02 | 顯示全部樓層
好可怕的寫法
while(1)
  while(1)
    while(1)
      while(1)
       while(1)
回復

使用道具 舉報

ID:213173 發表于 2021-10-18 20:32 | 顯示全部樓層
SWATELITE 發表于 2021-10-17 23:46
能否有條件在該程序原來的基礎上修改一部分讓K2正常運行

樓主對while情有獨鐘。在該程序原來的基礎上修改只能保留#include <REG52.H>,其它幾乎都要改。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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