<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          定時(shí)器中斷程序編寫

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318604.htm

          1.中斷服務(wù)程序的寫法

          C51的中斷函數(shù)格式如下:

          void 函數(shù)名() 中斷號(hào) using 工作組

          {

          中斷服務(wù)程序內(nèi)容

          }

          與一般的C語(yǔ)言程序相比,中斷服務(wù)程序有一下特點(diǎn)

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

          圖1.51單片機(jī)中的中斷源
          此序號(hào)是編譯器識(shí)別不同中斷的唯一符號(hào),在程序編寫中定要寫正確。
          • “using 工作組”是指這個(gè)中斷函數(shù)使用單片機(jī)內(nèi)存中4組工作寄存器中的哪一組,C51編譯器在編譯程序時(shí)會(huì)自動(dòng)分配工作組,因此這句話經(jīng)常被省略不寫。

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

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

          圖2.閃爍的流水燈

          3.程序分析

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

          4.總結(jié)

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


          關(guān)鍵詞: 定時(shí)器中斷程

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();