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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機樓道延時開關程序,為什么一次加就是加50s.數字太大會亂

  [復制鏈接]
跳轉到指定樓層
樓主
ID:938708 發表于 2021-6-18 15:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
設計一樓道觸摸延時開關控制器,其功能是當人用手觸摸開關時,照明燈點亮,并持續一段時間后自動熄滅。開關的延時時間可設置并有顯示。
觸摸即是按鍵開關,程序出現了錯誤,為什么一次加就是加50s.數字太大會亂。


程序如下:

  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  4. uchar KEY,keyval,dat[2],sec,num,tick,time;
  5. sbit D1=P1^0;
  6. sbit D2=P1^1;
  7. void delay(uchar x)
  8. {
  9. uchar i,j;
  10. for(i=0;i<x;i++)
  11. for(j=0;j<125;j++);
  12. }
  13. void dischg()
  14. {
  15. dat[0]=time/10;
  16. dat[1]=time%10;
  17. }
  18. void getkey(void)
  19. {
  20. keyval=0xff;
  21. KEY=P3&0x0f;
  22. if(KEY!=0xf)
  23. {
  24.   delay(10);
  25.   KEY=P3&0x0f;
  26.   if(KEY!=0x0f)
  27.   {
  28.   switch(KEY)
  29.   {
  30.   case 0x0e:
  31.    while(P3&0x0f==0x0e);
  32.    keyval=1;
  33.    break;
  34.   case 0x0d:
  35.    while(P3&0x0f==0x0d);
  36.    keyval=2;
  37.    break;
  38.   case 0x0b:
  39.    while(P3&0x0f==0x0b);
  40.    keyval=3;
  41.    break;
  42.   case 0x07:
  43.    while(P3&0x0f==0x07);
  44.    keyval=4;
  45.    break;
  46.   default:break;
  47.   }
  48.   }
  49. }
  50. }
  51. void t0_isr() interrupt 1
  52. {
  53. TR0=0;
  54. TH0=(65536-50000)/256;
  55. TL0=(65536-50000)%256;
  56. TR0=1;
  57. tick++;
  58. if(tick>=20)
  59. {
  60.   tick=0;
  61.   if(time>0)time--;
  62.   else
  63.   {
  64.   D1=0;
  65.   D2=0;
  66.   TR0=0;
  67.   time=sec;
  68.   }
  69. dischg();
  70. }
  71. }
  72. t1_isr() interrupt 3
  73. {
  74. TR1=0;
  75. TH1=(65536-5000)/256;
  76. TL1=(65536-5000)%256;
  77. TR1=1;
  78. if(num)P2=0x01;
  79. else P2=0x02;
  80. P0=~ledtab[dat[num]];
  81. num++;
  82. num&=0x01;
  83. }
  84. main()
  85. {
  86. TMOD=0x11;
  87. TH0=(65536-50000)/256;
  88. TL0=(65536-50000)%256;
  89. TH1=(65536-5000)/256;
  90. TL1=(65536-5000)%256;
  91. dat[0]=0x00;
  92. dat[1]=0x05;
  93. tick=0;
  94. sec=5;
  95. time=5;
  96. // dischg();
  97. TR0=0;
  98. ET0=1;
  99. TR1=1;
  100. ET1=1;
  101. D1=0;
  102. D2=0;
  103. EA=1;
  104. while(1)
  105. {
  106.   getkey();
  107.   switch(keyval)
  108.   {
  109.   case 1:
  110.    TR0=0;
  111.    sec++;
  112.    time=sec;
  113.    dischg();
  114.    break;
  115.   case 2:
  116.    TR0=0;
  117.    if(sec>1)sec--;
  118.    time=sec;
  119.    dischg();
  120.    break;
  121.   case 3:
  122.    D1=1;
  123.    D2=0;
  124.    TR0=1;
  125.    time=sec;
  126.    dischg();
  127.    break;
  128.   case 4:
  129.    D1=0;
  130.    D2=1;
  131.    TR0=1;
  132.    time=sec;
  133.    dischg();
  134.    break;
  135.   default:break;
  136.   }
  137. }
  138. }
復制代碼

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

使用道具 舉報

沙發
ID:739545 發表于 2021-6-18 16:29 | 只看該作者
按鍵沒有做防抖延遲處理,當你按下去的時候,你以為只按了一下,實際sec值不知道跑了多少下了,就4個按鍵,不要用鍵值的方法,就直接比較按鍵是否為另,如果為0 while(P-30==0)
回復

使用道具 舉報

板凳
ID:356290 發表于 2021-6-18 16:34 | 只看該作者
按鍵沒消抖,所以一直加了,你可以判斷按下松開再加
回復

使用道具 舉報

地板
ID:938708 發表于 2021-6-18 16:45 | 只看該作者
lovezjf234 發表于 2021-6-18 16:29
按鍵沒有做防抖延遲處理,當你按下去的時候,你以為只按了一下,實際sec值不知道跑了多少下了,就4個按鍵, ...

確實沒有防抖延遲嘻嘻 謝謝老師
回復

使用道具 舉報

5#
ID:938708 發表于 2021-6-18 16:46 | 只看該作者
Haisi 發表于 2021-6-18 16:34
按鍵沒消抖,所以一直加了,你可以判斷按下松開再加

√明白了,我現在想修改那個按下增加的秒數卻改不了,代碼找不到了,請問大佬具體是哪些代碼控制按鍵增加或者減少秒數嗎
回復

使用道具 舉報

6#
ID:668693 發表于 2021-6-18 16:55 | 只看該作者
switch(KEY)
{
       case 0x0e:
                       keyval=1;
                       while(P3&0x0f==0x0e);
                       break;
}

需要把執行的操作放在按鍵松開之前,然后再去等待按鍵釋放
回復

使用道具 舉報

7#
ID:938708 發表于 2021-6-18 17:12 | 只看該作者
林神經 發表于 2021-6-18 16:55
switch(KEY)
{
       case 0x0e:

改了試了一下還是會抖動
回復

使用道具 舉報

8#
ID:844772 發表于 2021-6-18 17:28 | 只看該作者
看得很粗啊,我覺得不是防抖問題,是keyval沒有清零,所以只要按一次,就會一直累加,我覺得每次switch(keyval)之后,加上keyval=0;就會好了
回復

使用道具 舉報

9#
ID:81196 發表于 2021-6-18 17:48 | 只看該作者
稍微進行10ms的消抖動處理,即可解決
回復

使用道具 舉報

10#
ID:1036367 發表于 2022-6-22 13:01 | 只看該作者
這個代碼是全部了嘛
回復

使用道具 舉報

11#
ID:329625 發表于 2022-6-23 17:12 | 只看該作者
延時的話肯定會出問題,建議改成中斷模式
回復

使用道具 舉報

12#
ID:161164 發表于 2022-6-24 15:27 | 只看該作者
  1. void Delay1ms()                //@12.000MHz
  2. {
  3.         unsigned char i, j;

  4.         i = 2;
  5.         j = 239;
  6.         do
  7.         {
  8.                 while (--j);
  9.         } while (--i);
  10. }
  11. void getkey(void)
  12. {
  13.         static unsigned char DelayXD = 0;
  14.     keyval = 0xff;
  15.     KEY = P3 & 0x0f;
  16.     if(KEY != 0xf)
  17.     {
  18.                         Delay1ms();
  19.         if(DelayXD<0xFF)DelayXD++;
  20.                         if(DelayXD == 20)
  21.                         {
  22.                                 KEY = P3 & 0x0f;
  23.         if(KEY != 0x0f)
  24.         {
  25.             switch(KEY)
  26.             {
  27.             case 0x0e:
  28.                 while(P3 & 0x0f == 0x0e);
  29.                 keyval = 1;
  30.                 break;
  31.             case 0x0d:
  32.                 while(P3 & 0x0f == 0x0d);
  33.                 keyval = 2;
  34.                 break;
  35.             case 0x0b:
  36.                 while(P3 & 0x0f == 0x0b);
  37.                 keyval = 3;
  38.                 break;
  39.             case 0x07:
  40.                 while(P3 & 0x0f == 0x07);
  41.                 keyval = 4;
  42.                 break;
  43.             default:
  44.                 break;
  45.             }
  46.         }
  47.                         }
  48.         
  49.     }else
  50.                 {
  51.                         DelayXD = 0;
  52.                 }
  53. }
復制代碼


回復

使用道具 舉報

13#
ID:213173 發表于 2022-6-24 19:09 | 只看該作者
三歲而 發表于 2021-6-18 17:12
改了試了一下還是會抖動

給你改了,你試試。
測試程序 仿真.rar (87.48 KB, 下載次數: 12)

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 超碰8 | 日韩一级免费观看 | 欧美精品1区 | 国产日韩欧美在线观看 | 欧美精品片| 成人午夜高清 | 日韩精品在线看 | 亚洲第一在线 | 日韩在线小视频 | 91久久看片 | 在线伊人网 | 久久精品av麻豆的观看方式 | 国产福利在线视频 | 在线观看国产视频 | 日韩成人性视频 | 日本在线观看视频 | 久久久久国产一区二区三区 | 国产精品久久久久久 | 日本高清不卡视频 | 中文字幕一区二区三 | 狠狠狠| 日韩精品成人网 | 亚洲成人二区 | 国产精品视频久久久 | 欧美激情视频一区二区三区在线播放 | 久久精品一区 | 日韩日韩日韩日韩日韩日韩日韩 | 欧美一区二区三区在线视频 | 国产成人99久久亚洲综合精品 | 麻豆av在线 | 国产91精品久久久久久久网曝门 | 精品久久国产 | 欧美啊v在线观看 | 亚洲精品在线视频 | 日韩精品久久久久久 | 欧美日韩亚洲国产 | 欧美日韩国产在线观看 | 日韩精品一区二区三区视频播放 | 欧美成人激情 | 日本中文字幕在线观看 |