新聞中心

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

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

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

        1.1 簡單延時子程序

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

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

        這種方法適合大概的延時,可以通過while或for循環實現。為方便后續研究,我用for循環方式。

        程序可以這樣寫:

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

        {

        uint x,y;

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

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

        }

        void main()

        {

        delay();

        }

        通過調試循環次數x,y值,改變延時間,最后達到滿意的數值為止。

        1.2帶參數的延時子程序

        #define uint unsigned int

        #define uchar unsigned char

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

        {

        uint x,y;

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

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

        }

        void main()

        {

        delay(k)//k為常數

        }

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

        1.3中斷程序

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

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

        附:80C51的中斷系統

        80C51的中斷系統有5個中斷源(見圖1)(8052有6個),2個優先級,可實現二級中斷嵌套。

        圖1

        圖2

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

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

        說明:

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

        當IT0=0時,為電平觸發方式。

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

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

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

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

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

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

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

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

        3中斷優先級寄存器IP:

        說明:

        80C51單片機有兩個中斷優先級,即可實現二級中斷服務嵌套。每個中斷源的中斷優先級都是由中斷優先級寄存器IP中的相應位的狀態來規定的。

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

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

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

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

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

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

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

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

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

        總結:

        中斷響應條件

        §中斷源有中斷請求;(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 //中斷函數time0()不需要聲明,數字1與優先級有關,如外部中斷0,應設置為0(interrupt 0)。

        {}

        void time1() interrupt 3

        {}

        1.4定時器和計數器

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

        1.41 與定時器/計數器有關的寄存器

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

        lTMOD:控制定時器的控制方式。可用下圖描述:

        說明:

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

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

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

        1.42定時器/計數器工作原理

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

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

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

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

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

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

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

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

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

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

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

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

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

        定時程序模塊:

        #include

        void main()

        {

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

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

        TH0=(65536-50000)/256;

        TL0=65536-50000)%256;

        EA=1;//開總中斷

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

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

        }



        關鍵詞: 程序模塊單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜阳县| 开江县| 乌拉特前旗| 焉耆| 宜黄县| 梧州市| 内乡县| 隆昌县| 襄城县| 天等县| 彰武县| 竹山县| 铁力市| 钟山县| 营山县| 天全县| 寿宁县| 岳阳县| 岳西县| 乌兰浩特市| 柳林县| 寿阳县| 曲麻莱县| 腾冲县| 大悟县| 乌什县| 兴业县| 盐山县| 永兴县| 广宗县| 五莲县| 太保市| 玉环县| 万盛区| 巩留县| 新民市| 肥西县| 林州市| 嘉祥县| 平度市| 漳平市|