微控制器考試壓軸題程式碼深度解讀---獻給正被微控制器QJ的你

weixin_34148340發表於2016-12-24
3810775-86b0c196c9c5de41.jpg
為何我的心口,隱隱作痛?因為,我要考微控制器

開篇語

在我複習的不可自拔的時候。突然想起,簡書的微控制器版塊~~好吧,根本就沒有這個版塊,但是我想寫點關於微控制器相關的東西,讓大家見識到這個生活中隱藏在我們各種各樣機器內的核心器件。也是很多點子物品的靈魂所在。當然,不是科普微控制器。其實,好吧,這就是我複習的時候寫一點筆記。。。下週三就考試了。我還是很慌的,所以把自己的一些思緒理清,正好簡書是個不錯的記筆記的好傢伙~~~嘿嘿嘿~~所以,就有了這個了。待會投稿都不知道投到哪兒去~。不過,如果你正在被微控制器苦苦折磨,最後一道大題想不清楚怎麼搞,那麼,我這篇筆記一定可以幫到你的。。

題目

3810775-cb7047eb67800740.jpg
這是我複習的第一套試卷的最後一題,難度槓槓滴
3810775-550cb3ef959a3353.jpg
這是第一題的題目配套的圖片,也是8051微控制器的一個擴充套件電路

接下來讓我逐條解讀,做好筆記~~

題目答案

       ORG 0000H
       AJMP MAIN
       ORG 000BH
       LJMP TIMER0
       ORG 0030H

一堆虛擬碼,還有無條件跳轉指令。為的,是在對的時間,遇到對的中斷,把它帶到對的地方,其中MAIN是主函式,屬於預備階段;TIMER0是中斷到來之後執行的中斷服務程式~


MAIN:  MOV SP,#60H     %初始化堆疊地址
       CLR RS1         
       CLR RS0
       MOV R0,#100   %由R0計數,一百次讀入兩個數值並且求平均
       MOV R1,#0     %記錄最小值是一百次中的第幾次
       MOV R4,#0FFH           %存入最小值的初值     
       MOV R5,#0           %最小值低位元組的地址記錄
       MOV TL0,#30H      %%
       MOV TH0,#0F8      %%
       MOV TMOD,#21H      %% 這個是定時器,由計數原理算出來的初值賦值,對了是定時方式一 16位定時器
       SETB ET0   %%
       SETB TR0     %%
       SETB EA        %% 開中斷控制位
       SJMP $         %預備工作完畢,等待中斷到來
TIMER0:PUSH ACC     %%
       PUSH PSW        %%
       PUSH DPH        %%
       PUSH DPL       %%保護現場
       CLR RS0     
       CLR RS1
       MOV DPTR,#2000H      %%
       MOVX A,@DPTR       %% 讀入第一次讀數的其中一個數,地址是2000H 對應74LS245
       MOV R2,A     %把讀入的資料存入R2暫存器
       MOV DPTR,#4000H    %%
       MOVX A,@DPTR        %%讀入第二個資料
       ADD A,R2    %讀入的兩數相加
       RRC A      %%右移A ,等同於A/2  即為求均值
       MOV DPH,#10H    %% 
       MOV DPL,R1         %%將DPTR指標指向1000H 即6264中的一個地址
       MOVX @DPTR,A   %將第一次求得的均值存入6264指定地址
       MOV R3,A       %保留此次求得的均值,以便與下一次讀入的資料的均值進行比較
       CLR C         %清除Cy 為後面的計算做準備
       SUBB A,R4     %把第一次求得的均值與初始化的最小值(0FFH,這他麼其實是最大的,後面隨便來個數都會頂替掉的)進行比較(比較方式是使用借位減法,使用起對Cy的不同賦值來判定那一個數大)
       JC T0A         %如果一開始的數大(即Cy=1),那麼直接跳轉到T0A
       MOV R4,03H    %如果求得的均值大,那麼Cy=0,進行這一步,就是用R3(03H其實就是R3的地址)種儲存的本次求得的均值替代掉原來R4中儲存的最小值
       MOV R5,01H      %然後把R1(01H)中的地址賦給R5
T0A:   DEC R0     %上面不管是直接跳過來還是經過幾步再過來,反正都會過來,R0=R0-1 代表接受資料一次
       INC R1    % R1=R1+1 代表均值儲存地址變為下一個地址
       MOV A,R0       %取得求均值進行的次數
       JNZ T0EX        %判斷A是否等於0,等於0則直接往下走,不等於0就跳轉到T0EX
       MOV DPTR,#2000H    %執行到這兒就代表著A(也就是R0計數器為0了)等於0,執行了一百次,那麼,接下來就要輸出了,這一句的意思是把輸出地址定位為1#74LS373
       MOV A,R5     %由上面的中斷服務程式的最後,可以知道,R5是記錄最小值的低位元組地址,也就是R0的,只有在新求的均值小於上一步求出來的均值的時候,才把下一步的均值放到R5種儲存,這樣R5種儲存的永遠是最小值的地址,此時取出R5中的地址資料
       MOVX @DPTR,A   %輸出最小值低位元組地址資料      
       MOV DPTR,#6000H   %%
       MOV A,#10H       %% 
       MOVX @DPTR,A      %%將最小值高位元組地址輸出到2#74LS373
       MOV R0,#100         %%
       MOV R1,#0     %%
       MOV R4,#0FFH      %%再次對計數器,最小值,最小值低位元組地址,最小值進行初始化,準備下一步的執行
T0EX:  POP DPL   %%
       POP DPH     %%
       POP PSW     %%
       POP ACC     %%
       RETI        %%恢復現場,進入中斷前的主程式,也就是SJMP那一段的PC所指地址
       
3810775-5e89861568ff80c3.gif
絕望的怒吼

整整61行程式碼。而且我們的微控制器試卷還有兩個這種壓軸題,還有不少的小題和大題,當然比起這個不值一提。。絕望~~但還是要學習~!!!

3810775-f04997d016d43ce9.jpg
天絕地滅版的笑聲

不多廢話了。剛剛是學得累了。玩會電腦補充下戰鬥力,現在,繼續與微控制器鬥爭,看是誰QJ誰!!

3810775-fc585913b326dba4.jpg
戰場一角!!!!

相關文章