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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 第一部分 常用的幾個程序模塊

          第一部分 常用的幾個程序模塊

          作者: 時間:2016-11-17 來源:網(wǎng)絡 收藏
          在做單片機的控制程序開發(fā)中,有一些程序段是很通用的、可以移植的??刂品澍Q器蜂鳴時間所應用的延時程序,在流水燈或數(shù)碼管的中也可以應用;中斷系統(tǒng)程序,也很常用。我們就稱這些程序段叫功能模塊。對于編程人員,模塊的概念應該是很清楚的,把可移植的程序塊制定成模塊,以后就可以直接應用,既省時間也省精力。下面就是一些常見的標準模塊可直接應用。

          1.1 簡單延時子程序

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

          在做單片機控制時,經(jīng)常要遇到到延時的問題。比如要讓蜂鳴器響1s,然后停1s,然后再響1s,反復下去。這個例子,要求延時的時間已經(jīng)很準確了(1s),一般情況下,如果要求延時的時間不需要很精確,那么可以寫一個簡單的延時程序,然后通過調試,最后達到延時的目的。

          這種方法適合大概的延時,可以通過while或for循環(huán)實現(xiàn)。為方便后續(xù)研究,我用for循環(huán)方式。

          程序可以這樣寫:

          #include
          #define uint unsigned int
          #define uchar unsigned char //宏定義
          void delay()//延時函數(shù)

          {

          uint x,y;

          for(x=100;x>0;x--)

          for(y=5000;y>0;y--);

          }

          void main()

          {

          delay();

          }

          通過調試循環(huán)次數(shù)x,y值,改變延時間,最后達到滿意的數(shù)值為止。

          1.2帶參數(shù)的延時子程序

          #define uint unsigned int

          #define uchar unsigned char

          void delay(uint z)//延時函數(shù)

          {

          uint x,y;

          for(x=100;x>0;x--)

          for(y=z;y>0;y--);

          }

          void main()

          {

          delay(k)//k為常數(shù)

          }

          在主函數(shù)main中調整常數(shù)k,方可達到延時目的。

          1.3中斷程序

          中斷:CPU在處理某一事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。

          理解上述中斷的定義,有兩點需要注意:1,中斷程序執(zhí)行完,又返回中斷前的地方(斷點)接著執(zhí)行程序;2,中斷的函數(shù)不需要聲明,且該函數(shù)放在main函數(shù)的外面(附中斷程序)。

          附:80C51的中斷系統(tǒng)

          80C51的中斷系統(tǒng)有5個中斷源(見圖1)(8052有6個),2個優(yōu)先級,可實現(xiàn)二級中斷嵌套。

          圖1

          圖2

          說明:圖1,外部中斷上的橫線表示低電平有效。

          1中斷請求標志寄存器TCON:

          說明:

          IT0(TCON.0),外部中斷0觸發(fā)方式控制位。

          當IT0=0時,為電平觸發(fā)方式。

          當IT0=1時,為邊沿觸發(fā)方式(下降沿有效)。

          IE0(TCON.1),外部中斷0中斷請求標志位。

          IT1(TCON.2),外部中斷1觸發(fā)方式控制位。

          IE1(TCON.3),外部中斷1中斷請求標志位。

          TF0(TCON.5),定時/計數(shù)器T0溢出中斷請求標志位。(硬件控制)

          TF1(TCON.7),定時/計數(shù)器T1溢出中斷請求標志位。(硬件控制)

          注意:低四位用于控制外部中斷,高四位用于控制和申請定時/計數(shù)器中斷;TF0、TF1由硬件自動控制;TR0(TR1)為1時,定時器0(1)啟動,反之停止(軟件控制)。可直接進行位操作。

          2中斷標志寄存器IE:為1,中斷允許。(可進行位操作)

          3中斷優(yōu)先級寄存器IP:

          說明:

          80C51單片機有兩個中斷優(yōu)先級,即可實現(xiàn)二級中斷服務嵌套。每個中斷源的中斷優(yōu)先級都是由中斷優(yōu)先級寄存器IP中的相應位的狀態(tài)來規(guī)定的。

          §PX0(IP.0),外部中斷0優(yōu)先級設定位;

          §PT0(IP.1),定時/計數(shù)器T0優(yōu)先級設定位;

          §PX1(IP.2),外部中斷0優(yōu)先級設定位;

          §PT1(IP.3),定時/計數(shù)器T1優(yōu)先級設定位;

          §PS(IP.4),串行口優(yōu)先級設定位;

          §PT2(IP.5),定時/計數(shù)器T2優(yōu)先級設定位。

          §CPU同時接收到幾個中斷時,首先響應優(yōu)先級別最高的中斷請求。

          §正在進行的中斷過程不能被新的同級或低優(yōu)先級的中斷請求所中斷。

          §正在進行的低優(yōu)先級中斷服務,能被高優(yōu)先級中斷請求所中斷。

          總結:

          中斷響應條件

          §中斷源有中斷請求;(TCON)

          §此中斷源的中斷允許位為1;(IE)

          §CPU開中斷(即EA=1)。(EA)

          以上三條同時滿足時,CPU才有可能響應中斷。

          中斷子程序(定時器0(1)中斷響應):

          void main()

          {

          EA=1;//開CPU中斷

          ET0=1;//開定時器0(中斷允許)

          ET1=1;

          TR0=1;//啟動定時器0

          TR1=1;

          }

          void time0() interrupt 1 //中斷函數(shù)time0()不需要聲明,數(shù)字1與優(yōu)先級有關,如外部中斷0,應設置為0(interrupt 0)。

          {}

          void time1() interrupt 3

          {}

          1.4定時器和計數(shù)器

          前面已經(jīng)介紹了延時,但是那種方法延時的時間做不到很精確,今天介紹一種精確的方法,就是定時器/計數(shù)器。

          1.41 與定時器/計數(shù)器有關的寄存器

          lTCON:前面已經(jīng)介紹過,它主要是控制啟動和申請中斷。

          lTMOD:控制定時器的控制方式??捎孟聢D描述:

          說明:

          l高四位與T1操作有關,低四位與T0操作有關;

          lM1MO為工作方式設置位。一般工作在方式1下,此時M1MO=01;

          l在GATE=0時,需用軟件使TCON中的位TRO(TR1)置1,啟動定時器。C/T0=0為定時模式,C/T0=1為計數(shù)模式;

          1.42定時器/計數(shù)器工作原理

          定時/計數(shù)器的實質是加1計數(shù)器(16位),由高8位THO(1)和低8位TL(1)兩個寄存器組成。加1計數(shù)器輸入的計數(shù)脈沖有兩個來源,一個是由系統(tǒng)的時鐘振蕩器輸出脈沖經(jīng)12分頻后送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計數(shù)器加1,當加到計數(shù)器為全1時,再輸入一個脈沖就使計數(shù)器回零,且計數(shù)器的溢出使TCON中TF0或TF1置1,向CPU發(fā)出中斷請求(定時/計數(shù)器中斷允許時)。如果定時/計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿。

          可見,由溢出時計數(shù)器的值(注:16位全填滿1時,數(shù)值剛好是65535。而溢出時計數(shù)器的值應該是65535+1=65536,即216)減去計數(shù)初值才是加1計數(shù)器的計數(shù)值。

          從上面可以得到兩個結論:

          l計數(shù)位數(shù)是16位:高8位THO(1)和低8位TL(1);

          l計數(shù)參數(shù)(添入TH和TL)與計數(shù)初值的關系:X=216-N;//假設定時時間是50ms,即N=50000;則計數(shù)參數(shù)=65536-50000=15536。

          附:計算THO(1)和低8位TL(1)初值// 假設延時時間為50ms

          TH=(65536-50000)/256//求模

          TL=(65536-50000)%256//求余

          定時/計數(shù)器初始化程序應完成如下工作:

          l對TMOD賦值,以確定T0(1)的工作方式;

          l計算初值,并將其寫入TH、TL;

          l中斷方式時,則對IE賦值,開放中斷;

          l使TR0或TR1置位啟動定時/計數(shù)器定時或計數(shù)。

          定時程序模塊:

          #include

          void main()

          {

          TMOD=0x01;//定時器T0工作方式1

          //送初值,定時為50ms。

          TH0=(65536-50000)/256;

          TL0=65536-50000)%256;

          EA=1;//開總中斷

          ET0=1;//開定時器0中斷

          TRO=0;//啟動定時器0

          }



          關鍵詞: 程序模塊單片

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();