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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3137|回復: 12
收起左側

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

  [復制鏈接]
ID:938708 發表于 2021-6-18 15:44 | 顯示全部樓層 |閱讀模式
設計一樓道觸摸延時開關控制器,其功能是當人用手觸摸開關時,照明燈點亮,并持續一段時間后自動熄滅。開關的延時時間可設置并有顯示。
觸摸即是按鍵開關,程序出現了錯誤,為什么一次加就是加50s.數字太大會亂。
51hei圖片20210618154332.jpg

程序如下:

  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. }
復制代碼

回復

使用道具 舉報

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個按鍵, ...

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

使用道具 舉報

ID:938708 發表于 2021-6-18 16:46 | 顯示全部樓層
Haisi 發表于 2021-6-18 16:34
按鍵沒消抖,所以一直加了,你可以判斷按下松開再加

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

使用道具 舉報

ID:668693 發表于 2021-6-18 16:55 | 顯示全部樓層
switch(KEY)
{
       case 0x0e:
                       keyval=1;
                       while(P3&0x0f==0x0e);
                       break;
}

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

使用道具 舉報

ID:938708 發表于 2021-6-18 17:12 | 顯示全部樓層
林神經 發表于 2021-6-18 16:55
switch(KEY)
{
       case 0x0e:

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

使用道具 舉報

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

使用道具 舉報

ID:81196 發表于 2021-6-18 17:48 | 顯示全部樓層
稍微進行10ms的消抖動處理,即可解決
回復

使用道具 舉報

ID:1036367 發表于 2022-6-22 13:01 | 顯示全部樓層
這個代碼是全部了嘛
回復

使用道具 舉報

ID:329625 發表于 2022-6-23 17: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. }
復制代碼


回復

使用道具 舉報

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久激情视频 | 日日操av| 欧美日日 | 久久精品国产一区二区三区 | 久久毛片 | 中文字幕第一页在线 | 国产精品毛片一区二区三区 | 亚洲综合无码一区二区 | 精品欧美一区二区三区久久久小说 | 奇米影视在线 | 国产999精品久久久 日本视频一区二区三区 | 亚洲欧美日韩在线不卡 | 中文字幕电影在线观看 | 色综合视频 | 视频一区二区在线观看 | 国产精品色 | 中文字幕一区二区在线观看 | 涩涩视频网站在线观看 | 日日操操操| 成人免费小视频 | 国产成人精品免费视频大全最热 | 欧美日韩中文字幕在线 | 亚洲精品中文字幕 | 精品欧美黑人一区二区三区 | 日韩一区精品 | 欧美精品一区二区三区四区五区 | 久草网址| 久久久久香蕉视频 | a国产一区二区免费入口 | 午夜影院官网 | 国产高清视频在线播放 | 亚洲综合在线播放 | 日韩av电影在线观看 | 亚洲精品99999 | 精品国产一区二区国模嫣然 | 黄色亚洲网站 | 国产二区在线播放 | 久久久久亚洲精品 | 亚洲黄色国产 | 在线超碰 | 午夜天堂精品久久久久 |