《分支程序設(shè)計(jì)實(shí)驗(yàn)實(shí)驗(yàn)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《分支程序設(shè)計(jì)實(shí)驗(yàn)實(shí)驗(yàn)報(bào)告.doc(19頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、實(shí)驗(yàn)二 分支程序設(shè)計(jì)實(shí)驗(yàn)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱:分支程序設(shè)計(jì)實(shí)驗(yàn) 指導(dǎo)教師 羅志祥 專業(yè)班級(jí) 光信1006 姓名 張博 學(xué)號(hào)U201013339 聯(lián)系方式 13554098548 一、任務(wù)要求:熟練掌握KeilC環(huán)境下匯編語言程序的調(diào)試方法,加深對(duì)匯編語言指令、機(jī)器碼、尋址方式等基本內(nèi)容的理解,掌握分支程序和簡(jiǎn)單程序的設(shè)計(jì)與調(diào)試方法,了解并行IO口的使用。1. 設(shè)有8bits符號(hào)數(shù)X存于外部RAM單元,按以下方式計(jì)算后的結(jié)果Y也存于外部RAM單元,請(qǐng)按要求編寫程序。2. 利用51系列單片機(jī)設(shè)計(jì)一個(gè)24小時(shí)制電子時(shí)鐘,電子時(shí)鐘的時(shí)、分、秒數(shù)值分別通過P0、P1、P2端口輸出(以壓縮BCD碼的形式)。P
2、3.0為低電平時(shí)開始計(jì)時(shí),為高電平時(shí)停止計(jì)時(shí)。提高部分(選做):a. 實(shí)現(xiàn)4位十進(jìn)制加、減1計(jì)數(shù),千位、百位由P1口輸出;十位、個(gè)位由P2口輸出。利用P3.7狀態(tài)選擇加、減計(jì)數(shù)方式。b. 利用P3口低四位狀態(tài)控制開始和停止計(jì)數(shù),控制方式自定。二、設(shè)計(jì)思路:1.分支函數(shù)程序設(shè)計(jì):首先將X賦給累加器A,與40比較大小,將大于或等于40的執(zhí)行乘方操作;小于40的再與20做比較,大于20的執(zhí)行取除法操作,小于或等于20的執(zhí)行取反操作。最后將計(jì)算結(jié)果Y存于片外的RAM上。2.電子時(shí)鐘程序設(shè)計(jì)思路:首先用循環(huán)程序的嵌套實(shí)現(xiàn)一個(gè)1s的延時(shí),同時(shí)讓記秒的端口P2同步加一,到60后清零;再讓此循環(huán)執(zhí)行60次實(shí)現(xiàn)
3、1min的延時(shí),同時(shí)讓P1同步加一,到60后清零;再讓分鐘的循環(huán)執(zhí)行24次,實(shí)現(xiàn)1hour的延時(shí),同時(shí)讓P0同步加一。至此循環(huán),即可實(shí)現(xiàn)24小時(shí)的時(shí)鐘功能。(注:本計(jì)算機(jī)的晶振頻率為12MHz)3.4位十進(jìn)制加、減1計(jì)數(shù)程序思路:低位的個(gè)位和十位賦給一個(gè)寄存器,而將高位即百位千位賦給另外一個(gè)寄存器,通過循環(huán)程序使低位數(shù)循環(huán)100次即向高位進(jìn)位或借位,高位循環(huán)100次后即回歸初始狀態(tài),同時(shí)設(shè)計(jì)兩個(gè)子函數(shù)分別執(zhí)行加一、減一操作。其中,用P3的第7位的狀態(tài)實(shí)現(xiàn)對(duì)計(jì)數(shù)與否的控制。三、資源分配:1.分支函數(shù)程序:A:累加器C:位操作B:做乘方的寄存器DPTR:片外尋址指針2000H、2001H、2002
4、H:片外存儲(chǔ)空間2.電子時(shí)鐘程序:A:累加器C:位操作P0、P1、P2:分別電子時(shí)鐘的時(shí)、分、秒輸出R0、R1、R2:分別時(shí)分秒計(jì)數(shù)用存儲(chǔ)器R3、R4、R5:完成1s延時(shí)的相關(guān)數(shù)據(jù)存儲(chǔ)3.四位十進(jìn)制加、減1計(jì)數(shù)程序:A:累加器C:位操作P0:低位輸出口 P1:高位輸出口 R0:高位寄存器 R1:低位寄存器 R7 R6:分別臨時(shí)儲(chǔ)存低位和高位的寄存器四、流程圖:1. 分支函數(shù)程序流程圖2電子時(shí)鐘程序流程圖3四進(jìn)制加、減1計(jì)數(shù)程序流程圖各圖形如下:開始取數(shù)比較X與40的大小 大于或等于40比較X與20的大小 小于或等于20 大于20求平均值執(zhí)行取反運(yùn)算執(zhí)行平方運(yùn)算 存結(jié)果于Y結(jié)束電子時(shí)鐘:開始R0
5、,R1,R2置零P0,P1,P2置零R2-0R1-0 R0-0 空操作延時(shí)1秒R0加1,輸出P2R0=60? NO YESR1+1,輸出P1 R1=60? NO YESR2+1,輸出P0R2=24? NO YES清零結(jié)束開始加減計(jì)數(shù)器流程圖:P0, P1, P2-0P3.7=0?執(zhí)行1計(jì)數(shù)執(zhí)行+1計(jì)數(shù) YESR0=0?高兩位R1-1,轉(zhuǎn)換為十進(jìn)制,輸出P0R0-99R0=0?R1-99低位R01,轉(zhuǎn)換為十進(jìn)制,輸出P1P0, P1-99P0, P1-0R1-0R0-0低兩位R0+1,轉(zhuǎn)換為十進(jìn)制,輸出P1R0=99? NO NO YES YES高兩位R1+1,轉(zhuǎn)換為十進(jìn)制,輸出P0R0=99?
6、 YES YES NO NO清零結(jié)束五、源代碼:1)ORG 0000HMOV A,#50HMOV DPTR,#2000HMOVX DPTR,A ;將數(shù)存入片外RAMMOV DPTR,#2000HMOVX A,DPTR ;從片外RAM中取數(shù)XMOV R7,ACLR CMOV R0,#40H ;對(duì)X的值進(jìn)行比較SUBB A,R0JNC MUTIMOV R1,#20HCLR CMOV A,R1SUBB A,R7JC DIVIMOV A,R7CPL A ;對(duì)X進(jìn)行取反MOV DPTR,#2001HMOVX DPTR,A ;存入片外RAMLJMP STOPDIVI:MOV B,#2H ;除法子程序 MO
7、V A,R7 DIV AB MOV DPTR,#2001H MOVX DPTR,A LJMP STOPMUTI:MOV A,R7 ;平方子程序 MOV B,A MUL AB MOV DPTR,#2001H ;低位存入片外RAM中2001H MOVX DPTR,A INC DPTR MOV A,B MOVX DPTR,A ;高位存入片外RAM中2002HSTOP:SJMP $ END2)ORG 0000H MOV R0,#0;R0,R1,R2置0MOV R1,#0MOV R2,#0MOV P0,#0;P0,P1,P2置0MOV P1,#0MOV P2,#0 INPUT:JNB P3.0,STEP
8、 START: ACALL DELAY INC R0;秒鐘計(jì)數(shù) MOV A,R0 ACALL OUTPUT;轉(zhuǎn)化為bcd碼 MOV P2, A CJNE R0,#60,START;60進(jìn)制判斷進(jìn)1 MOV R0,#0; MOV P2,#0; INC R1;分鐘計(jì)數(shù) MOV A,R1 ACALL OUTPUT;轉(zhuǎn)化為bcd碼 MOV P1,A CJNE R1,#60,START;60進(jìn)制判斷 MOV R1,#0; MOV P1,#0; INC R2;時(shí)鐘計(jì)數(shù) MOV A,R2; ACALL OUTPUT;計(jì)算bcd碼 MOV P0,A CJNE R2,#24,START;判斷是不是溢出了 MOV
9、 R2,#0;溢出清0 MOV P0,#0;輸出清0 SJMP INPUT;跳出循環(huán) DELAY:MOV R3,#19H;循環(huán)次數(shù)LOOP:MOV R4,#28HLOOP1:MOV R5,#0FAH;循環(huán)次數(shù)LOOP2:NOP NOP DJNZ R5,LOOP2 DJNZ R4,LOOP1 DJNZ R3,LOOP SJMP START RET OUTPUT:MOV B,#0AH; DIV AB SWAP A ORL A,B RET DONE:SJMP $STEP:SJMP STEP END3)ORG 0000HMOV P0,#0HMOV P1,#0HMOV P2,#0HJUDGE:CLR C
10、 MOV C,P3.7 JNC ADDDONESUBDDONE:MOV P0,#99H MOV P1,#99H MOV R0,#63H ;千,百位 MOV R1,#63H ;十,個(gè)位START: MOV A,R1 ACALL DELAY DEC A MOV R7,A ACALL OUTPUT MOV P1,A MOV B,R7 MOV R1,B CJNE A,#0H,START;低位循環(huán) MOV A,#63H MOV R7,A ACALL OUTPUT MOV P1,A MOV B,R7 MOV R1,B MOV A,R0 MOV R7,A DEC A ACALL OUTPUT MOV P0,
11、A MOV B,R7 MOV R0,B CJNE A,#0H,START ;高位循環(huán) SJMP $;原地踏步ADDDONE:MOV P0,#00H MOV P1,#00H MOV R0,#00H ;千,百位 MOV R1,#00H ;十,個(gè)位MOV R0,#0HSTART1: MOV A,R1 ACALL DELAY INC A MOV R7,A ACALL OUTPUT MOV P1,A MOV B,R7 MOV R1,B CJNE A,#99H,START1 ;低位循環(huán) MOV A,#0H MOV R7,A ACALL OUTPUT MOV P1,A MOV B,R7 MOV R1,B M
12、OV A,R0 INC A MOV R6,A ACALL OUTPUT MOV P0,A MOV B,R6 MOV R0,B CJNE A,#99H,START1 ;高位循環(huán) SJMP $;原地踏步 OUTPUT:MOV B,#0AH;轉(zhuǎn)化為BCD碼 DIV AB SWAP A ORL A,B RET DELAY:MOV R3,#32H;循環(huán)次數(shù)LOOP:MOV R4,#14H;循環(huán)次數(shù)LOOP1:MOV R5,#0FAH;循環(huán)次數(shù)LOOP2:NOP NOP DJNZ R5,LOOP2 DJNZ R4,LOOP1 DJNZ R3,LOOP RET END 六、 程序測(cè)試方法與結(jié)果、軟件性能分析
13、 1) 分段函數(shù)測(cè)試 分別令X=10、30、50測(cè)試個(gè)分段函數(shù),再使用X=20、40測(cè)試分界點(diǎn),其對(duì)應(yīng)結(jié)果如下:X=40時(shí),得到X,Y存入片外RAMX=20時(shí),X=30時(shí),X=40時(shí),Y的高位存入片外RAM 2002H,低位存入2001HX=50時(shí),Y的高位存入片外RAM 2002H,低位存入2001H2)、電子時(shí)鐘測(cè)試當(dāng)P3.0為高電平時(shí),不記時(shí),如圖:當(dāng)P3.7為低電平時(shí)計(jì)時(shí)開始,其計(jì)時(shí)效果如下:由于小時(shí)等待時(shí)間太長(zhǎng),故在此不再截圖顯示3)、4位十進(jìn)制加、減1計(jì)數(shù):當(dāng)P3.7為低電平時(shí)執(zhí)行加一計(jì)數(shù)P0輸出千位和百位 P1輸出十位和各位當(dāng)P3.7為高電平時(shí)執(zhí)行減一計(jì)數(shù)P0輸出千位和百位 P1
14、輸出十位和各位七、思考題1 1實(shí)現(xiàn)多分支結(jié)構(gòu)程序的主要方法有哪些?舉例說明。答:實(shí)現(xiàn)方法大致如下:1. 1.使用條件轉(zhuǎn)移指令實(shí)現(xiàn),如DJNZ,JNC2. 2.使用分支表法,如分支地址表、轉(zhuǎn)移指令表、地址偏移量表。2 2在編程上,十進(jìn)制加1計(jì)數(shù)器與十六進(jìn)制加1計(jì)數(shù)器的區(qū)別是什么?怎樣用十進(jìn)制加法指令實(shí)現(xiàn)減1計(jì)數(shù)?答:十進(jìn)制加一后需要在計(jì)算結(jié)果的基礎(chǔ)上進(jìn)行修正,運(yùn)用DA指令;而十六進(jìn)制加一指令所得結(jié)果即為最終結(jié)果,無需進(jìn)行修正。 寫十進(jìn)制加法指令時(shí),首先將結(jié)果與#0相加,即ADDA,0;然后運(yùn)用DAA指令,修正A為十進(jìn)制,最后再執(zhí)行減一操作,即DEC A。如此便可得到結(jié)果。八、心得與體會(huì)本次實(shí)驗(yàn)主
15、要進(jìn)行了分支程序的設(shè)計(jì)實(shí)驗(yàn),并涉及到了函數(shù)的多分支,與子函數(shù)間的嵌套,加深了我們對(duì)如何運(yùn)用子函數(shù)進(jìn)行程序的分支的方法。其中,分支函數(shù)的實(shí)現(xiàn)過程不是很復(fù)雜,但是電子時(shí)鐘的24小時(shí)制程序設(shè)計(jì)需要對(duì)多級(jí)函數(shù)的嵌套有深刻的理解,在這個(gè)程序的設(shè)計(jì)過程中,的確鍛煉了我們對(duì)于子函數(shù)、延時(shí)程序、系統(tǒng)頻率等相關(guān)概念有了多的了解。在電子時(shí)鐘設(shè)計(jì)中,要指出的是,程序在考慮一些延時(shí)的循環(huán)函數(shù)時(shí),一些耗時(shí)比較少的指令沒有加入計(jì)算,這就導(dǎo)致了,程序在執(zhí)行過程中會(huì)出現(xiàn)一定的誤差,在所難免,但總體而言,精確度還算比較高,滿足了設(shè)計(jì)的要求。總而言之,本次實(shí)驗(yàn)在自己一人的努力下,基本完成了實(shí)驗(yàn)任務(wù),歲耗時(shí)較長(zhǎng),但有其自己的效果,也提高了我通過單片機(jī)實(shí)現(xiàn)一些小型功能的能力,這些對(duì)以后的學(xué)習(xí)必將大有裨益!