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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4504|回復: 7
收起左側(cè)

51單片機定時器以及l(fā)ed燈閃爍問題,求大神指點下

[復制鏈接]
ID:704252 發(fā)表于 2020-3-7 20:59 | 顯示全部樓層 |閱讀模式
燒錄進單片機后,按下按鍵無法加減時間,led燈正常閃爍。功能要求如下:用定時器實現(xiàn)準確的延時,延時到后點亮或熄滅一盞燈,然 后通過兩個按鍵(增、 減) 改變延時長短。比如:剛開始的時候點
亮 1s 后熄滅 1s,當按下“增”按鍵后,點亮 1.5s,然后熄滅 1.5s, 再點亮 1.5s,如此循環(huán)。當按下“減”按鍵后,點亮 0.5s,然后 熄滅 0.5s, 再點亮 0.5s,如此循環(huán)。
以下是單片機代碼,不知道是否合理,出現(xiàn)了按下按鍵,時間無法加和減
#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)   //判斷掃描值有沒有發(fā)生改變,即按鍵抖動
            {
                if (backup == 0)  //如果前次值為0,則說明當前是彈起動作
                {
                    i = i+500;  //
                }
                backup = keybuf1;  //更新備份為當前值,以備進行下次比較
            }
        }
                keybuf2 = KEY2;            //把當前掃描值暫存
        if (keybuf2 != backup)     //當前值與前次值不相等說明此時按鍵有動作
        {
            delay();              //延時大約10ms
            if (keybuf2 == KEY2)   //判斷掃描值有沒有發(fā)生改變,即按鍵抖動
            {
                if (backup == 0)  //如果前次值為0,則說明當前是彈起動作
                {
                    i = i-500;  //
                }
                backup = keybuf2;  //更新備份為當前值,以備進行下次比較
            }
        }
    }
}
/* 軟件延時函數(shù),延時約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 發(fā)表于 2020-3-8 08:20 | 顯示全部樓層
不用把按鍵程序?qū)懩敲磸碗s,結(jié)果把自己搞暈了。改簡單點:
  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. /* 軟件延時函數(shù),延時約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 發(fā)表于 2020-3-8 08:37 | 顯示全部樓層
很簡單的問題,代碼寫那么多,看了邏輯也不夠清晰,看得都暈乎,其實很簡單,一個變量存儲時間調(diào)節(jié)值,初始化中斷,主程序判斷按鍵增減變量的值即可。
回復

使用道具 舉報

ID:704252 發(fā)表于 2020-3-11 12:13 | 顯示全部樓層
wulin 發(fā)表于 2020-3-8 08:20
不用把按鍵程序?qū)懩敲磸碗s,結(jié)果把自己搞暈了。改簡單點:

好噠,謝謝
回復

使用道具 舉報

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

好的,我修改一下
回復

使用道具 舉報

ID:704252 發(fā)表于 2020-3-11 20:31 | 顯示全部樓層
wulin 發(fā)表于 2020-3-8 08:20
不用把按鍵程序?qū)懩敲磸碗s,結(jié)果把自己搞暈了。改簡單點:

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

使用道具 舉報

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

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

使用道具 舉報

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

好的,謝謝你
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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