新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 定時器中斷程序編寫

        定時器中斷程序編寫

        作者: 時間:2016-11-20 來源:網絡 收藏
        上篇筆記記錄到51單片機的中斷允許寄存器、定時器/計數器工作方式寄存器(TMOD)、定時器/計數器控制寄存器(TCON)各位的作用。這些寄存器都是用來為編寫定時器中斷程序編寫的初始化部分而服務的。然后今天再這里補填中斷函數的編寫格式,以后就可以編寫定時器中斷程序了。

        本文引用地址:http://www.104case.com/article/201611/318604.htm

        1.中斷服務程序的寫法

        C51的中斷函數格式如下:

        void 函數名() 中斷號 using 工作組

        {

        中斷服務程序內容

        }

        與一般的C語言程序相比,中斷服務程序有一下特點

        • 中斷函數不能返回任何值,所以函數名前用void;
        • 函數名隨便起,但不能與C51語言中的關鍵字同名(同C語言函數要求)
        • 中斷函數不能帶任何參數,故函數名后的括號內為空
        • 中斷號是指單片機中的幾個中斷源的序號,列表如下(紅方框內內容)

        圖1.51單片機中的中斷源
        此序號是編譯器識別不同中斷的唯一符號,在程序編寫中定要寫正確。
        • “using 工作組”是指這個中斷函數使用單片機內存中4組工作寄存器中的哪一組,C51編譯器在編譯程序時會自動分配工作組,因此這句話經常被省略不寫。

        2.定時器1中斷程序編寫

        #include #define uint unsigned int#define MANY_KEY_DELAY  1#define TOTAL_TIME_NUM  5#define ONE_SECOND      20uint num;uint num1;uint flag_key;//流水燈的第一列sbit led1 = P1^0;//第一個按鈕位sbit key = P3^1;//按鈕的接地端sbit h_key6 = P3^6;//函數申明void T1_end_AND_change_status();void delayms(uint xms);void init_timer();void data_init();void key_scan();void main(){//初始化數據變量data_init();//初始化T1定時器init_timer();while(1){//不斷檢測此按鈕是否被按下key_scan();//檢測一個大周期定時是否完成//使按下按鈕后相應的位發生電平反轉T1_end_AND_change_status();}}//自定義函數:數據初始化void data_init(){num        = 1;num1       = 1;flag_key   = 0;h_key6     = 0;   }//自定義函數:初始化TMOD、TCON、中斷寄存器,并裝入計數初值void init_timer(){//選中定時器1TMOD    = 0x10;//定時器1的初值TH1     = (65536 - 45872) / 256;TL1     = (65536 - 45872) % 256;//開總中斷,     //定時器1中斷EA         = 1;ET1        = 1;}//自定義函數:延遲xms msvoid delayms(uint xms){uint i, j;for(i = xms; i > 0; i--)for(j = 110; j > 0; j--);}//自定義函數:檢測哪一個按鍵被按下void key_scan(){if(key == 0){//<1>.待按鈕被按下后的穩定狀態delayms(10);//<2>.操作://開啟定時器,由T1時間到達關閉T1定時器TR1 = 1;//記住按鈕已被按下flag_key    = 1;//點亮響應的流水燈led1        = 0;//<3>.等待按鍵的釋放while(!key);    }      }void T1_end_AND_change_status(){//T1計時完成if(num >= TOTAL_TIME_NUM * ONE_SECOND){num     = 0;//檢測有哪些按鈕被按下,結束其高低電平的轉換if(flag_key){flag_key       = 0;//按鈕信號以低電平結束led1    = 1;//一旦檢測到總的計時時間到則關閉定時功能//當有任何按鈕再次被按下時,T1定時器再被開啟//需要在按鈕被按下的前提下設置此語句,防止沒有任何按鈕按下時到達定時器時間設置TR1     = 0;}}//按鈕的電平反轉if(num1 >= MANY_KEY_DELAY * ONE_SECOND){num1    = 0;if(flag_key){led1    = ~led1;}}}//中斷函數編寫void T1_time() interrupt 3{TH1        = (65536 - 45872) / 256;TL1        = (65536 - 45872) % 256; num++;num1++;    }

        此源程序經編譯鏈接生成可執行文件后,下載到單片機中,按下key對應的按鍵時,流水燈1就會以1s的高低電平交換顯示。照片一張作為紀念:

        圖2.閃爍的流水燈

        3.程序分析

        程序從main函數出開始運行。自在main函數中對個寄存器初始化后,待按鍵按下(TR1=1)時,定時器1開始從當前值開始計時,當計數計滿溢出時,TCON的TF1向CPU申請中斷從而進入中斷函數內執行中斷函數內的語句,當把中斷函數內的語句執行完畢后,再返回到main函數開始中斷處。當在中斷函數中重新給定時器賦新值后(若不賦新值,則從0開始計),則將又會過與原來一樣長的時間后發生中斷。
        此程序的中斷周期是50ms(晶振頻率為11.0592)。此程序隨時等待按鈕被按下,只有按鈕被按下時才開始計時,中斷程序才會生效。定時器被啟動后,將會以50ms的周期進行中斷產生,當計滿1s時,流水燈的狀態反轉一次。當計滿5s后定時器再次被關閉。程序重新等待按鈕被按下。

        4.總結

        使用定時器中斷的方式可以得到以高低電平反轉的方波。在現實生活中我們可以用這種方波做很多事情,如紅外遙控器就是采用的此種原理對不同按鈕進行編碼,經發射電路將此方波發射出去,再由相應的接收電路接受此方波,然后對其進行解碼,得到原信號進而可以判斷此信號是想要做出什么樣的操作。
        當然,使用單片機編寫程序不再是單純的寫代碼,還需要會閱讀各種電路圖和電器件的特性。


        關鍵詞: 定時器中斷程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 铜川市| 新乡县| 巴里| 禹州市| 永新县| 年辖:市辖区| 台湾省| 镇江市| 台北县| 余江县| 祁东县| 长垣县| 和静县| 耒阳市| 白朗县| 福海县| 西林县| 宾阳县| 乌兰浩特市| 淳化县| 大城县| 阿巴嘎旗| 桐乡市| 尚志市| 利辛县| 库车县| 盐边县| 临西县| 延津县| 鞍山市| 富裕县| 留坝县| 潍坊市| 西青区| 慈利县| 翁牛特旗| 嘉黎县| 肇源县| 卫辉市| 庄浪县| 吕梁市|