国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> PIC單片機中斷程序設計技巧

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

關鍵字:PIC 單片機 中斷程序 設計技巧 作者: 來源: 發(fā)布時間:2019-07-31  瀏覽:6

所有的中檔系列PIC單片機,PORTB端口最高的4個引腳(RB7~RB4)在設為輸入模式時,當輸入電平由高到低或由低到高發(fā)生變化時,可以讓單片機產生中斷。這就是通常所說的引腳狀態(tài)變化中斷。

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

引腳中斷程序設計

在主程序里先設置有關的寄存器。

◇設置TRISB寄存器,使RB7~RB4相關的引腳處于輸入狀態(tài);

◇如果需要弱上拉,通過OPTION_REG的第7位設置;

◇RBIF=O;

◇RBIE=1;

◇GIF=1。

響應狀態(tài)變化后的中斷服務程序。

◇檢查RBIF是否為l,為l則是引腳變化引起的中斷;

◇調用延時程序,延時20~30 ms,目的是為了按鍵去抖;

◇判斷是引腳出現(xiàn)上升沿還是下降沿引起的中斷;

◇調用按鍵處理程序;

◇讀PORTB口的值,取消狀態(tài)變化的硬件信號;

◇清除RBIF標志。

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

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

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

else if((RBIE&RBlF)==1){ //如果引腳變化引起中斷

if(RB4==0){ //RB4上的按鈕接地

key=1; //按鍵標志位置位

}

RBIF=0; //清除引腳中斷標志位

}

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

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

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

unsigned char count;

if((ToIE&TOIF)==1){ //定時器中斷

TMRO+=0x09; //每250μs中斷一次

if(count==4){

count=0;

SYSlms=l; //系統(tǒng)時間標志

couot++;

}

T0IF=0; //清除時鐘中斷標志位

}

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

bit SYSTime;

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

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

void seaakey(){

unsigned char KeyTime,KeyTask;//定義任務時間參數(shù)、

//任務參數(shù)

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;

}

}

在主程序的死循環(huán)中這樣用:

while(1){

TimeEnable();

If(SYSTime==1){scankey();)

//在此可以添加其他程序

只有有時問消息的時候才執(zhí)行按鍵掃描程序?梢钥吹,進入掃描程序執(zhí)行第一次的時候,程序首先判斷按鍵標志位有沒有置位,置位的話(也就是有按鍵按下的話),任務時間參數(shù)(KeyTime)賦值為30,這是延時30ms,去抖,當然你也可以設置為其他的時間值;同時任務參數(shù) (KeyTask)加1。1ms后,再進入掃描程序,這個時候掃描程序執(zhí)行casel的語句,這樣30次后(延時了30ms),任務參數(shù)(KeyTask)加1,值為2。lms后,再進入掃描程序,將執(zhí)行case 2的語句,首先在這里再次判斷是不是按鍵還在按下,如果是就調按鍵的處理程序,如果不是。就退出按鍵掃描程序。在這里,還可以加入按鍵是否抬起的判斷程序。

這樣設計的引腳變化程序,CPU開銷小,效率高,不會出現(xiàn)堆淺溢出的問題,提高了系統(tǒng)的實時性。

編輯:admin  最后修改時間:2019-07-31

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

精品日韩av一区二区三区| 五月激情综合在线视频| 国产免费一区二区不卡| 麻豆tv传媒在线观看| 国产亚洲系列91精品| 国产精品一级香蕉一区| 黑丝国产精品一区二区| 九九九热视频最新在线| 亚洲精品美女三级完整版视频| 国产精品超碰在线观看| 欧美激情视频一区二区三区| 欧美国产日韩变态另类在线看 | 男人的天堂的视频东京热| 欧美人妻一区二区三区| 欧美乱视频一区二区三区| 欧美黑人暴力猛交精品| 日本免费一级黄色录像| 二区久久久国产av色| 男人和女人草逼免费视频| 台湾综合熟女一区二区| 日本美国三级黄色aa| 国产精品色热综合在线| 亚洲免费视频中文字幕在线观看 | 一区二区三区人妻在线| 丰满少妇被猛烈插入在线观看| 午夜福利国产精品不卡| 亚洲中文在线男人的天堂| 国产欧美亚洲精品自拍| 日韩欧美一区二区久久婷婷| 久久天堂夜夜一本婷婷| 殴美女美女大码性淫生活在线播放| 亚洲中文字幕在线观看黑人| 国产精品亚洲二区三区| 91在线播放在线播放观看| 色综合久久中文综合网| 欧美黄色黑人一区二区| 国产一区二区在线免费| 97人妻精品一区二区三区男同| 我要看日本黄色小视频| 欧美激情视频一区二区三区| 国产精品欧美日韩中文字幕|