微機原理及應用07C語言II2015_第1頁
微機原理及應用07C語言II2015_第2頁
微機原理及應用07C語言II2015_第3頁
微機原理及應用07C語言II2015_第4頁
微機原理及應用07C語言II2015_第5頁
已閱讀5頁,還剩20頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

第七講51單片機C語言程序設計(教材4.4~4.5節)1微機原理及應用

PrincipleandApplicationsofMicro-Computers教學目的:函數和模塊化程序設計要求: 掌握程序設計的模塊化思路和分層設計思路;掌握如何使用高級語言訪問MCU的片上資源難點: 掌握程序設計的模塊化思路和分層設計思路例1,循環程序設計包含的主要指令:DJNZ包含的主要C語言:例2,查表和子程序(包含輸入和輸出參數)調用包含的主要指令:MOVC,LCALL包含的主要C語言:例3,BCD碼運算程序包含的主要指令:ADD,ADDC,DA例4,搜索最小(大)數程序(邏輯判斷)包含的主要指令:JNC,XCH例5,I/O端口控制程序設計(位操作)包含的主要指令:JB,JNB,CPL內容2023/2/33匯編語言程序設計示例1功能

計算n個無符號整型數之和要求寫成子程序形式子程序的輸入和輸出參數輸入:數據個數存放在R4中,數據的起始地址在R0中輸出:和存放在R4(高8位)和R5(低8位)中2023/2/34匯編語言程序設計示例1的源碼Sum:

PUSHAcc

;保存A的內容在堆棧區

PUSHB

;保存B的內容在堆棧區

PUSHPSW

;保存PSW的內容在堆棧區 MOVA,#00H;首先將和的低8位清零 MOVB,#00H;首先將和的高8位清零 CLRC;將進位位清零 MOVR5,#00H;R5寄存器清零Sum1: ADDCA,@R0

;將一個字節的數據加到和的低字節中 MOVR5,A;保存和的低字節到R5中 CLRA;累加器A清零 ADDCA,B;將進位位加到和的高8位中MOVB,A;將和的高8位仍保存在B中 MOVA,R5;將臨時保存在R5中的和的低8位傳送到A中 INCR0;數據緩沖區指針加1,指向下一個字節

DJNZR4,Sum1

;累加是否繼續?

;累加完成,和存放在B(高8位)和A(低8位)中 MOVR4,B;將和的高8位傳送到R4中

POPPSW

;從堆棧區恢復PSW的內容

POPB

;從堆棧區恢復B的內容

POPAcc

;從堆棧區恢復A的內容

RET#definexDataPt((unsighnedchar*)0x00 )#definepR4=(char*)0x03;unsignedintDataSum(void){unsignedinti,result;CY=0;for(i=0;i<*pR4;i++)result+=*(xDataPt+i);*pR4=result;}2023/2/35匯編語言程序設計課內練習1功能

將片外擴展的數據存儲器中的20個無符號整型數轉移到片內數據存儲器中要求寫成子程序形式子程序的輸入和輸出參數輸入:保存原數據的起始地址為8000H輸出:片內數據存儲器的起始地址為80H2023/2/36匯編語言程序設計課內練習1續MOVR6,#20;LOOP:MOVDPTR,#8000H;MOVR0,#80H;MOVXA,@DPTR;MOV@R0,A;INCDPTRINCR0DJNZR6,LOOPRET

voidDataMove(void){unsignedinti,result;charidata*DTo=(char*)0x80;charxdata*DFrom;*DFrom=(char*)0x8000;for(i=0;i<20;i++)*(DTo+i)=*(DFrom+i);}2023/2/37匯編語言程序設計示例2功能

將一組6個十六進制數轉換成對應的ASCII串(該字符串由12個字符順序組成)要求寫成子程序形式子程序的輸入和輸出參數輸入:保存原數據的起始地址為30H輸出:保存ASCII串的起始地址為50HASCII_Table: DB‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’ DB‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’2023/2/38匯編語言程序設計示例2的源碼(1)用查表方法,編寫一個子程序,實現單字節十六進制數到ASCII字符的轉換

ANLA,#0FH MOVCA,@A+DPTR POPDPH POPDPL POPPSW RETASCII_Table:DB‘0’,‘1’,’2’,’3’,’4’,’5’,’6’,’7’,DB‘8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’THex2ASCII:;見教材p.71 PUSHPSW PUSHDPL PUSHDPH MOVDPTR,#ASCII_Table MOVB,A SWAPA ANLA,#0FH MOVCA,@A+DPTR XCHA,B請問:輸入參數是?輸出參數是?2023/2/39匯編語言程序設計示例2的源碼(2)編寫一個子程序,調用前一個子程序,將6個字節十六進制數轉換成一個字符串 INCR1 MOV@R1,A INCR1 INCR0

DJNZR7,ToStr POPB POPAcc

RETToString: PUSHAcc PUSHB MOVR0,#30H MOVR1,#50H MOVR7,#6ToStr: MOVA,@R0 LCALLTHex2ASCII

MOV@R1,B2023/2/310C程序設計示例2的源碼(2)編寫一個子程序,調用前一個子程序,將6個字節十六進制數轉換成一個字符串voidmain(){

unsignedinti,result;

charidata*DTo=(char*)0x50;charidata*Dfrom=(char*)0x30;inti;

for(i=0;1<6,i++){Hex2Str(Dfrom,DTo);Dfrom++;DTo++;}}

codeunsignedcharASCii[]={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’}voidHex2Str(char*Src,char*Dest)

{chartemp=*Src;*Dest=ASCii[(temp>>4)];Dest++;*Dest=ASCii[(temp&0x0F)];

}

課內練習2:編寫程序將n個字節的十六進制數要轉換為一個字符串.(用示例1的參數)對應MOVC2023/2/311匯編語言程序設計示例3功能

計算3個字節型BCD碼之和,并表示成BCD碼要求寫成子程序形式子程序的輸入和輸出參數輸入:數據存放在R4,R5和R6中輸出:和存放在R2(高8位)和R3(低8位)中2023/2/312匯編語言程序設計示例3的源碼BCDSum:

PUSHAcc

PUSHPSW MOV R2,#00H MOVA,R4 ADDA,R5 DAA MOVR3,A CLRA ADDCA,R2movR2,A MOVA,R3 ADDA,R6 DAA MOVR3,A CLRA ADDCA,R2 DAA MOV R2,A

POPPSW

POPAcc

RETR5R4+AC調整R3R2R6+ACR3調整R2C+R22023/2/313匯編語言程序設計課內練習3功能

將一個無符號整型十六進制數轉換成BCD碼要求寫成子程序形式子程序的輸入和輸出參數輸入:原數據保存在A中輸出:BCD碼保存在R3(高字節)和R4(低字節)中2023/2/314匯編語言程序設計課內練習3續MOV

B,#100 DIV

AB MOV

R3,A ;savehundredbit MOV

A,B MOV

B,#10 DIV

AB SWAP

A ORL

A,B MOV

R4,A RETvoidHex2BCD(charHEX,charBCD){BCD=(HEX/10*16)+(HEX%10);}main(){……}2023/2/315匯編語言程序設計示例4功能

某系統的片外RAM從0020H~0030H地址單元存放著一批無符號整型數,請查找其中的最小數是多少?位于哪個地址單元?要求寫成子程序形式子程序的輸入和輸出參數輸入:原數據存放在片外RAM的0020~0030H中輸出:最小數存放在A中,其地址放在R2(高8位)和R3(低8位)中2023/2/316匯編語言程序設計示例4的源碼Sort: MOVR7,#16 MOVDPTR,#0020H MOVXA,@DPTR MOVB,A INCDPTRSort1: MOVXA,@DPTR CLRC SUBBA,B JNCSort_Skip MOVXA,@DPTR XCHA,B MOVX@DPTR,A MOVR3,DPLSort_Skip: INCDPTR DJNZR7,Sort1 RET

課內練習4:編寫程序確定這一組數據的最大數及其存儲單元地址.2023/2/317匯編語言程序設計課內練習5功能

有16個字節的數據分別存放在2000H~200FH單元,請編寫程序統計其中有多少個數據是大于80H的,將統計結果保存在片內RAM的30H單元。要求寫成子程序形式子程序的輸入和輸出參數輸入:原數據存放在片外RAM的2000H~200FH中輸出:統計結果保存在片內RAM的30H單元2023/2/318匯編語言程序設計課內練習5續

MOV R4,#0 MOV R2,#16 MOV DPTR,#2000Hex1_loop: MOVX

A,@DPTR SUBB A,#80H ; JC ex1_skip INC R4ex1_skip: INC DPTR DJNZ

R2,ex1_loop MOV A,R4 MOV 30H,A RET內容例1,循環程序設計包含的主要指令:DJNZ包含的主要C語言:例2,查表和子程序(包含輸入和輸出參數)調用包含的主要指令:MOVC,LCALL包含的主要C語言:例3,BCD碼運算程序包含的主要指令:ADD,ADDC,DA例4,搜索最小(大)數程序(邏輯判斷)包含的主要指令:JNC,XCH例5,I/O端口控制程序設計(位操作)包含的主要指令:JB,JNB,CPL2023/2/320匯編語言程序設計示例5功能

按圖中電路,控制LED:

按下Key時,LED常亮; Key斷開時,LED亮0.1s,滅0.9s要求寫成主程序形式P1.0+5V12MHzKeyP3.1XTAL1XTAL2按下KeyKey斷開討論實現思路.2023/2/321匯編語言程序設計示例5的流程啟動按Key?YesNoLED亮,Flag=‘0’OnOff=‘0’,Cnt=00HFlag=‘1’OnOff=‘0’?YesNoCnt>9?NoYesCnt=Cnt+1OnOff=‘1’,Cnt=00HP1.0=‘0’Cnt>90?NoYesOnOff=‘0’,Cnt=00HP1.0=‘1’ANDFlag延時10ms啟動和初始化任務2(識別Key狀態)任務3(控制LED狀態)任務1(延時10ms)2023/2/322匯編語言程序設計示例5的源碼 FlagBIT00H OnOffBIT01H CntDATA30HORG0000HLJMPmain_entry;無中斷程序ORG0100Hmain_entry: CLROnOff MOVCnt,#00Hmain_loop: LCALLTask1 LCALLTask2 LCALLTask3 LJMPmain_loopORG0200HTask1:;延時10ms MOVR7,#97T11:MOVR6,#50T12:DJNZR6,T12 DJNZR7,T11 RETTask2:;識別Key狀態 JNBP3.1,T2Skip;按下

溫馨提示

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

評論

0/150

提交評論