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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4209|回復: 7
收起左側

51單片機定時器以及led燈閃爍問題,求大神指點下

[復制鏈接]
ID:704252 發表于 2020-3-7 20:59 | 顯示全部樓層 |閱讀模式
燒錄進單片機后,按下按鍵無法加減時間,led燈正常閃爍。功能要求如下:用定時器實現準確的延時,延時到后點亮或熄滅一盞燈,然 后通過兩個按鍵(增、 減) 改變延時長短。比如:剛開始的時候點
亮 1s 后熄滅 1s,當按下“增”按鍵后,點亮 1.5s,然后熄滅 1.5s, 再點亮 1.5s,如此循環。當按下“減”按鍵后,點亮 0.5s,然后 熄滅 0.5s, 再點亮 0.5s,如此循環。
以下是單片機代碼,不知道是否合理,出現了按下按鍵,時間無法加和減
#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;

sbit LED = P0^0;
unsigned int i =1000 ; //定時1s


void delay();

void main()
{
    bit keybuf1 = 1;  //按鍵值暫存,臨時保存按鍵的掃描值
        bit keybuf2 = 1;
    bit backup = 1;  //按鍵值備份,保存前一次的掃描值
        unsigned int i =1000 ; //定時1s

    ENLED = 0;   //選擇LED進行顯示
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;  

        TMOD=0X01;
          TH0=0XFC;//賦初值使定時時間為1ms
          TL0=0X18;
        EA=1; //打開總中斷
        ET0=1;//打開定時器中斷
          TR0=1;//打開定時器

    P2 = 0xF7;   //P2.3置0,即KeyOut1輸出低電平
    LED = 0;

        while (1)
    {
        keybuf1 = KEY1;            //把當前掃描值暫存
        if (keybuf1 != backup)     //當前值與前次值不相等說明此時按鍵有動作
        {
            delay();              //延時大約10ms
            if (keybuf1 == KEY1)   //判斷掃描值有沒有發生改變,即按鍵抖動
            {
                if (backup == 0)  //如果前次值為0,則說明當前是彈起動作
                {
                    i = i+500;  //
                }
                backup = keybuf1;  //更新備份為當前值,以備進行下次比較
            }
        }
                keybuf2 = KEY2;            //把當前掃描值暫存
        if (keybuf2 != backup)     //當前值與前次值不相等說明此時按鍵有動作
        {
            delay();              //延時大約10ms
            if (keybuf2 == KEY2)   //判斷掃描值有沒有發生改變,即按鍵抖動
            {
                if (backup == 0)  //如果前次值為0,則說明當前是彈起動作
                {
                    i = i-500;  //
                }
                backup = keybuf2;  //更新備份為當前值,以備進行下次比較
            }
        }
    }
}
/* 軟件延時函數,延時約10ms */
void delay()
{
    unsigned int i = 1000;
        
    while (i--);
}

/******中斷子程序*******/
void timer0() interrupt 1
{        
        static int cnt;
        TH0=0XFC; //重新賦初值
        TL0=0X18;
          cnt++;
        if(cnt >= i)
        {
                cnt = 0;
                LED = ~LED;
        }
}




回復

使用道具 舉報

ID:213173 發表于 2020-3-8 08:20 | 顯示全部樓層
不用把按鍵程序寫那么復雜,結果把自己搞暈了。改簡單點:
  1. #include <reg52.h>

  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. sbit KEY1 = P2^4;
  8. sbit KEY2 = P2^5;

  9. sbit LED = P0^0;

  10. unsigned int i=2; //定時1s

  11. void delay();

  12. void main()
  13. {
  14.         bit keybuf1 = 0;
  15.         bit keybuf2 = 0;
  16.         ENLED = 0;   //選擇LED進行顯示
  17.         ADDR3 = 1;
  18.         ADDR2 = 1;
  19.         ADDR1 = 1;
  20.         ADDR0 = 0;  
  21.         TMOD=0X01;
  22.         TH0=0XFC;//賦初值使定時時間為1ms
  23.         TL0=0X18;
  24.         EA=1; //打開總中斷
  25.         ET0=1;//打開定時器中斷
  26.         TR0=1;//打開定時器
  27.         P2 = 0xF7;   //P2.3置0,即KeyOut1輸出低電平
  28.         LED = 0;
  29.         while (1)
  30.         {
  31.                 if (!KEY1)
  32.                 {
  33.                         delay();              //延時大約10ms
  34.                         if(!KEY1 && keybuf1==0)
  35.                         {
  36.                                 keybuf1=1;
  37.                                 if(i<3)
  38.                                         i++;
  39.                         }
  40.                 }
  41.                 else keybuf1=0;

  42.                 if (!KEY2)
  43.                 {
  44.                         delay();              //延時大約10ms
  45.                         if(!KEY2 && keybuf2==0)
  46.                         {
  47.                                 keybuf2=1;
  48.                                 if(i>1)
  49.                                         i--;
  50.                         }
  51.                 }
  52.                 else keybuf2=0;
  53.         }
  54. }
  55. /* 軟件延時函數,延時約10ms */
  56. void delay()
  57. {
  58.     unsigned int i = 1000;
  59.         
  60.     while (i--);
  61. }

  62. /******中斷子程序*******/
  63. void timer0() interrupt 1
  64. {        
  65.         static int cnt;
  66.         TH0=0XFC; //重新賦初值
  67.         TL0=0X18;
  68.         cnt++;
  69.         if(cnt >= i*500)
  70.         {
  71.                 cnt = 0;
  72.                 LED = ~LED;
  73.         }
  74. }
復制代碼
回復

使用道具 舉報

ID:332444 發表于 2020-3-8 08:37 | 顯示全部樓層
很簡單的問題,代碼寫那么多,看了邏輯也不夠清晰,看得都暈乎,其實很簡單,一個變量存儲時間調節值,初始化中斷,主程序判斷按鍵增減變量的值即可。
回復

使用道具 舉報

ID:704252 發表于 2020-3-11 12:13 | 顯示全部樓層
wulin 發表于 2020-3-8 08:20
不用把按鍵程序寫那么復雜,結果把自己搞暈了。改簡單點:

好噠,謝謝
回復

使用道具 舉報

ID:704252 發表于 2020-3-11 12:14 | 顯示全部樓層
xianfajushi 發表于 2020-3-8 08:37
很簡單的問題,代碼寫那么多,看了邏輯也不夠清晰,看得都暈乎,其實很簡單,一個變量存儲時間調節值,初始 ...

好的,我修改一下
回復

使用道具 舉報

ID:704252 發表于 2020-3-11 20:31 | 顯示全部樓層
wulin 發表于 2020-3-8 08:20
不用把按鍵程序寫那么復雜,結果把自己搞暈了。改簡單點:

可以問一下我的代碼哪里出錯了嗎?
回復

使用道具 舉報

ID:213173 發表于 2020-3-12 06:25 | 顯示全部樓層
har-d 發表于 2020-3-11 20:31
可以問一下我的代碼哪里出錯了嗎?

backup作為記憶按鍵狀態的位變量不可以共用于多個按鍵,如只作一個按鍵記憶在此程序中還是有缺陷:按鍵按下并不會響應,松手后才會響應。用Keil走單步就一目了然了。
回復

使用道具 舉報

ID:704252 發表于 2020-3-12 18:18 | 顯示全部樓層
wulin 發表于 2020-3-12 06:25
backup作為記憶按鍵狀態的位變量不可以共用于多個按鍵,如只作一個按鍵記憶在此程序中還是有缺陷:按鍵按 ...

好的,謝謝你
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波波电影院一区二区三区 | 精品中文在线 | 精品欧美乱码久久久久久 | 免费视频一区二区三区在线观看 | 日本成人中文字幕 | 亚洲成人av一区二区 | 黄视频免费在线 | 国产sm主人调教女m视频 | 国产激情视频在线 | 亚洲欧美日韩国产综合 | 欧美精品一区二区三区在线播放 | 欧美电影大全 | 日韩成人精品一区二区三区 | 亚洲欧美v | 欧美一级在线视频 | 国产综合视频 | 日韩av一区二区在线观看 | 成人精品鲁一区一区二区 | 狠狠干狠狠操 | av电影手机在线看 | 精品久久久久久久久久久久久 | 欧美成人一区二区 | 三级成人片 | 精品久久久久久久久久久久久久 | 国产精品射| 欧美色综合一区二区三区 | 欧美成人免费在线视频 | 91久久国产综合久久91精品网站 | 欧美日韩一区二区在线观看 | 97福利在线 | av在线视 | 91精品国产高清久久久久久久久 | 亚洲视频在线观看免费 | 激情婷婷 | 在线视频一区二区三区 | 久久伊人在 | 99re视频在线观看 | 久久久久一区二区 | 精品美女视频在线观看免费软件 | av黄色片在线观看 | 久久亚洲欧美日韩精品专区 |