微機(jī)原理及應(yīng)用06程序設(shè)計(jì)基礎(chǔ)I2015_第1頁
微機(jī)原理及應(yīng)用06程序設(shè)計(jì)基礎(chǔ)I2015_第2頁
微機(jī)原理及應(yīng)用06程序設(shè)計(jì)基礎(chǔ)I2015_第3頁
微機(jī)原理及應(yīng)用06程序設(shè)計(jì)基礎(chǔ)I2015_第4頁
微機(jī)原理及應(yīng)用06程序設(shè)計(jì)基礎(chǔ)I2015_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第 六 講 51單片機(jī)言程序設(shè)計(jì)1微機(jī)原理及應(yīng)用Principle and Applications of Micro-Computers教學(xué)目的:掌握MCS-51單片機(jī)匯編程序設(shè)計(jì)方法要求: 掌握MCS-51單片機(jī)匯編程序設(shè)計(jì)結(jié)構(gòu)和設(shè)計(jì)方法掌握程序設(shè)計(jì)的模塊化思路和分層設(shè)計(jì)思路;掌握如何使用高級(jí)語言訪問MCU的片上資源難點(diǎn): 掌握程序設(shè)計(jì)的模塊化思路和分層設(shè)計(jì)思路 MCS-51單片機(jī)匯編程序的結(jié)構(gòu)單片機(jī)匯編程序的結(jié)構(gòu) MCS-51單片機(jī)匯編程序設(shè)計(jì)方法單片機(jī)匯編程序設(shè)計(jì)方法 例例1, 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 包含的主要指令包含的主要指令: DJNZ 包含的主要包含的主要C語言:語言:for

2、 ;whiledo內(nèi)容匯編語言程序 定義定義匯編語言程序是多條指令陳述語句的有序組合匯編語言程序是多條指令陳述語句的有序組合, 并且是為并且是為了實(shí)現(xiàn)某個(gè)特定的控制目標(biāo)和算法目的了實(shí)現(xiàn)某個(gè)特定的控制目標(biāo)和算法目的特點(diǎn)指令的有序組合指令的有序組合為了特定的控制目標(biāo)或算法目的為了特定的控制目標(biāo)或算法目的從功能上看, 由下面幾部分組成啟動(dòng)和初始化程序啟動(dòng)和初始化程序(僅執(zhí)行一次僅執(zhí)行一次)主程序主程序(一個(gè)一個(gè)“死循環(huán)死循環(huán)”)子程序子程序(某些特定子功能的陳述單元某些特定子功能的陳述單元)和中斷程序和中斷程序一個(gè)簡單的匯編語言程序源碼(見p.60) 功能 定時(shí)定時(shí)(周期性地周期性地)將一個(gè)變量從將

3、一個(gè)變量從05H增加到增加到FFH, 之后再重復(fù)之后再重復(fù)該過程該過程 代碼見教材p.60的3.3.1節(jié)0100H 75815F MOV SP, #5FH ; 堆棧底部位于堆棧底部位于60H 存放指令碼存放指令碼的首地址的首地址指令碼指令碼指令指令(指令助記符和操指令助記符和操作碼作碼)指令注釋指令注釋2022-3-195定時(shí)(周期性地)將一個(gè)變量從05H增加到FFH, 之后再重復(fù)該過程ORG 0000HLJMP main_entry ; 啟動(dòng)程序入口啟動(dòng)程序入口ORG 0003HLJMP INT0_svr ; 外部中斷外部中斷0程序入口程序入口 ; 其它中斷程序入口其它中斷程序入口ORG 0

4、100Hmain_entry: ; 啟動(dòng)程序和主程序啟動(dòng)程序和主程序MOV SP, #57HMOV PSW, #00HLCALL init_8051 ; 初始化程序初始化程序main_loop:LCALL Task1 ; 子程序或子任務(wù)子程序或子任務(wù)LJMP main_loopTask1: END以一個(gè)跳轉(zhuǎn)語句開始以一個(gè)跳轉(zhuǎn)語句開始中斷程序的入口地址是固定的中斷程序的入口地址是固定的(簡單解釋中斷的響應(yīng)簡單解釋中斷的響應(yīng))討論幾個(gè)問題討論幾個(gè)問題:(1) 為什么首句是一個(gè)跳轉(zhuǎn)語句為什么首句是一個(gè)跳轉(zhuǎn)語句?(2) 幾個(gè)幾個(gè)ORG偽指令的作用是什么偽指令的作用是什么?(3) 如果沒有任何中斷程序如

5、果沒有任何中斷程序, 必須采必須采用這樣的程序結(jié)構(gòu)用這樣的程序結(jié)構(gòu)?2022-3-196定時(shí)(周期性地)將一個(gè)變量從05H增加到FFH, 之后再重復(fù)該過程counter DATA 30HInitValue EQU 5 ORG 000H LJMP main ORG 100Hmain: MOV sp,#5FH MOV PSW,#00H MOV A,#0AH LCALL delay MOV couner,#InitValueForeverRun: ORG 0200Hdelay: #define InitValue 5unsigned char Counter;void delay(unsigned

6、char times) unsigned char i,j; for (i=time;i0;i- -) for(j=100;j0;j+);main(void) delay(10); Counter=InitValue; while(1) delay(100);Counter+; if (Counter=0 xFF) Counet=InitValue; 程序存儲(chǔ)器中的代碼形態(tài)見教材見教材p.62圖圖3-1內(nèi)容 MCS-51單片機(jī)匯編程序的結(jié)構(gòu)單片機(jī)匯編程序的結(jié)構(gòu) MCS-51單片機(jī)匯編程序設(shè)計(jì)方法單片機(jī)匯編程序設(shè)計(jì)方法 例例1, 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 包含的主要指令包含的主要指令: DJNZ

7、 包含的主要包含的主要C語言:語言:for ;whiledo匯編語言程序設(shè)計(jì)方法軟件功能分析, 根據(jù)功能合理劃分成若干模塊分別編寫下面程序模塊 根據(jù)資源根據(jù)資源, 確定堆棧確定堆棧, 寄存器組等初始位置寄存器組等初始位置, 編寫啟動(dòng)程序編寫啟動(dòng)程序 根據(jù)需要配置相關(guān)功能單元以及變量的初始狀態(tài)根據(jù)需要配置相關(guān)功能單元以及變量的初始狀態(tài), 編寫初始化程序編寫初始化程序 編寫硬件相關(guān)的驅(qū)動(dòng)程序編寫硬件相關(guān)的驅(qū)動(dòng)程序 編寫中斷程序編寫中斷程序 編寫功能模塊對(duì)應(yīng)的子程序編寫功能模塊對(duì)應(yīng)的子程序 根據(jù)各子功能模塊根據(jù)各子功能模塊(和任務(wù)和任務(wù))之間關(guān)系之間關(guān)系, 編寫主程序編寫主程序重點(diǎn)和難點(diǎn): 編寫功能

8、模塊對(duì)應(yīng)的子程序2022-3-1910模塊化程序設(shè)計(jì)基本思想:將一個(gè)大的程序按功能分割成一些小模塊特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充開發(fā)方法: 自上向下,逐步分解,分而治之2022-3-1911模塊設(shè)計(jì)原則 模塊獨(dú)立 每個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的特定功能。模塊之間的關(guān)系力求簡單。例如:模塊之間最好只通過數(shù)據(jù)傳遞發(fā)生聯(lián)系,而不發(fā)生控制關(guān)系。使用與模塊獨(dú)立的變量。模塊內(nèi)的數(shù)據(jù),對(duì)于不需要這些數(shù)據(jù)的其他模塊來說,應(yīng)該不允許使用;對(duì)一個(gè)模塊內(nèi)的變量的修改不會(huì)影響其他模塊的數(shù)據(jù),即模塊的私有數(shù)據(jù)只屬于

9、這個(gè)模塊。 模塊規(guī)模適當(dāng) 分解模塊要注意層次要多層次的分解任務(wù),注意對(duì)問題的抽象化,開始不要過于注意細(xì)節(jié),以后再細(xì)化求精。2022-3-1912源程序文件1預(yù)編譯命令說明部分執(zhí)行部分函數(shù)1函數(shù)n源程序文件i源程序文件nC程序C程序結(jié)構(gòu)模塊化程序設(shè)計(jì)內(nèi)容 MCS-51單片機(jī)匯編程序的結(jié)構(gòu)單片機(jī)匯編程序的結(jié)構(gòu) MCS-51單片機(jī)匯編程序設(shè)計(jì)方法單片機(jī)匯編程序設(shè)計(jì)方法 例例1, 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 包含的主要指令包含的主要指令: DJNZ 包含的主要包含的主要C語言:語言:for ;whiledo2022-3-1914程序設(shè)計(jì) 示例1功能 計(jì)算n個(gè)無符號(hào)整型數(shù)之和要求寫成子程序形式子程序的輸入

10、和輸出參數(shù)輸入: 數(shù)據(jù)個(gè)數(shù)存放在R4中, 數(shù)據(jù)的起始地址在R0中輸出: 和存放在R4(高8位)和R5(低8位)中2022-3-1915程序設(shè)計(jì) 示例1的源碼Sum: PUSH Acc ; 保存保存A的內(nèi)容在堆棧區(qū)的內(nèi)容在堆棧區(qū)PUSH B ; 保存保存B的內(nèi)容在堆棧區(qū)的內(nèi)容在堆棧區(qū)PUSH PSW ; 保存保存PSW的內(nèi)容在堆棧區(qū)的內(nèi)容在堆棧區(qū)MOV A, #00H ; 首先將和的低首先將和的低8位清零位清零MOV B, #00H ; 首先將和的高首先將和的高8位清零位清零CLR C ; 將進(jìn)位位清零將進(jìn)位位清零MOV R5, #00H ; R5寄存器清零寄存器清零Sum1:ADDC A, R

11、0 ; 將一個(gè)字節(jié)的數(shù)據(jù)加到和的低字節(jié)中將一個(gè)字節(jié)的數(shù)據(jù)加到和的低字節(jié)中MOV R5, A ; 保存和的低字節(jié)到保存和的低字節(jié)到R5中中CLR A ; 累加器累加器A清零清零ADDC A, B ; 將進(jìn)位位加到和的高將進(jìn)位位加到和的高8位中位中 MOV B, A ; 將和的高將和的高8位仍保存在位仍保存在B中中MOV A, R5 ; 將臨時(shí)保存在將臨時(shí)保存在R5中的和的低中的和的低8位位傳送到傳送到A中中INC R0 ; 數(shù)據(jù)緩沖區(qū)指針加數(shù)據(jù)緩沖區(qū)指針加1, 指向下一個(gè)字節(jié)指向下一個(gè)字節(jié)DJNZ R4, Sum1 ; 累加是否繼續(xù)累加是否繼續(xù)? ; 累加完成,和存放在累加完成,和存放在B(高高

12、8位位)和和A(低低8位位)中中MOV R4, B ; 將和的高將和的高8位傳送到位傳送到R4中中POP PSW ; 從堆棧區(qū)恢復(fù)從堆棧區(qū)恢復(fù)PSW的內(nèi)容的內(nèi)容POP B ; 從堆棧區(qū)恢復(fù)從堆棧區(qū)恢復(fù)B的內(nèi)容的內(nèi)容POP Acc ; 從堆棧區(qū)恢復(fù)從堆棧區(qū)恢復(fù)A的內(nèi)容的內(nèi)容RET#define xDataPt (unsighned char*)0 x00)#define pR4 = (char *)0 x03;unsigned int DataSum(void) unsigned int i,result; CY=0; for (i=0;i*pR4;i+) result+=*(xDataPt+i

13、); *pR4 = result;2022-3-1916程序設(shè)計(jì) 課內(nèi)練習(xí)1功能 將片外擴(kuò)展的數(shù)據(jù)存儲(chǔ)器中的10個(gè)無符號(hào)整型數(shù)轉(zhuǎn)移到片內(nèi)數(shù)據(jù)存儲(chǔ)器中要求寫成子程序形式子程序的輸入和輸出參數(shù)輸入: 保存原數(shù)據(jù)的起始地址為8000H輸出: 片內(nèi)數(shù)據(jù)存儲(chǔ)器的起始地址為80H2022-3-1917程序設(shè)計(jì) 課內(nèi)練練習(xí)1續(xù)續(xù) MOV R6,#20;LOOP: MOV DPTR, #8000H; MOV R0,#80H; MOVX A, DPTR; MOV R0, A; INC DPTR INC R0 DJNZ R6, LOOP RET void DataMove(void) unsigned int i

14、,result; char idata *DTo = (char *)0 x80; char xdata *DFrom; *DFrom= (char *)0 x8000; for (i=0;i20;i+) *(DTo+i)=*(DFrom+i); MCS-51單片機(jī)匯編程序仿真和編譯器一個(gè)簡單易用的MCS-51單片機(jī)匯編程序編輯, 仿真和編譯器Proview 32 (from Frinklin Software Inc.)Version 3.3.4Build number 8.63獲取方法網(wǎng)絡(luò)上搜索網(wǎng)絡(luò)上搜索總結(jié)MCS-51單片機(jī)匯編程序的結(jié)構(gòu)單片機(jī)匯編程序的結(jié)構(gòu)MCS-51單片機(jī)匯編程序設(shè)計(jì)方單片機(jī)匯編程序設(shè)計(jì)方法法例例1, 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)包含的主要指令包含的主要指令: DJNZ包含的主要包含的主要C語言:語言:for ;whiledo問題和討論子程序的調(diào)用和返回過程都涉及堆子程序的調(diào)用和返回過程都涉及堆棧的操作棧

溫馨提示

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

評(píng)論

0/150

提交評(píng)論