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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機識別 "單擊.雙擊.長按"-我寫的代碼相信你能讀懂

  [復制鏈接]
跳轉到指定樓層
樓主
ID:858964 發(fā)表于 2024-11-17 12:22 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
//51單片機識別 "單擊.雙擊.長按" 代碼
//作者:Kxuan163
//程序功能:檢測按鈕的按下彈起次數(shù),以識別"單擊.雙擊.長按"
//MCU: STC89c52RC        晶振 11.0592MHZ
//Proteus8仿真通過;51開發(fā)板實驗通過。

#include<reg52.h>   
#include<stdlib.h>  
sbit button =P1^2;    //按鈕連接的單片機引腳
sbit LED1 =P2^7;             //單擊則LED1亮
sbit LED2 =P2^4;      //雙擊則LED2亮
sbit LED3 =P2^0;      //長按則LED3亮
unsigned char count;  //T0計數(shù)溢出中斷次數(shù)
unsigned char finish; //T0計時一輪結束標志
unsigned char read;   //讀取P1^2引腳電平的變量
unsigned char dn;     //讀得P1^2引腳低電平次數(shù)
unsigned char up;     //button彈起次數(shù)

//延時函數(shù),入口參數(shù)ms為延時的毫秒數(shù)/////
void delayms(unsigned int ms)
{         unsigned char i;
        while(ms--)
        { for(i = 0; i < 120; i++); }                                       
} //////////////////////////////////////

//主函數(shù)
void main(void)         
{
  //T0 初始化 //////////////////////////
         TMOD=0x01;              //使用定時器T0的模式1
    TH0=(65536-46083)/256;  //定時器T0的高8位設置初值
    TL0=(65536-46083)%256;  //定時器T0的低8位設置初值
    EA=1;                   //開總中斷
    ET0=1;                  //T0中斷允許
  //////////////////////////////////////

  while(1)
   {
    LED1 =1; LED2=1; LED3=1;
    dn =0; up=0; count =0; finish =0;

    TR0=1;              //啟動T0計時
    while(finish !=1 )  //在設定的T0計時段內循環(huán)檢測
     {
      read =button;            //讀取P1^2引腳電平
          if (read == 0) delayms(10); //延時10毫秒消熱抖動         

          if (button == 0)
            {dn ++; read =button;} //讀得P1^2低電平次數(shù)累加

          if (read ==0 && button ==1) up ++;//彈起次數(shù)累加
         } //end of while(finish !=1 )

    // T0計時一輪結束,進行識別:
        TR0 =0;
    if (dn >=1 && up ==1 )       //彈起1次,即單擊               
              { LED1 =0; delayms(1000);} //LED1亮

    if (dn >=2 && up ==2 )            //彈起2次,即雙擊               
       { LED2=0; delayms(1000);}  //LED2亮

        if (dn>=20 && up==0 )        //持續(xù)未彈起,即長按     
              { LED3=0; delayms(1000);}  //LED3亮         
         
   } //end of while(1)
} //end of main()  


//函數(shù):定時器T0的中斷服務 ////////////////
void Time0(void ) interrupt 1 using 1
  {
    count++;            //T0計數(shù)溢出中斷次數(shù)累加
    if(count==20)  //若T0計數(shù)溢出次數(shù)累計達設定值
          {count =0; finish =1;} //一輪計時結束                          

         TH0=(65536-46083)/256;  
        TL0=(65536-46083)%256;  
  } ///////////////////////////////////////





評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:161164 發(fā)表于 2024-11-17 22:13 | 只看該作者
看到while+delayms就知道不用看懂也可以
回復

使用道具 舉報

板凳
ID:858964 發(fā)表于 2024-11-17 23:50 | 只看該作者
lkc8210 發(fā)表于 2024-11-17 22:13
看到while+delayms就知道不用看懂也可以

謝謝跟帖!
我嘗試過用此算法,將代碼略加修改即可識別三擊...
回復

使用道具 舉報

地板
ID:353115 發(fā)表于 2024-11-18 11:45 | 只看該作者
回復

使用道具 舉報

5#
ID:961114 發(fā)表于 2024-11-19 08:51 | 只看該作者
你用AI8051U的 支持USB下載  兼容89C52的  
回復

使用道具 舉報

6#
ID:858964 發(fā)表于 2024-11-19 11:39 | 只看該作者
STC莊偉 發(fā)表于 2024-11-19 08:51
你用AI8051U的 支持USB下載  兼容89C52的

謝謝莊偉先生建議,我亦正有此意。
回復

使用道具 舉報

7#
ID:1123636 發(fā)表于 2024-11-19 16:52 | 只看該作者
你這個delay10ms不要這樣寫,你1ms近義詞中斷,20ms掃描一次就已經(jīng)消抖了,
回復

使用道具 舉報

8#
ID:858964 發(fā)表于 2024-11-20 10:49 | 只看該作者
發(fā)表于 2024-11-19 16:52
你這個delay10ms不要這樣寫,你1ms近義詞中斷,20ms掃描一次就已經(jīng)消抖了,

delayms(10); //延時10毫秒消熱抖動   ------這行代碼無問題。有 書為依據(jù)
回復

使用道具 舉報

9#
ID:185461 發(fā)表于 2024-11-20 21:16 | 只看該作者
你都用定時器,還搞個delay 帶壞小朋友
回復

使用道具 舉報

10#
ID:858964 發(fā)表于 2024-11-21 11:59 | 只看該作者
發(fā)表于 2024-11-20 21:16
你都用定時器,還搞個delay

定時器中斷方式計時, delayms()軟件方式計時,  各有各的用途。你未完全讀懂。
回復

使用道具 舉報

11#
ID:143767 發(fā)表于 2024-11-21 17:22 | 只看該作者
有時候按兩次還是LED1亮,程序修改哪里才能避免這種情況發(fā)生
回復

使用道具 舉報

12#
ID:858964 發(fā)表于 2024-11-22 12:15 | 只看該作者
dj3365191 發(fā)表于 2024-11-21 17:22
有時候按兩次還是LED1亮,程序修改哪里才能避免這種情況發(fā)生

你是用proteus仿真嗎?  晶振是否 11.0592MHZ?
我剛剛為解答你的問題,試修改代碼,再次仿真成功。
原代碼   if (read == 0) delayms(10);  //延時10毫秒消熱抖動
修改為   if (read == 0) delayms(5);    //延時 5毫秒消熱抖動
回復

使用道具 舉報

13#
ID:1110944 發(fā)表于 2025-4-2 01:10 | 只看該作者
程序功能:檢測按鈕的按下彈起次數(shù),以識別"單擊.雙擊.長按"。。學習了
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 欧美国产精品 | 日日操夜夜操视频 | 亚洲综合国产 | 国产极品车模吞精高潮呻吟 | 91在线看网站| 免费观看一级特黄欧美大片 | 日韩av中文 | 欧美精品欧美精品系列 | 欧美 日韩 国产 在线 | 一级片网站视频 | 国产免费又黄又爽又刺激蜜月al | 亚洲欧美久久 | 中文字字幕在线中文乱码范文 | 视频一区二区中文字幕 | 狠狠色狠狠色综合系列 | 日本精品一区 | 97国产精品视频 | 91免费福利视频 | 国产特黄一级 | 亚洲在线久久 | 日韩精品视频中文字幕 | 久久久久久亚洲 | 一级做受毛片免费大片 | 中文av在线播放 | 欧美综合一区二区三区 | 成人在线观看免费 | 成人高清在线 | 日韩小视频在线 | 99精品一区二区三区 | 午夜色婷婷 | 福利视频一区二区 | 久久只有精品 | 久久99精品视频 | 国产黄色大片网站 | 一级片视频免费 | 亚洲一区欧美 | 亚洲精品美女在线观看 | 丁香婷婷久久久综合精品国产 | 国产精品第2页 | 91精品国产91久久久久久丝袜 |