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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3964|回復: 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圖

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

使用道具 舉報

沙發
ID:972882 發表于 2021-10-17 23:45 | 只看該作者
各位大神能否幫我看看我這個程序為什么K2沒反應(沒報錯)
回復

使用道具 舉報

板凳
ID:972882 發表于 2021-10-17 23:46 | 只看該作者
能否有條件在該程序原來的基礎上修改一部分讓K2正常運行
回復

使用道具 舉報

地板
ID:332444 發表于 2021-10-18 08:13 | 只看該作者
回復

使用道具 舉報

5#
ID:839438 發表于 2021-10-18 10:06 | 只看該作者
if (k2 == 0)

    {

        delay(1000);

        if (k2 == 0)

        {

           

          flag2=1;
        }
while (!k2)

                ;
    }感覺是這樣的
回復

使用道具 舉報

6#
ID:161164 發表于 2021-10-18 17:02 | 只看該作者
好可怕的寫法
while(1)
  while(1)
    while(1)
      while(1)
       while(1)
回復

使用道具 舉報

7#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区欧美 | 99久久夜色精品国产亚洲96 | av在线一区二区三区 | 久久中文视频 | 久久1区 | 亚洲免费在线 | 国产精品国产三级国产aⅴ中文 | 日韩电影中文字幕 | 精品国产乱码久久久久久88av | www.成人免费视频 | 日本二区 | 性高湖久久久久久久久aaaaa | 亚洲精品国产a久久久久久 午夜影院网站 | 99久久电影 | 亚洲精品乱 | 一久久久 | 羞羞视频在线观看网站 | 国产精品久久久久久久久久久久久久 | 国产精品伦一区二区三级视频 | 亚洲一区二区三区视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 亚洲精彩视频 | 韩日精品一区 | 成人精品 | 91就要激情 | 天天久久 | 精品自拍视频在线观看 | 亚洲一区二区久久 | 91精品久久久久久久久久入口 | 国产精品18久久久久久久 | 久久51 | 亚洲综合视频 | 国产情侣在线看 | 成人性生交大片免费看中文带字幕 | 一区二区激情 | 欧日韩在线| 久久久毛片 | 一区日韩 | 在线免费观看黄网 | 精品国产乱码久久久久久果冻传媒 | 日韩精品视频在线观看一区二区三区 |