慎用51單片機中的RET指令

2020-12-17 電子產品世界

題目:已知有四個按鍵依次連接單片機中的P3口的0到3的IO口,有四個LED燈連接P1的0到3 IO口,寫一程序,滿足以下條件:當按下按一個按鍵,對應的LED會發亮,比如

按下P3.0的按鍵,連接P1.0的LED就發亮。y

本文引用地址:http://www.eepw.com.cn/article/201611/318611.htm

以下是我同學編寫的程序:

org 0000h
mov P1,#0ffh
loop:
jnb P3.0,led1;*
jnb P3.1,led2;*
jnb P3.2,led3;*
jnb P3.3,led4;*
ljmp loop
led1:
clr P1.0
ret
led2:
clr P1.1
ret
led3:
clr P1.2
ret
led4:
clr P1.3
ret
end

程序的意圖是,製造一個死循環,不斷檢查按鍵是否按下,如果按下,就令對應的燈亮。程序經過測試,能夠滿足題目的要求。

但是,問題出現在上面帶*號的那一部分代碼,程序意圖是想要當P3的某個位為0的時候,就調用LED燈的子程序,執行CLR P1.0語句,再返回到原來程序調用子程序的地方繼續執行代碼。

我對的子程序的理解是:在一個地方啟動一段代碼,當這段代碼運行完畢之後,就返回到原來的地方繼續運行剩下的代碼。

那麼CPU單片機是如何返回原來的地址的呢?

首先,當程序執行到A處進入子程序時,將A的下一個條指令(即PC+2所指的地方)壓入棧中,即將棧指針SP+1,PCL進棧,SP再加1,PCH進棧。

然後,把PC的值改為子程序代碼的入口。

子程序執行完畢之後,從棧中彈出原來的PC值,賦值給當前的PC寄存器。


最後,程序返回到原來調用子程序的地方的下一條指令繼續運行。

(詳細步驟請查看RET和ACALL,LCALL指令)

上面的代碼很明顯想調用一個子程序,但是51單片機中,只有ACALL和LCALL指令會在跳轉前講PC+2值壓棧,其他跳轉指令都不會。

代碼中使用了JNB作為跳轉指令,所以並沒有壓棧,但是當跳轉之後遇到RET,還是一如既往地彈棧,這樣,只有出,沒有進,會導致堆棧不平衡。

但為什麼這個程序依然有效呢?

這個因為SP初始指針指向了一個空白的單元(全是0),所以,當遇到RET後,把PC寄存器給初始化,程序由頭開始重新執行,陰差陽錯地滿足的題目的要求。

所以RET指令必須和ACALL和LCALL配套使用,才能組成為真正意義上的子程序


相關焦點

  • 談談51單片機延時子程序
    一、機器周期和指令周期1.機器周期是指單片機完成一個基本操作所花費的時間,一般使用微秒來計量單片機的運行速度,51 單片機的一個機器周期包括12 個時鐘振蕩周期,也就是說如果51 單片機採用12MHz 晶振,那麼執行一個機器周期就只需要1μs;如果採用的是6MHz 的晶振,那麼執行一個機器周期就需要2 μs。
  • 51單片機彙編指令的記憶方法
    1 指令操作數的有關符號MCS-51的尋址方式共有六種:立即數尋址、直接尋址、寄存器尋址、寄存器間址、變 址尋址、相對尋址。3 相似功能歸類法在MCS-51指令中,我們發現部分指令其操作碼不同,但功能相似,而操作數則完全一 樣。相似功能歸類法就是把具有這樣特點的指令放在一起記憶, 只要記住其中的一條,其餘的也就記住了。如加、減法的十二條指令,與、或、非的十八 條指令,現列舉如下。
  • 初學51單片機指令快速記憶法
    學習單片機,除了搞清單片機內部功能、存儲空間分配及I/O接口外,還應掌握其指令系統。MCS-51共有111條指令,現介紹我們總結出的快速記憶MCS-51指令的方法,供大家參考。  大家都知道,彙編語言指令由操作碼、操作數兩部分組成。
  • 51單片機位及位操作指令
    工業中有很多場合需要處理這類開關輸出,繼電器吸合,用字節來處理就顯示有些麻煩,所以在8051單片機中特意引入一個位處理機制。位尋址區在8051中,有一部份RAM和一部份SFR是具有位尋址功能的,也就是說這些RAM的每一個位都有自已的地址,可以直接用這個地址來對此進行操作。
  • 51單片機彙編語言:控制轉移指令有哪些?
    跳轉指令短跳指令 AJMP addr11 PC←addr11,跳轉範圍2k長跳指令 LJMP addr16 PC←addr16,跳轉範圍64k
  • 從零開始51單片機教程 —— 13 單片機邏輯運算類指令
    對單片機的累加器A的邏輯操作:CLR A ;將A中的值清0,單周期單字節指令,與MOV A,#00H效果相同。CPL A ;將A中的值按位取反RL A ;將A中的值邏輯左移RLC A ;將A中的值加上進位位進行邏輯左移RR A ;將A中的值進行邏輯右移RRC A ;將A中的值加上進位位進行邏輯右移SWAP A ;將A中的值高、低4位交換。
  • 51單片機邏輯運算類指令
    對累加器A的邏輯操作:CLR A ;將A中的值清0,單周期單字節指令,與MOV A,#00H效果相同。CPL A ;將A中的值按位取反RL A ;將A中的值邏輯左移RLC A ;將A中的值加上進位位進行邏輯左移RR A ;將A中的值進行邏輯右移RRC A ;將A中的值加上進位位進行邏輯右移SWAP A ;將A中的值高、低4位交換。
  • 51單片機彙編語言:位操作指令有哪些?
    數據位傳送指令MOVC,bit;bit可直接尋址位C←(bit)>MOVbit,C;C進位位(bit)←C位變量修改指令CLRC;將C=0CLRbit
  • 單片機的指令和尋址方式
    單片機的品種很多,設計時怎樣表示操作碼和操作數,都有各自的規定,再有指令代碼也各不相同,因此,必須對所選單片機的全部指令,也就是所謂「指令系統」,有足夠的了解。各個系列的單片機雖然有不同的指令系統,但也有其共同性。掌握一種單片機的指令系統,對其它系列單片機可以起到觸類旁通的作用。
  • 51單片機教程
    51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。51單片機視頻教程--如何學好51單片機  如果已經會C語言,那如單片機入門真的很輕鬆。知識上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。
  • 8051單片機模塊化編程技巧
    而在彙編語言中,源程序中只有程序和子程序。那麼我們能否以子程序為基本單位,用一個子程序實現一種功能來做到模塊化編程呢?實踐證明是可行的。但在編製程序中不要忘記彙編語言的特點,注意子程序之間對單片機資源的使用,避免不同子程序交叉共用同一資源引起程序的錯誤執行。子程序嵌套調用的級數等。本文以「60秒倒計時電路」為例談一談51 單片機彙編語言模塊化編程的一點技巧。
  • 51單片機教程:單片機邏輯運算類指令
    對單片機的累加器A的邏輯操作:本文引用地址:http://www.eepw.com.cn/article/171291.htmCLR A ;將A中的值清0,
  • 淺談STM32和51單片機之間的區別
    單片微型計算機簡稱單片機,簡單來說就是集CPU(運算、控制)、RAM(數據存儲-內存)、ROM(程序存儲)、輸入輸出設備(串口、並口等)和中斷系統處於同一晶片的器件,在我們自己的個人電腦中,CPU、RAM、ROM、I/O這些都是單獨的晶片,然後這些晶片被安裝在一個主板上,這樣就構成了我們的PC主板,進而組裝成電腦,而單片機只是將這所有的集中在了一個晶片上而已。
  • 51單片機的尋址方式
    這裡也特別說明一下:在80C51單片機的指令系統中,僅有一條指令的操作數是16位的立即數,其功能是向地址指針DPTR傳送16位的地址,即把立即數的高8位送入DPH,低8位送入DPL。二、直接尋址指令中直接給出操作數的地址。
  • 跟電師傅學單片機(19):單片機控制轉移指令圖文講解3
    就是要把延時程序存放到程序存儲器ROM單元中,只要知道存放的地址,用這個指令ALL addr11就可轉去運行這個延時程序,運行完後還能返回。addr11:調用程序的範圍:2的11次方=2KALL addr11絕對調用指令最大的特點:調用了還能回來。
  • MCS-51單片機的結構和工作原理
    3.1.1 MCS-51單片機系列:兩大系列:MCS-51子系列和MCS-52子系列。其中51子系列是基本型,而52子系列屬於增強型。3.1.2 單片機晶片的半導體工藝:MCS-51系列單片機採用以下兩種半導體工藝生產:① HMOS     晶片型號中不帶有字母「C」的,功耗較大。② HCMOS  晶片型號中凡帶有字母「C」的,具有高速度、高密度、低功耗的特點。
  • 基於51單片機的電子音樂盒的課程設計
    結合Proteus和Keil軟體等,學習單片機產品的設計方法,有效地將理論和實際緊密結合,培養創新思維和設計能力,增強軟體編程實現能力和解決實際問題的能力。(3) 學習Proteus軟體,掌握Proteus中各種晶片的功能以及模擬。
  • 51單片機輕鬆入門與實踐 — 暢學單片機
    ,講解當前最熱門的51單片機的C程序設計!本課程打破了單片機教學的傳統模式,採取實例模塊製作的方法,從該模塊需用到的單片機理論知識,再加上該模塊用到的「器件介紹」環節,外圍電路設計講解部分以及要實現該模塊的軟體功能-編程詳解,巧妙地將單片機原理與應用、外圍電路設計、單片機C語言編程的知識點融入各個模塊項目中,不僅開闢了單片機應用的視野,又充實了對單片機從基礎到應用所需要的知識。
  • 跟電師傅學單片機(21):單片機位操作指令圖文講解(二)
    位運算指令表CY:單片機標誌寄存器PSW的最高位,是進位標誌位,CY也稱為位累加器,在指令中CY直接寫成C。如同累加器A,都在單片機編程指令中使用頻率較高。Bit:位尋址區內的某一位的狀態。ANL為邏輯「與」指令:ANL C,bit;指令功能是將位累加器CY的內容與直接尋址位進行邏輯「與」操作,並將結果送回累加器CY中。ANL C,/bit;指令功能是將直接尋址位取反後再同位累加器CY的內容進行邏輯「與」操作,並將結果送回累加器CY中。
  • MCS-51單片機試題及答案
    10.若累加器A中的數據為01110010B,則PSW中的P=_________.  二、單項選擇題(在每小題的四個備選答案中,選出一個正確答案,並將正確答案的序號填在題幹的括號內。每小題1分,共10分)  1.MCS—51單片機的復位信號是( )有效。