久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11836|回復: 1
收起左側

51單片機匯編中斷程序(導引)

[復制鏈接]
ID:72008 發表于 2015-1-19 14:20 | 顯示全部樓層 |閱讀模式
本帖最后由 liuyy 于 2015-1-19 14:22 編輯

51單片機匯編程序入口后加的跳轉指令"LJMP"是為什么:
    要弄明白這個問題,你要對51單片機的中斷有一個初步的了解,我可以給你介紹一下。比方說你希望不管程序運行到哪里,只要你一按某個按鍵,就執行一段你預先寫好的程序,然后再回到原來的地方繼續。你按按鍵的動作可以視為單片機的一個I/O管腳電平由高到低(如果你把按鍵接在I/O和地之間)。在51單片機中,有兩個I/O可以實現這樣的功能(這就是外中斷,ORG 0003H LJMP INT0S 中的INT0S就是外中斷0,具體你可以查51單片機中斷系統的資料)。那它到底是怎樣實現的呢?比方說,某一時刻,你的按鍵按下了,處理器會知道滿足了外中斷的觸發條件,那它會執行哪一段程序呢?設計師人為地給它規定了一個固定的地址,如外中斷0被觸發時就是跳到地址為0003H的單元開始執行,別的中斷(定時器等)同理,都有一個固定的地址,一旦被觸發就會自動跳到那個地址,這就是中斷向量。那為什么是0003H而不是程序存儲器的末尾呢?這是因為不同51單片機的存儲器大小是不同的,如果中斷向量也因此而不同的話,單片機開發的麻煩就太多了。所以設計師干脆就把中斷向量放在開頭。單片機復位后是從0000H開始執行的,總不能讓它一開始就無緣無故中斷,所以要轉移到一個和中斷向量不相干的地方執行主程序。ORG 0 LJMP STAR(其實應該是START)就是這樣一個轉移指令,轉到標記為START的主程序處開始執行。一條LJMP指令的長度為3,這也就是第一個中斷向量為0003H的原因了(不浪費一絲空間,不得不佩服Intel設計師的高明)。ORG 0003H LJMP INT0S 為什么中斷向量處還要跳轉呢?這是因為中斷向量間的空間也很有限,只能完成一些最簡單的任務,稍微長一點的程序就需要放在更大的空間里,從中斷向量處跳轉到該處執行真正的中斷服務程序。有關中斷系統的具體內容,建議你還是看看相關資料,我只是把它的基本原理和你講了一下,真正使用還是請你自己探索。

下面是一個完整的51單片機中斷匯編程序的例子:
0.jpg
首先,介紹一下51單片機的定時計數器,51有兩個定時計數器,分別為T0,T1,基本一樣,

;有一點不同,下面我們介紹定時計數器T0

;了解8051的timer0中斷的程序寫法,用中斷法產生定時

;上面顯示的是proteus仿真圖,下面的是源程序

;說明:(源程序中的中斷入口地址很重要(這個是固定的),程序中斷時,會在對應中斷固定的

;入口地址進入,因為規定的相隔入口間的空進有限,只能用跳轉指令跳轉,最終用RETI強制返回

;這個程序把所有的中斷入口地址都寫上了,沒有用到的,用RETI直接屏蔽)

;運行結果是使led燈明一下,暗一下。



COUNT EQU  9217;對于11.0592的晶振來說,延時10ms

LED  EQU  P1.1





        ORG  0000H

        LJMP RESET       ;開始時跳轉轉到初始化程序中



        ORG  0003H       ;外部中斷0

        RETI



        ORG  000BH       ;定時器/計數器T0入口地址

        LJMP INT_TIMER0   ;跳轉到定時器/計數器中斷服務程序中去



        ORG  0013H      ;外部中斷1  

        RETI      



        ORG  001BH    ;定時器/計數器T1

        RETI



        ORG  0023H ;串行口中斷

        RETI



           ORG  0030H

RESET:

           MOV  R0,#00H

           DJNZ R0,$  ;剛開始,先進行少量的延時,是各種工作寄存器準備好

           CLR  LED





           MOV    TMOD,#00000001B   ;設置定時器T0工作在方式1(16位)



           MOV    TH0,#HIGH(65536-COUNT);設置初值(關于怎么計算,很多書上都有)

           MOV    TL0,#LOW(65536-COUNT)

           ;MOV  TH0,#(65536-COUNT)/256;取高八位數據(這是第二種方法)

           ;MOV  TL0,#255   ;取底五位(為最大了)



           CLR  TF0   ;先把溢出標志位清零

           SETB TR0   ;開始計時

           SETB EA    ;全局中斷打開

           SETB ET0   ;定時器/計數器T0溢出中斷打開



           MOV  R2,#00H  ;作為定時器累加器使用



LOOP:    SJMP LOOP   ;在此循環,等待中斷





INT_TIMER0:         ;當TF0=1,跳轉到下面的中斷服務程序中

        INC  R2          ;使R2自增一

        CLR  TF0       ;重新置中斷標志位為0

        MOV  TH0,#(65536-COUNT)/256  ; 重新符初值(因為溢出后變成0了)

        MOV  TL0,#255  

        CJNE R2,#5,RETURN     ;讓燈明暗相間50ms

        MOV  R2, #00H

        CPL  LED              ;讓燈明暗交替變化

RETURN:   

        RETI



        END



;程序寫完了(并不是很難,不過就是配置一下定時器,在中斷中寫點處理程序罷了

;),

回復

使用道具 舉報

ID:20672 發表于 2018-8-3 11:49 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久国产精品 | 999免费视频| 手机在线观看 | va在线| 精品福利一区二区三区 | 国产 欧美 日韩 一区 | 国产精品久久国产精品99 | 日韩一级免费看 | 涩涩片影院 | 7799精品视频天天看 | 亚洲高清网 | 亚洲午夜视频在线观看 | 亚洲精品二区 | 日韩视频免费在线 | 久久国产日韩欧美 | 色天堂影院| 成人中文字幕在线观看 | 国产精品中文字幕在线观看 | 你懂的在线视频播放 | 久久久久久亚洲国产精品 | 欧美日韩亚洲系列 | 国产精品高潮呻吟久久av黑人 | 欲色av| 丝袜久久 | 天天插天天操 | 亚洲精品精品 | 亚洲视频免费在线观看 | 欧美综合久久 | 亚洲精品九九 | 蜜桃臀av一区二区三区 | 在线一区二区三区 | 精品国产精品国产偷麻豆 | 瑟瑟激情| 鸡毛片| www.久久久 | 五月天国产视频 | 亚洲精品影院 | 中国一级大毛片 | 中文字幕精品一区久久久久 | 91色综合 | 亚洲精品一区二区冲田杏梨 |