機械設計.ppt_第1頁
機械設計.ppt_第2頁
機械設計.ppt_第3頁
機械設計.ppt_第4頁
機械設計.ppt_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章 mcs-51匯編語言程序設計,4.1 匯編語言程序設計概述 4.1.1 機器語言、匯編語言和高級語言 用于程序設計的語言基本上分為3種:機器語言、匯編語言和高級語言。 1.機器語言 二進制代碼表示的指令、數字和符號簡稱為機器語言 不易懂,難記憶,易出錯。,2匯編語言 英文助記符表示的指令稱為符號語言或匯編語言 匯編語言特點: 面向機器的語言,程序設計員須對mcs-51的硬件有相當深入的了解。 助記符指令和機器指令一一對應,用匯編語言編寫的程序效率高,占用存儲空間小,運行速度快,用匯編語言能編寫出最優(yōu)化的程序。,能直接管理和控制硬件設備(功能部件),它能處理中斷,也能直接訪問存儲器及i/o接口電路。 匯編語言和機器語言都脫離不開具體機器的硬件,均是面向“機器”的語言,缺乏通用性。 3高級語言 不受具體機器的限制,使用了許多數學公式和數學計算上的習慣用語,非常擅長于科學計算。常用的如basic、fortran以及c語言等。 高級語言優(yōu)點:通用性強,直觀、易懂、易學,可讀性好。 使用c語言(c51)、pl/m語言來進行mcs-51的應用程序設計。 對于程序的空間和時間要求很高的場合,匯編語言仍是必不可缺的。,c語言和匯編語言混合編程 在很多需要直接控制硬件的應用場合,則更是非用匯編語言不可 使用匯編語言編程,是單片機程序設計的基本功之一 4.1.2 匯編語言語句的種類和格式 兩種基本類型:指令語句和偽指令語句 (1)指令語句 已在第3章介紹 每一條指令語句在匯編時都產生一個指令代碼機器代碼 (2)偽指令語句 是為匯編服務的。在匯編時沒有機器代碼與之對應。,mcs-51的匯編語言的四分段格式如下: 標號字段 操作碼字段 操作數字段 注釋字段 例4-1 下面是一段匯編語言程序的四分段書寫格式 基本語法規(guī)則: 1標號字段 是語句所在地址的標志符號 標號字段 操作碼字段 操作數字段 注釋字段 start: mov a,#00h ;0a mov r1,#10 ;10r1 mov r2,#00000011b ;3r2 loop:add a,r2 ;(a)+(r2)a djnz r1,loop;r1內容減1不 為零,則循環(huán) nop here: sjmp here,2美元符號$的使用 用于表示該轉移指令操作碼所在的地址。例如,如下指令: jnb f0, $ 與如下指令是等價的: here:jnb f0,here 再如: here:sjmp here 可寫為: sjmp $,4.2 匯編語言源程序的匯編 匯編語言源程序 “翻譯”成機器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機器匯編兩類: 4.2.1 手工匯編 人工查表翻譯指令。但遇到的相對轉移指令的偏移量的計算,要根據轉移的目標地址計算偏移量,不但麻煩,且容易出錯。 4.2.2 機器匯編 用編輯軟件進行源程序的編輯。編輯完成后,生成一個ascii碼文件,擴展名為“.asm”。然后在微計算機上運行匯編程序,把匯編語言源程序翻譯成機器代碼。,4.3 匯編語言實用程序設計 4.3.3 查表程序設計 數據補償、修正、計算、轉換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點。 查表就是根據自變量x,在表格中尋找y,使y=f(x)。 執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖/psen。在mcs-51的指令系統(tǒng)中,給用戶提供了兩條極為有用的查表指令: movc a,a+dptr movc a,a+pc 指令“movc a,a+dptr”完成把a中的內容作為一個無符號數與dptr中的內容相加,所得結果為某一程序,。 指令執(zhí)行完,pc的內容不發(fā)生變化,仍指向查表指令的下一條指令。 優(yōu)點在于預處理較少且不影響其它特殊功能寄存器的值,所以不必保護其它特殊功能寄存器的原先值。 缺點在于該表格只能存放在這條指令的地址x3x2x1x0以下的00ffh之中。表格所在的程序空間受到了限制。,例4-1 子程序的功能為:根據累加器a中的數x(09之間)查x的平方表y,根據x的值查出相應的平方y(tǒng)。x和y均為單字節(jié)數。 地 址 子程序 y3y2y1y0 add a,#01h y3y2y1y0+2 movc a,a+pc y3y2y1y0+3 ret y3y2y1y0+4 db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 第1條指令 add a,#01h 的作用是加上偏移量,可以根據a的內容查出x對應的平方。,movc a,a+dptr 這條指令的應用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令時不必計算偏移量,使用該指令的優(yōu)點是表格可以設在64k程序存儲器空間內的任何地方,而不像 movc a,a+pc那樣只設在pc下面的256個單元中,使用較方便。 上面的程序可改成如下形式:,push dph ;保存dph push dpl ;保存dpl mov dptr,#tab1 movc a,a+dptr pop dpl ;恢復dpl pop dph ;恢復dph ret tab1: db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 例4-2 在一個以mcs-51為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關系,傳感器輸出的電壓已由a/d轉換為10位二進制數。根據測得的不同溫度下的電壓值數據構成一個表,表中放溫度,值y,x為電壓值數據。設測得的電壓值x放入r2r3中,根據電壓值x,查找對應的溫度值y,仍放入r2r3中。本例的x和y均為雙字節(jié)無符號數。程序如下: ltb2:mov dptr,#tab2 mov a,r3 clr c rlc a mov r3,a xch a,r2 rlc a xch r2,a add a,dpl ;(r2r3)+(dptr) (dptr),mov dpl,a mov a,dph addc a,r2 mov dph,a clr a movc a,a+dptr ;查第一字節(jié) mov r2,a ;第一字節(jié)存入r2中 clr a inc dptr movc a,a+dptr ;查第二字節(jié) mov r3,a ;第二字節(jié)存入r3中 ret tab2:dw ;溫度值表,例4-3 設有一個巡回檢測報警裝置,需對16路輸入進行檢測,每路有一最大允許值,為雙字節(jié)數。運行時,需根據測量的路數,找出每路的最大允許值。看輸入值是否大于最大允許值,如大于就報警。根據上述要求,編一個查表程序。 取路數為x(0x15),y為最大允許值,放在表格中。設進入查表程序前,路數x已放于r2中,查表后最大值y放于r3r4中。本例中的x為單字節(jié)數,y為雙字節(jié)數。查表程序如下: tb3: mov a,r2 add a,r2 ;(r2)*2(a) mov r3,a ;保存指針 add a,#6 ;加偏移量,movc a,a+pc ;查第一字節(jié) xch a,r3 add a,#3 movc a,a+pc ;查第二字節(jié) mov r4,a ret tab3: dw 1520,3721,42645,7580 ;最大值 ;表 dw 3483,32657,883,9943 dw 10000,40511,6758,8931 dw 4468,5871,13284,27808,表格長度不能超過256個字節(jié),且表格只能存放于movc a,a+pc指令以下的256個單元中。 查表指令(movc a,a+pc 、 movc a,a+dptr)的區(qū)別 1)movc a,a+pc表格長度不能超過256個字節(jié),且表格只能存放于movc a,a+pc指令以下的256個單元中。 movc a,a+dptr表格可以設在64k程序存儲器空間內的任何地方 2) movc a,a+pc pc是執(zhí)行完本條指令后,指向下一條指令的 地址,需加上偏移量 movc a,a+dptr 不需要加偏移量。,3)根據表中指令的字節(jié)數不同,a分別乘以1、2或3,從表中取指令時,也要分1、2或3次進行。,單字節(jié)指令 a=a1,雙字節(jié)指令 a=a2,基址+0,基址+1,基址+2,(a)=0對應的一條指令,(a)=1對應的一條指令,三字節(jié)指令 a=a3,基址+3,基址+4,基址+5,4.3.5 數據極值查找程序設計 在指定的數據區(qū)中找出最大值(或最小值)。 進行數值大小的比較,從這批數據中找出最大值(或最小值)并存于某一單元中。 例4-9 已知內部ram addr為起始的數據塊內數據是無符號數,塊長在len單元內,找出數據塊中最大值并存入max單元。 程序如下:,org 2000h len data 20h max data 22h mov max,#00h ; max單元清零 mov r0,#addr ; addr送r0 loop: mov a,r0 ; 數塊中某數送a cjne a,max,next1 ; a和(max)比較 next1: jc next ;若a(max),則next mov max,a ;若a(max),則大數送max next: inc r0 ;修改數據塊指針0 djnz len,loop ;若未完,則轉loop here: sjmp here end,4.3.6 數據排序程序設計 升序排,降序排。僅介紹無符號數據升序排。 冒泡法:相鄰數互換的排序方法,類似水中氣泡上浮 。排序時從前向后進行相鄰兩個數的比較,次序與要求的順序不符時,就將兩個數互換;順序符合要求不互換。 假設有7個原始數據的排列順序為:6、4、1、2、5、7、3。第一次冒泡的過程是: 6、4、1、2、5、7、3 ;原始數據的排列 4、6、1、2、5、7、3 ;逆序,互換 4、1、6、2、5、7、3 ;逆序,互換 4、1、2、6、5、7、3 ;逆序,互換 4、1、2、5、6、7、3 ;逆序,互換,4、1、2、5、6、7、3 ;正序,不互換 4、1、2、5、6、3、7 ;逆序,互換,第一次冒 泡結束 如此進行,各次冒泡的結果如下: 第1次冒泡結果:4、1、2、5、6、3、7 第2次冒泡結果:1、2、4、5、3、6、7 第3次冒泡結果:1、2、4、3、5、6、7 第4次冒泡結果:1、2、3、4、5、6、7 ;已完成排序 第5次冒泡結果:1、2、3、4、5、6、7 第6次冒泡結果:1、2、3、4、5、6、7 對于n個數,理論上應進行(n-1)次冒泡,有時不到(n-1)次就已完成排序 。,如何判定排序是否已完成,看各次冒泡中是否有互換發(fā)生,如果有數據互換,則排序還沒完成。 在程序設計中,常使用設置互換標志的方法,該標志的狀態(tài)表示在一次冒泡中是否有互換進行。 例4-10 假設8個數連續(xù)存放在20h為首地址的內部ram單元中,使冒泡法進行升序排序編程。設r7為比較次數計數器,初值為07h。tr0為冒泡過程中是否有數據互換的狀態(tài)標志,tr0=0表示無互換發(fā)生,tr=1表明有互換發(fā)生。按前述冒泡序算法,程序如下:,sort: mov r0,#20h ;數據存儲區(qū)首單元地址 mov r7,#07h ;各次冒泡比較次數 clr tr0 ;互換標志清“0” loop: mov a,r0 ;取前數 mov 2bh,a ;存前數 inc r0 mov 2ah,r0 ;取后數 clr c subb a,r0 ;前數減后數 jc next ;前數小于后數,不互換 mov r0, 2bh dec r0 mov r0,2ah ;兩個數交換位置 inc r0 ;準備下一次比較 setb tr0 ;置互換標志 next: djnz r7,loop ;返回,進行下一次比較 jb tr0,sort ;返回,進行下一次冒泡 here: sjmp here ;排序結束,4.3.7 散轉移程序設計 一、使用轉移指令的散轉程序 jmp a+dptr 需根據某一單元的內容是0,1,n,來分別轉向處理程序0,處理程序1,處理程序n。 一個典型的例子就是當單片機系統(tǒng)中的鍵盤按下時,就會得到一個鍵值,根據不同的鍵值,跳向不同的鍵處理程序入口。 對于這種情況,可用直接轉移指令(ljmp或ajmp指令)組成一個轉移表,利用間接轉移指令實現分支轉移,例4-12 根據寄存器r2的內容,轉向各個處理程序prgx(x=0n)。 (r2)=0,轉prg0 (r2)=1,轉prg1 (r2)=n, 轉prgn,jmp1: mov dptr,#tbj1 mov a,r2 add a,r2 ; (r2)*2 (a) jnc nadd inc dph ; (r2)*2 256 nadd: jmp a+dptr tbj1: ajmp prg0 ajmp prg1 ajmp prgn,二、使用地址偏移量的散轉程序 例 按r2的內容轉向6個處理程序 jmp3: mov a,r2 mov dptr,#tbj3 movc a,a+dptr ;從表中讀取變址 jmp a+dptr tbj3:db prg0-tbj3 db prg1-tbj3 . db prg5-tbj3 prg0:處理程序0 prg1:處理程序1 prg2:處理程序2 prg3:處理程序3 prg4:處理程序4 prg5:處理程序5,4.3.8 循環(huán)程序設計 計數循環(huán)結構 djnz rn,rel;工作寄存器作控制計數器 1、單循環(huán)定時程序 例 mov r5,#time loop:nop 1t nop 1t djnz r5,loop 2t 循環(huán)體為4t,若晶振為6mhz,則t=12/fosc=2s 一次循環(huán)延遲時間:4*t=8s 程序的延遲時間:8*time(s) 該程序最大延遲時間:256*8=2048 (s),2,多重循環(huán)定時 例4-16 50ms延時程序。 延時程序與mcs-51指令執(zhí)行時間有很大的關系。在使用12mhz晶振時,一個機器周期為1s,執(zhí)行一條djnz指令的時間為2s。這時,可用雙重循環(huán)方法寫出下面如下的延時50ms的程序: del: mov r7,#200 del1: mov r6,#125 del2: djnz r6,del2 ;125*2=250s djnz r7,del1 ;0.25ms*200=50ms ret,以上延時程序不太精確,它沒有考慮到除“djnz r6,del2 ”指令外的其它指令的執(zhí)行時間,如把其它指令的執(zhí)行時間計算在內,它的延時時間為: del: mov r7,#200 1t del1: mov r6,#125 1t del2: djnz r6,del2 ;125*2=250s 2t djnz r7,del1 2t (250+1+2)*200+1=50.301ms 如果要求比較精確的延時,可按如下修改: del: mov r7,#200 1t del1: mov r6,#123 1t nop 1t del2: djnz r6,del2 ; 123*2t djnz r7,del1 ; (1+1+123*2+2)*200+1=50001t=500001s=50.001ms 實際延遲時間為50.001ms,注意。軟件延時程序,不允許有中斷,否則將嚴重影響定時的準確性。,采用增減指令對定時程序進行微調 mov r0, #time 1t loop:add a,r1 1t inc dptr 2t djnz r0,loop 2t 在6mhz晶振下,機器周期t=12/fosc=2s 定時時間為:5*2*time(s) 假設定時時間要求為24s,可以調整循環(huán)體的機器周期。,mov r0, #time 1t loop:add a,r1 1t inc dptr 2t nop 1t djnz r0,loop 2t 使time=2 定時時間=6*2s*2=24s,4.3.8 定點數運算程序設計,1、定點數的表示法 1)原碼:符號位=0 正數 符號位=1 負數 加減運算時,必須按符號位的不同執(zhí)行不同的運算。 正數:n補=n原 2)補碼: n補=數值位取反+1 負數: =2n-數值 n是整數的位數 補碼可直接帶符號位進行運算,用ov位表示溢出與否,補碼表示法的優(yōu)點是加減運算方便: (83)10+(-4)10=(01010011)2+(11111100)2 =(01001111)2=(79)10 補碼表示的數在執(zhí)行乘除運算時,先轉換成原碼,在執(zhí)行原碼乘除,最后把積轉換成補碼,例 雙字節(jié)數取補子程序 (r4r5)取補(r4r5) cmpt: mov a, r5 cpl a add a, #1 mov r5,a mov a,r4 cpl a addc a,#0 mov r4, a ret,2.帶符號數的移位 帶符號數進行算數移位時,必須保持最高位不變。 (1)正數:左移右移都移入0 (2)負數:原碼表示:符號位不變,左移右移 都移入0 補碼表示:符號位不變,右移移入 1,左移移入0 例 雙字節(jié)原碼左移一位子程序。 (r2r3)左移一位(r2r3),mov a, r3 clr c ; 保證讓左移移入0 rlc a mov r3,a mov a,r2 rlc a mov a.7,c ;恢復符號位 mov r2, a,r2,r3,c,0,符號位不變,例 雙字節(jié)原碼右移一位子程序 (r2r3)右移一位( r2r3) 0 mov a,r2 mov c,a.7 ;保護符號位 clr a.7 ;移入0 rrc a mov r2,a mov a,r3 rrc a mov r3,a,r2,r3,c,c,符號位不變,a(r2),c,符號位,0,例 雙字節(jié)補碼右移一位子程序 功能(r2r3)右移一位(r2r3) mov a, r2 mov c, a.7 ;保護符號位 rrc a ;移入符號位 mov r2, a mov a, r3 rrc a mov r3,a,r2,r3,c,符號位不變,1,c,a(r2),c,符號位,1,三、定點數加減運算 原碼的加減運算需根據符號位和不同的運算進行分類操作。補碼加減運算非常方便,一般采用補碼進行加減運算。 例 雙字節(jié)補碼加法子程序 (r2r3)+(r6r7) (r4r5),mov a ,r3 add a, r7 mov r5, a mov a, r2 addc a ,r6 mov r4,a,四、定點數乘法運算 1)無符號數二進制乘法 a=1011 b=1001 1011 1001 1011 0000 0000 + 1011 1100011 乘積a*b,乘數左移與部分積相加部分積右移+被乘數。,算法: 從低位開始檢查各個乘數的位數(乘數右移) 若乘數位數為1,部分積右移+被乘數部分積。 若乘數位數為0,部分積右移部分積。,2)mcs-51快速乘法 把mcs51的單字節(jié)運算擴展為雙字節(jié)的乘法 計算原理 r2 r3 r6 r7 r3r7h r3r7l r2r7h r2r7l r3r6h r3r6l r2r6h r2r6l r4 r5 r6 r7,例 無符號雙字節(jié)快速乘法 (r2r3)*(r6r7)(r4r5r6r7) mov a, r3 mov b, r7 mul ab ; r3r7 ba xch a, r7 r7= r3r7l mov r5,b ; b=r5= r3r7h mov b,r2 mul ab r2r7 ba add a,r5 a=r2r7l+r3r7h mov r4,a r4=r2r7l+r3r7h clr a addc a,b mov r5,a ; (r5)=r2r7h ,4.3.9 碼制轉換程序設計 在單片機應用程序的設計中,經常涉及到各種碼制的轉換問題。在單片機系統(tǒng)內部經常采用二進制碼。在輸入/輸出中,按照人的習慣均采用代表十進制數的bcd碼表示。此外,打印機要打印某數字字符,則需要將該數字的二進制碼轉換為該字符的ascii碼。 轉換類型包括:二進制碼與ascii碼之間的轉換 二進制與bcd碼之間的轉換 一、二進制碼與ascii碼之間的轉換 由ascii碼字符表可知,09的ascii碼為30h39h,af的ascii碼為41h46h,例 r0的低4位是一個二進制數,表示(0f) ,把它數碼轉換為ascii代碼并存入r0 說明:二進制+30h=其ascii代碼 二進制 9; 二進制+40h=其ascii代碼 二進制 9;,三種方法: 1)若r0 9 r0+30hr0; 若r0 9 r0+37hr0,2 )利用daa指令,3)查表,方法一:,org 0400h mov a,r0 ;取轉換值送a anl a,#0fh ;屏蔽高四位 add a,#90h ;a中內容+90h da a ; 十進制調整 addc a,#40h ;a中內容+40h da a ; 十進制調整 mov r0,a ;存轉換結果 sjmp $ ;結束 end,方法二:利用da a指令,方法三 :查表 org 0400h mov a, r0 anl a,#0fh ;屏蔽高4位 add a,#03h ;地址調整 movc a,a+pc ;查表 mov r0,a ;存結果 sjmp,$ asctab: db 0, 1,2,3,4 db 5, 6,7,8,9 db a, b,c,d,e,f end,多位十六進制數轉換成ascii碼 思路:,低四位轉換成ascii 高四位轉換成ascii,循環(huán)體完成一個字節(jié)十六進制數的轉換,字節(jié)-1不為0轉移,結束,例 多位十六進制數轉換為ascii碼 入口: (r0)=十六進制數低位地址指針 (r2)=字節(jié)數 出口: (r1)=ascii碼地址指針,二、二進制碼到bcd碼的轉換 二進制,1111001b=121d,bcd碼(一個字節(jié)表示一個bcd碼),00000001,00000010,1,2,00000001,1,壓縮bcd碼(一個字節(jié)表示2個bcd碼),方法一:通過除以1000、100、10等10的次冪,獲得千、百、十位數,例 8位二進制數轉換成bcd數 (a)為二進制數,r0為十位數和個位數地址指針(壓縮的bcd碼) mov b,#100 div ab ;(a)=百位數 mov r0,a ; 存入ram inc r0; mov a, #10 xch a, b div a, b ; (a)=十位數,(b)=個位數 swap a add a,b ; 合成到(a) mov r0, a 存入ram,該方法的缺點:被轉換數較大時,需進行多字節(jié)除法運算,運算速度較慢,程序缺乏通用性,方法二:y=an2n+an-12n-1+an-22n-2+a0 =(an2)+an-1) 2+an-2 ) 2) 2 +a0 (每次相加時進行bcd碼調整),例 雙字節(jié)二進制數轉換為bcd數 入口:(r2r3)為雙字節(jié)16位二進制數 出口:(r4r5r6為轉換完的壓縮bcd碼) y=a727+a626+a525+a0 =(a72)+a6) 2+a5 ) 2) 2 +a0 (每次相加時進行bcd碼調整) 計算結果2+ r2r3的次高位計算結果,r2r3,c,二進制位數-1=0?,結束,r4r5r6清零,n,y,y=a727+a626+a525+ a0 =(a72)+a6) 2+a5 ) 2) 2 +a0,da a 調整,例 雙字節(jié)二進制數轉換為bcd數 入口:(r2r3)為雙字節(jié)16位二進制數 出口:(r4r5r6為轉換完的壓縮bcd碼),r2r3,c,loop:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論