国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

PIC單片機引腳中斷程序的設計技巧

發布時間:2010-11-1 14:29    發布者:eetech
關鍵詞: PIC , 單片機 , 引腳 , 中斷程序
1 簡 述
   
所有的中檔系列PIC單片機,PORTB端口最高的4個引腳(RB7"RB4)在設為輸入模式時,當輸入電平由高到低或由低到高發生變化時,可以讓單片機產生中斷。這就是通常所說的引腳狀態變化中斷。

在設計引腳中斷程序時,有三個需要特別注意的地方。一是,在清除P0RTB中斷標志位RBIF之前,必須安排一條必不可少的,以PORTB端口數據寄存器PORTB為源寄存器的讀操作指令。放置這一指令的目的有時并不只是為了讀取有用的數據,而是為了取消狀態變化的硬件信號,以便順利清除RBIF標志位,為下一次中斷做好準備。二是,由于端口PORTB是引腳電子變化中斷,即無論引腳出現上升沿還是下降沿都會產生中斷請求,所以必須處理好不需要的虛假中斷。三是,一般都利用PIC單片機的引腳功能來檢測按鍵,所以必須處理好按鍵消抖的問題。
  
2 引腳中斷程序設計
   
在主程序里先設置有關的寄存器。

    ◇設置TRISB寄存器,使RB7"RB4相關的引腳處于輸入狀態;
    ◇如果需要弱上拉,通過OPTION_REG的第7位設置;
    ◇RBIF=O;
    ◇RBIE=1;
    ◇GIF=1。

響應狀態變化后的中斷服務程序。

    ◇檢查RBIF是否為l,為l則是引腳變化引起的中斷;
    ◇調用延時程序,延時20"30 ms,目的是為了按鍵去抖;
    ◇判斷是引腳出現上升沿還是下降沿引起的中斷;
    ◇調用按鍵處理程序;
    ◇讀PORTB口的值,取消狀態變化的硬件信號;
    ◇清除RBIF標志。

筆者認為上面程序設計最大的問題是在中斷程序里調用延時程序。大家知道,中檔PIC單片機只有8層深度的硬件堆棧,在中斷里調用于程序出現極易堆棧溢出的情況。另外,PIC單片機中斷程序人口只有一個,在響應中斷的請求時,PIC單片機就會自動把全局中斷的使能位(INTCON的第7位GIF)清除,這樣其他中斷就暫時不能被響應(此時,如果別的中斷發出的中斷請求,標志位將一直保留著),直到這個中斷程序退出后才會得到響應。這就要求我們設計中斷程序的時候必須盡量短,避免調用子程序,更不要在中斷里進行復雜的運算。

下面給出筆者設計程序時的思路。

當引腳狀態變化引起中斷時,在中斷子程序里首先判斷引起中斷的原因是不是我們需要的變化引起的中斷。如果是,不要在這里延時,而是設置一個標志位,接著清除中斷標志,退出中斷。中斷程序如下:

else if((RBIE%26;amp;RBlF)==1){ //如果引腳變化引起中斷
    if(RB4==0){ //RB4上的按鈕接地
    key=1; //按鍵標志位置位
    }
    RBIF=0; //清除引腳中斷標志位
    }

其中,if(RB4==0)語句相當于讀取了PORTB端口數據寄存器,取消了狀態變化的硬件信號。

下面詳細介紹怎么樣進行按鍵去抖。

首先,在定時器中斷里設置一個lms的時間基準標志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:

    unsigned char count;
    if((ToIE%26;amp;TOIF)==1){ //定時器中斷
    TMRO+=0x09; //每250μs中斷一次
    if(count==4){
    count=0;
    SYSlms=l; //系統時間標志
    couot++;
    }      
    T0IF=0; //清除時鐘中斷標志位
    }

有了這個時間基準,便可以在主程序里進行按鍵去抖處理了。為了更好地利用這個時間基準,定義一個消息標志SYSTime,筆者把它稱作時間消息。為了讓這個消息有自我發布和自我消失的功能.定義了如下一個宏:

    bit SYSTime;
    #defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)

可以把TimeEnable()放到主程序死循環的任何地方,每當程序執行這個宏,SYSTime就會清零,這就是標志位的自我消失.如果在定時器時間基準標志位SYSlms已經置位的話,SYSTime就會置1,這樣別的程序就可以利用這個時間消息了,這就是消息的自我發布。下面就是利用這個時間消息來進行按鍵延時去抖的,首先看一下按鍵掃描子程序;

    void seaakey(){
    unsigned char KeyTime,KeyTask;//定義任務時間參數、
    //任務參數
    switch(KeyTask){
    case0:if(key){
    KeyTime=30; //準備延時30 ms
    KeyTask++; //準備好下一個任務
    kcy=0;
    }
    break;
    case I:KeyTime--; //延時30 ms
    if(KeyTime==0)Key+ask++;
    break;
    case2;if(RB4==o){
    //調按鍵處理程序
    KeyTask=0;
    }
    else KeyTask=0;//退出任務
    break;
    }
}

在主程序的死循環中這樣用:

    while(1){
    TimeEnable();
    If(SYSTime==1){scankey();)
    //在此可以添加其他程序

只有有時問消息的時候才執行按鍵掃描程序?梢钥吹剑M入掃描程序執行第一次的時候,程序首先判斷按鍵標志位有沒有置位,置位的話(也就是有按鍵按下的話),任務時間參數(KeyTime)賦值為30,這是延時30ms,去抖,當然你也可以設置為其他的時間值;同時任務參數 (KeyTask)加1。1ms后,再進入掃描程序,這個時候掃描程序執行casel的語句,這樣30次后(延時了30ms),任務參數(KeyTask)加1,值為2。lms后,再進入掃描程序,將執行case 2的語句,首先在這里再次判斷是不是按鍵還在按下,如果是就調按鍵的處理程序,如果不是。就退出按鍵掃描程序。在這里,還可以加入按鍵是否抬起的判斷程序。
這樣設計的引腳變化程序,CPU開銷小,效率高,不會出現堆淺溢出的問題,提高了系統的實時性。
本文地址:http://m.qingdxww.cn/thread-35615-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲国产一区 | 最新国语自产精品视频在 | 97成人免费视频 | 亚洲日本一区二区 | 毛片黄在线看免费 | 亚洲国产精品激情在线观看 | 精品播放 | 亚洲 欧美 成人日韩 | 欧美一级视频在线 | 久久国产精品免费 | 久久99热这里只有精品国产 | www.av视频| 日本不卡视频网站 | 99久久精品费精品国产一区二 | 欧美亚洲综合另类在线观看 | 一级毛片在线播放 | 亚洲欧美日韩久久精品第一区 | 激情视频在线观看免费 | 国产精品自在线拍 | 成人免费看视频 | 中文字幕精品一区二区日本大胸 | 国产成人拍精品视频网 | 免费精品99久久国产综合精品 | 国产美女久久精品香蕉69 | 欧美3p大片在线观看完整版 | 亚洲成人影院在线 | 精品三级在线 | 国产玖玖玖精品视频 | 精品一区二区三区高清免费不卡 | 12至16末成年毛片高清 | 性生生活三级视频在线观看 | 欧美 日韩 中字 国产 | 香蕉网在线视频 | 四虎永久在线精品免费影视 | 国产99在线视频 | 亚洲成人免费在线观看 | hh99me福利毛片在线看 | 日本高清视频一区二区三区 | 欧美视频网站免费看 | 欧美影院一区二区三区 | 国产激情一级毛片久久久 |