單片機原理與應用基于匯編C及混合編程章習題解答_第1頁
單片機原理與應用基于匯編C及混合編程章習題解答_第2頁
單片機原理與應用基于匯編C及混合編程章習題解答_第3頁
單片機原理與應用基于匯編C及混合編程章習題解答_第4頁
單片機原理與應用基于匯編C及混合編程章習題解答_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、習題一1 . 什么是單片機?單片機全稱單片微型計算機。它是把計算機中的微處理器、只讀存儲器(ROM隨機訪問存儲器(RAM、I/O接口、串行接口、中斷系統(tǒng)、定時/計數(shù) 器等基本功能部件微型化并集成到一塊芯片上構成的小而完善的計算機。2 .單片機的主要用途是什么?單片機有體積小、功耗低、面向控制、抗干擾能力強、性價比高等優(yōu)點,被廣泛應用于家用電器、辦公自動化、工業(yè)控制、智能儀器儀表與集成智能傳感器、汽車電子與航空航天電子系統(tǒng)等各種控制系統(tǒng)中。習題二2-1.STC12C5A60S2 單片機的內部集成了哪些功能部件?各個功能部件的具體功能是什么?在STC12C5A60S2片機內部,其基本結構主要有中央

2、處理器CPU程序存儲器、數(shù)據存儲器、定時/計數(shù)器、UARW行口、I/O接口、高速A/D轉換、同 步串行外圍接口、 PCA看門狗WD儂片內RC振蕩器和外部晶體震蕩電路等模 塊組成。各部件功能:中央處理器CPU負責運算控制和調度,使整個系統(tǒng)協(xié)調工作。程序存儲器:用于存放用戶程序、數(shù)據和表格等信息。數(shù)據存儲器:用于存放單片機運行過程中的運算數(shù)據及運算地址等。定時 /計數(shù)器:常用定時器時鐘來實現(xiàn)定時檢測、定時控制;還可以用定時器產生毫秒寬的脈沖,來驅動步進電機一類的電器機械。計數(shù)器主要用于外部事件的計數(shù)。看門狗WDT在單片機出現(xiàn)運行紊亂時,可以使單片機重新啟動,恢復正常運行。I/O 接口:單片機通過I

3、/O 引腳進行輸入,輸出操作。振蕩器:產生單片機運行所需要的時鐘信號。2-2. 封裝模式為LQFP-48、 PDIP-40 的 STC12C5A60S2 單片機的I/O 引腳各有多少?P0、 P2 口各有什么功能?封裝模式為LQFP-48的STC12C5A60S2片機有48個引腳,44個I/O弓唧。 封裝模式為PDIP-40的STC12C5A60S2片機有40個引腳,36個I/O引腳。P0 口和P2 口都可以作為通用的I/O 口使用;當單片機訪問外部擴展電路或 設備時,P0 口可以作為地址總線的低8位及數(shù)據總線接口,地址/數(shù)據分時復 用,P2 口作為地址總線的高8位。2-3. 簡述 PSW 寄

4、存器各位的作用。若寄存器A 中的內容為63H , P標志位為何值?CY進位或借位標志位,簡稱 C。在執(zhí)行8位的加、減法指令時,用于記錄最高位的進位或借位。有進位或借位時則置位,否則清零。AC輔助進位標志位,在執(zhí)行加減法時,若 D3向D4有進位或借位時,AC 置位,否則AC清零。OV溢出標志位。在執(zhí)行加減法運算時,若運算的結果超出8位有符號數(shù)表示的范圍-128-+127 ,表示溢出,OV 1,否則OV青零。P:奇偶校驗標志位。用于記錄 A寄存器中的1的個數(shù)的奇偶性。若 A寄存器中 1 的個數(shù)為奇數(shù),則P 置位,為偶數(shù)則清零。RS1 RS0寄存器組選擇位,用來選擇當前的工作寄存器組。F0、F1:用

5、戶標志位。若寄存器A中的內容為63H (01100011B), A中“1”的個數(shù)為4,所以P= 0。2-4.STC12C5A60S2 單片機內部有哪幾類存儲器?中斷服務程序的入口地址分布在哪個區(qū)域?STC12C5A60S2片機內部有程序存儲器、數(shù)據存儲器 RAM特殊功能寄存器、擴展RAM。中斷服務程序的入口地址位于程序存儲器的首部。2-5.STC系列單片機系統(tǒng)復位后,程序存儲器指針PC的值是多少?當單片機正在執(zhí)行某一條指令時,PC 指向哪里?STC系列單片機系統(tǒng)復位后,程序存儲器指針 PC的值是0000H。當單片機正在執(zhí)行某一條指令時,PC指向下一條指令的地址。2-6. 片內 RAM 中,數(shù)據

6、存儲器的低128 字節(jié)、高128 字節(jié)和特殊功能寄存器可以使用什么尋址方式?哪些單元可作為工作寄存器區(qū),那些單元可以位尋址?訪問低128字節(jié)RAM寸,既能采用寄存器直接尋址,又可寄存器間接尋 址。訪問高128字節(jié)RAM寸,只能采用寄存器間接尋址,但可以作為堆棧區(qū)。 訪問特殊功能寄存器,只能直接尋址。00H-1FH為工作寄存器組區(qū);片內 RAMfr 20H-2FH單元為位尋址區(qū)。2-7. 在片內 RAM 中,位地址為30H 的位屬于字節(jié)地址為多少的單元?字節(jié)地址為26H。2-8.STC系列單片機復位后,使用了哪一工作寄存器組?當 CPU使用的工作寄存器組為2組時,R2對應的RAM地址是多少?ST

7、C系列單片機復位后,所使用的工作寄存器組為 0組;當CPUS用的工作 寄存器組為2組時,R2對應的RAMtfe址是12Hl2-9.什么是堆棧?簡述 STC12C5A60S2單片機的堆棧處理過程。堆棧是在RAM中開辟的一片數(shù)據緩沖區(qū),常用于保護CPU現(xiàn)場及臨時數(shù)據,其操作遵循先進后出、后進先出的原則 。STC12C5A60S2片機的堆棧處理過程:數(shù)據入棧時, SP指針內容先自動加 1,然后再將數(shù)據推入到SP指針指向的單元;出棧時,先將 SP指針所指向單元 的數(shù)據彈出,然后SP指針的內容自動減1.2-10.以下關于數(shù)據指針DPTR和程序指針PC的概述是否正確?(1) DPT時可以訪問的,而PC不能

8、訪問;V(2)它們都是16位的寄存器;V(3)它們都具有臨時存儲數(shù)據的功能;x(4) DPTRT以分成2個8位的寄存器使用,而PC不能。 V2-11.單片機與外部存儲器連接時,P0 口用作地址/數(shù)據復用,需要添加什么芯片才能鎖存8位地址信息?單片機與外部存儲器連接時,P0 口用作地址/數(shù)據復用,需要添加地址鎖存 器,如 74LS3732-12.如何設置STC12C5A60S2單片機I/O 口工作模式?若設置P1.7為強推挽輸出,P1.6為開漏,P1.5為弱上拉,P1.4,P13P1.2, P1.1,和P1.0為高阻輸入,應如何設置相關寄存器?STC12C5A60S2片機上電復位后所有引腳都默認

9、為準雙向(弱上拉)方式。根據具體應用可由軟件配置成:準雙向、強推挽、僅為輸入或開漏輸出4種工作方式。Px (x=0, 1, 2, 3, 4, 5) 口引腳的工作方式由特殊功能寄存器PxM1和PxM0相應位的配置決定I/O 口工作模式設定PxM17:0PxM07:0I/O 口模式00準雙向口(傳統(tǒng)8051I/O 口模式),灌電 流可達20mA,拉電流為230uA01強推挽輸出,輸入輸出電流都能可達20mA10僅為輸入(高阻)11開漏,內部上拉電阻斷開若設置P1.7為強推挽輸出,P1.6為開漏,P1.5為弱上拉(準雙向),P1.4, P13P1.2 , P1.1,和P1.0為高阻輸入,可通過以下的

10、兩條指令來完 成:MOV P1M1,#01011111B;MOV P1M0,#11000000B;2-13.I/O 口作為輸入引腳,應工作在何種方式?讀外部引腳狀態(tài)時,為何要先向相應引腳對應的鎖存器寫入“1” ?I/O 口作為輸入引腳,應工作在準雙向或僅為輸入狀態(tài);在準雙向口配置情況下,先輸出高電平,使d管截止,才可讀到正確的外部輸入狀態(tài)。2-14.STC12C5A60S2單片機復位方式有哪些?復位后單片機的初始狀態(tài)如何?STC12C5A60S2片機復位方式有上電復位、看門狗復位、外部低壓檢測復 位、軟件復位。復位后,單片機從用戶程序區(qū)0000H處開始正常工作;堆棧指針 SP指向 07H, P

11、0P3為 FFH習題三3-1使用Proteus對電路進行仿真,有哪些步驟?使用Proteus進行單片機系統(tǒng)設計、仿真主要有七個步驟,依次是新建設 計文件,選取元件并加入列表區(qū),將元件擺放到圖形編輯窗口,放置電源、地 線、布線、加載目標程序代碼,運行仿真。3-2在Keil中,源程序文件從編輯到生成*hex文件,經過哪些過程?在Keil中,源程序文件從編輯到生成*hex文件要經過建立工程,建立源 程序文件,建立文件和程序的連接,工作環(huán)境和參數(shù)的設置,再進行編譯、連 接可以生成目標文件。3-3在Keil中,如何對源程序文件進行軟件模擬調試?Keil軟件中有一個仿真CPU用來模擬程序的執(zhí)行,可以在沒有

12、硬件和仿真 器的情況下進行程序的調試,這就是軟件模擬調試的方法。對源文件進行軟件 模擬調試,首先要啟動調試。對工程編譯、連接成功以后,使用菜單“Debug “Start/StopDebug Session ”進入調試狀態(tài),按“ Ctrl+F5 ”組合鍵或者使 用金按鈕也能進入調試狀態(tài)。這時,源程序窗口的左側出現(xiàn)一個黃色箭頭,指向main()函數(shù)的第一行,該箭頭總是指向即將要運行的語句行。退出調試狀 態(tài)和啟動調試狀態(tài)方法一致。調試過程中使用最多的是“ Debug”菜單,而該菜單上的大部分命令可以在“debug”工具欄中找到對應的快捷按鈕。常用按鈕有:運行,單步,過程單步,單步跳出,執(zhí)行到當前,反

13、匯編窗口,觀察窗口,存儲器窗口。其中單步調試方式特別常用。單步執(zhí)行后,可以通過各個窗口觀察執(zhí)行結果,從而判斷該條語句是否出現(xiàn)問題。如果程序較長,可以采用下面的方法來調試。首先,在合適的位置設置斷點,方法為:在某一行上右擊,彈出的快捷菜單中選擇“ Insert/Remove Breakpoint ”。設置成功后,該行的前面會有紅色方塊指示。這時如果單擊“運行”按鈕,程序運行到斷點處會自動停止。刪除斷點也需使用同樣的方法。如果程序的運行要依賴于外圍接口,例如并行口、串行口、中斷、定時/ 計數(shù)器等,Keil 的“ Peripherals ”菜單中提供了一些選項,通過這些選項打開對應外圍接口的對話選框

14、,可以觀察外圍接口的狀態(tài),或者更改外圍接口的運行情況。習題四4 1 51 內核單片機有哪幾種尋址方式?片內RAM 低 128 字節(jié)及高 128 字節(jié)分別支持哪些尋址方式?片內擴展RAM 、片外 RAM 及特殊功能寄存器分別支持哪些尋址方式?51 內核單片機的尋址方式有:立即(數(shù))尋址、寄存器尋址、直接尋址、寄存器間接尋址、變址尋址、相對尋址、位尋址。片內RAM氐128字節(jié)支持直接尋址、寄存器間接尋址。片內RAMH 128字節(jié)支持寄存器間接尋址。片內擴展RAM:片外RAMfc持間接尋址。特殊功能寄存器支持直接尋址。4 2 區(qū)分下列指令有什么不同?(1) MOV A #22H和 MOV A 22H

15、MOV A #22H ;將立即數(shù)22H送入A寄存器中,第二操作數(shù)為立即尋址。MOV A 22H ;把片內RAM?節(jié)地址為22H單元的內容送入A寄存器中,第二操 作數(shù)為直接尋址。(2) MOV A, R1 和 MOV A, R1MOV A R1 ;把R1的內容送入A寄存器中,第二操作數(shù)為寄存器尋址。MOV A R1;將寄存器R0的內容作為RAMft單元的地址,將該單元的內容傳 送給A寄存器,第二操作數(shù)為寄存器間接尋址。(3) MOV A RM MOVX A R1MOV A R1;將寄存器R1的內容作為片內RAM8單元的地址,將該單元的內 容傳送給A寄存器MOVX a R1;將寄存器R1的內容作為

16、片內擴展或外部 RAMK單元的地址,將 該單元的內容傳送給A寄存器兩者的區(qū)別是:MOVJ問的是內部RAM MOV冊問的是片內擴展或外部 RAM (4) MOVX A R和 MOVX A DPTR主要的區(qū)別在于對外輸出地址的方式上。如果是訪問片外擴展RAM,MOVX A,R1只是占用P0 口,輸出R1中的8位地址。而MOVX A,DPTR占用P0、P2 口,輸出DPT的16位地址。(5) MOVC A A+DPTR MOVX A DPTRMOVC A, A+DPTR功能是A寄存器的內容作為無符號數(shù)和 DPT時容相加后得到一個 16 位的地址,將程序存儲器中該地址的內容傳送給A。MOVX A DP

17、TR以DPTR寄存器的值作為片內擴展 RAM或者片外RAM的地址,將該地址單元的內容送入A 。兩者的區(qū)別是MOV昉問的是整個ROM勺64KB空間;MOV舫問的是整個片內擴 展RAME片外擴展RAM4 3 寫出完成下列各項任務的指令。(1)片內RAM 30H單元的內容送到片內 RAM 50Hl元中。MOV 50H,30H(2)片內RAM 40Hl元的內容送到片內擴展 RAM 50K元中。ANL AUXR,#11111101BMOV A,40HMOV DPTR,#50HMOVX DPTR ,A(3)片內RAM 50Hl元的內容送到片外 RAM 2000HL元中。ORL AUXR,#00000010

18、BMOV A , 50HMOV DPTR , #2000HMOVX DPTR , A(4)片外RAM 2000HL元的內容送到片外 RAM 4000HL元中。ORL AUXR , #00000010BMOV DPTR,#2000HMOVX A,DPTRMOV DPTR,#4000HMOVX DPTR,A5 ) ROM 1000印元的內容送到片外 RAM 8000Hl元中。MOV DPTR,#1000HMOV A , #0MOVC A , A+DPTRMOV DPTR,#8000HORL AUXR,#00000010BMOVX DPTR , A(6)將程序狀態(tài)字寄存器PS汕容傳送到片內擴展RAM

19、 0D01Hl元中。ANL AUXR , #11111101BMOV A,PSWMOV DPTR , #0D0HMOVX DPTR , A(7)將片內RAM 01HFFH元內容清零。ANL PSW , #11100111BMOV R0,#0FFHMOV A,#0LOOP:MOV R0,ADJNZ R0,LOOP(8) 使片內RAM 20H單元的b7、b6位清零,b5、b4位置1, b3、b2位取反,其余各位保持不變。ANL 20H,#00111111BORL 20H,#00110000BXRL 20H,#00001100B4 4 下列各條偽指令前的標號各代表的地址是多少?ORG 0100HTA

20、BLE: DS 4 ;TABLE 代表的的地址是0100HWORDDB 15, 0FFH 30 ;WORD代表的地址是 0104HBIN EQU 0200HTAB1: DW 07H ;TAB1 代表的地址是0107H4 5 假設程序頭文件中含有如下變量定義偽指令DBUF DATA 40HBDATA DAT6A0H(1) 請指出如下指令中源操作數(shù)的尋址方式。MOV R,0 #DBUF ; 立即(數(shù))尋址MOV R,0 DBUF ; 直接尋址(2)執(zhí)行如下程序段后,片內 RAM 40H4FHi元的內容是什么? 60H單元的內 容又是什么?MOVBDAT,A #10HMOVR0, #DBUFCLRA

21、LOOP: MOVR,0 AINC AINC R0DJNZ BDAT,A LOOP執(zhí)行以上程序段后,片內 RAM 40H4FHi元的內容是:0-0FH;60H單元的內容為004 6 編寫一個延時10ms 的子程序。選才? STC12C5A60S2片機,系統(tǒng)時鐘頻率為12MHz程序如下:DELAY_10ms:MOV R7 , #120;2TDL: MOV R6 , #250;2TDJNZ R6 , $;4TDJNR R7 , DL ;4TRET;4T4 7編程實現(xiàn)PLO = P14PL3 4 P1,24PLi的邏輯運算。MOV C,P1.1 ORL C,P1.2 CPL CMOV PSW.5,C

22、MOV C,P1.4 ANL C,/P1.3 ORL C,PSW.5MOV P1.0,C4 8將存放在片內 RAM 51H、52H和片外RAM 2000H、2001H的四位BCD碼相力口,結果存放在片內 RAM 50H、51H、52H單元中(假設低位字節(jié)存放在高地址中,高位字節(jié)存放在低地址中)。ORL AUXR,00000010B MOV DPTR,#2001HMOVX A,DPTR ADD A,52H DA A MOV 52H,A MOV DPTR ,#2000H MOVX A,DPTR ADDC A,51H DA AMOV 51H,A MOV A,#00H ADDC A,#00H MOV

23、50H,A4 9編程實現(xiàn)將片內擴展 RAM 0200H0220H 單元的內容,全部移到片內RAM 30H單元開始的位置,并將原位置清零。MOV R0,#30HMOV DPTR,#0200HMOV R1,#21HANL AUXR , #11111101B LOOP:MOVXA,DPTRMOV R0,A MOV A,#0 MOVX DPTR,A INC R0 INC DPTRDJNZ R1,LOOP4 10 將存放在R3、 R2 中的三位壓縮BCD 碼轉換為二進制形式。W_BCD_BI:LCALL B_BCD_BI調用將R2中單字節(jié)BC則轉換為二進制數(shù)的子程序, ;轉換的結果存放于A寄存器中MOV

24、 R4, A ;把轉換結果暫時保存到R4MOV A, R3 ;取BC則的高1位MOV B, #100MUL AB;計算(a3*10+a2) *100ADD A, R4;加低2位轉換結果MOV R2, A;保存轉換結果的低8位MOV A, B;取(a3*10+a2) *100 的高 8 位ADDC A, #0;加進位位MOV R3, A;保存轉換結果的高8位;取BC則4 位(即十位)B_BCD_BI: MOV A, R2MOV B, #10 MUL AB MOV B, A MOV A, R2 ANL A, #0FH ADD A, BANL A, #0F0H SWAP A*10,最大為90(即5A

25、H) ,因此高8位為 0B 寄存器;取BC則;保留個位;個位加“十位*10,結果在A寄存器中RET411編寫程序完成運算 R0R1XR2R3,乘積存R4、R5、R6和R7 中。MUL:CLR AMOVR4, AMOVR5, AMOVR6, AMOVR7, AMUL1:MOVA, R1MOVB, R3 MULABMOVR7, AMOVR6, BMUL2:MOVA, R0MOVB, R3MULABADDA, R6MOVR6, ACLR AADDC A, BMOVR5, AMUL3:MOVA, R1MOVB, R2MULABADDA, R6MOVR6, AMOVA, R5ADDC A, BMOVR5

26、, ACLR AADDC A, 0MOVR4, AMUL4:MOVA, R0MOVB, R2MULABADDA, R5MOVR5, AMOVA, R4ADDC A, BMOVR4, ARET習題五5 1 在 C51 語言中支持哪些數(shù)據類型?C51 特有的數(shù)據類型有哪在C51語言中支持的數(shù)據類型有:char (字符型)、int (整型)、long (長整 形) 、 float (浮點型)、特殊功能寄存器類型和位類型。C51特有的數(shù)據類型有:特殊功能寄存器類型和位類型。5-2 C51中的存儲器類型有幾種,它們分別表示的存儲器區(qū)域是什么?C51 中的存儲器類型有:data、bdata、idata、p

27、data、xdata、code存儲器類型與硬件存儲器空間的對應關系data直接尋址的片內RAM氐128B,訪問速度快bdata片內RAhMT位尋址區(qū)(20H-2FH,允許字節(jié)和位混合訪問idata用Ri間接尋址的片內RAMfe部地址空間pdata用Ri間接訪問的片內擴展RAM片外擴展RAM氐256Bxdata用DPTR0接訪問的片內擴展RAME片外擴展RAM(64K)code程序存儲器ROM&句(64KB5 3在C51中,bit位與sbit位有什么區(qū)別?兩種位變量的區(qū)別在于,用 bit定義的位變量,其地址由 C51編譯時予以 安排,而用sbit定義位變量時必須同時定義其位地址,在 C51編譯器

28、編譯時, 其位地址不可變化。5-4在C51中,中斷函數(shù)與一般函數(shù)有什么不同?(1)中斷函數(shù)不能進行參數(shù)傳遞(2)中斷函數(shù)沒有返回值(3)在任何情況下都不能直接調用中斷函數(shù)(4)如果在中斷函數(shù)中調用了其他函數(shù),則被調用函數(shù)使用的工作寄存器必須 與中斷函數(shù)相同。否則會產生不正確的結果。(5)在中斷函數(shù)中調用其他函數(shù),被調函數(shù)最好設置為可重入的,因為中斷是 隨機的,有可能中斷函數(shù)所調用的函數(shù)出現(xiàn)嵌套調用。6 6) C51編譯器對中斷函數(shù)編譯時會自動在程序開始和結束處加上相應的內容, (7)中斷函數(shù)最好寫在文件的尾部,并且禁止使用extern存儲類型說明。5-5請分別定義下列變量:(1)片內RAMfr

29、無符號字符型變量x;unsigned char idata x;(2)片內RAW位尋址區(qū)無符號字符型變量y,將y.0y.2再分別定義為 位變量 key_in、key_up、key_down;片內RAMfr位尋址區(qū)無符號字符型變量 y :unsigned char bdata y;定義 y.0 y.2 為位變量 key_in、key_up、key_down:sbit key_in=yA0;sbit key_up=yA1 ;sbit key_down=yA2 ;(3)片外RAW整型變量x,并指定變量x的絕對地址為4000H#define x XWORD0X2000或:xdata int x _at

30、_ 0x4000;(4)特殊功能寄石器變量PCONsfr PCON=0X875 6 用 C51 語言寫出整型變量a 左移 4 位的語句。int a;a= a4;5 7 用 C51 語言編程實現(xiàn),片內擴展RAM 的 000EH 單元和000FH 單元的內容交換。#include #includevoid swap()char data c,d;AUXR&=0xFD;c=XBYTE0x000E;d=XBYTE0x000F;XBYTE0x000E=d;XBYTE0x000F=c;5 8 已知 x=375 , y=589 ,用 C51 語言編寫程序,計算z=x+y 的結果。int add()int x

31、,y,z;x=375;y=589;z=x+y;return z;5 9 試用 C51 語言編寫程序實現(xiàn)將片內RAM 21H 單元存放的兩位BCD 碼數(shù)轉換為十六進制數(shù)存入30H 單元。data unsigned char y1 _at_ 0x21;data unsigned char y2 _at_ 0x30;void trans()unsigned char temp;temp=y1;y1=(y1&0xf0)4;y2=y1*10+(temp&0x0f);5 10 試用 C51 語言編寫程序實現(xiàn)將片內RAM 30H 、 31H 單元存放的 2 字節(jié)十六進制數(shù)轉換為十進制數(shù)存于21H 為首的單元

32、中。(設低地址存放高位字節(jié))#include#include #define uint unsigned int#define uchar unsigned charuchar digit_h _at_ 0x30;uchar digit_l _at_ 0x31;uchar *p;int buf;void H_D()buf= digit_h *256;buf=buf+ digit_l;for(p=0x25;p=0x21;P-)*p=buf%10;buf=buf/10;5 11 試用 C51 語言編寫程序實現(xiàn)將0 9, A F 十六進制數(shù)轉換成相應的ASCII 碼。#includevoid H_A

33、(unsigned char X)if(X=9)X=X+0x30;elseX=X+0x37;return X512參見圖5 3,通過單片機的并行口P1,控制8路LED燈輪流且循環(huán)點亮。引腳為0 時燈亮,為1 時燈熄滅。#include#incldueunsigned char i=0x7f;void main()while(1)P1=i;delay();i=_cror_(i,1);void delay()unsigned char l,m,n;for(l=0;l254;l+)for(m=0;m254;m+)for(n=0;n254;n+);習題 66 1 如何在 C51 程序中嵌入匯編?第一步

34、:通過預編譯命令 “ #pragma asm” 和 “#pragma endasmf 在 C語言 代碼中插入匯編語言代碼。第二步:在KeilC51環(huán)境下,在Project窗口中包含匯編代碼的 C文件上 單擊右鍵,在彈出的快捷菜單中選擇“ Options for”命令,再次點擊選中右 邊的“ Generate Assembler SRC File ”和“ Assembler SRC file ”復選框,使檢查框由灰色變成黑色狀態(tài)。第三步:根據選擇的編譯模式,把相應的庫文件(如 Small模式時,是 KeilC51LibC51S.Lib加入到工程中,該文件必須作為工程的最后文件。庫文件與編譯模式的

35、關系如下:C51S.LIB沒有浮點運算的Small模式C51C.LIB沒有浮點運算的Compact模式C51L.LIB沒有浮點運算的Large模式C51FPS.LIB_浮點運算的Small模式C51FPC.LIBi浮點運算的Compact模式C51FPL.LIB_浮點運算的Large模式第四步:編譯,生成目標代碼。7 2 簡述在 C51 中調用匯編程序的實現(xiàn)方法。在C51中調用匯編程序,要把用C語言編寫的程序保存為擴展名為.C的C 語言文件,把用匯編語言編寫的程序保存為擴展名為 .asm、.SRC或者.A51的匯 編語言文件,然后把這些文件導入到同一個工程下進行編譯連接。在C語言中調用匯編程序

36、時,對被調用函數(shù)(匯編語言函數(shù))要在主調函 數(shù)(C語言函數(shù))所在文件中作出聲明,并且對匯編語言程序有一下要求: (1)要使用SEGMENT指令定義可再定位的CODKo(2) 要根據不同的情況對函數(shù)名進行轉換,見表6-1 。(3)要使用PUBLIC偽指令將被調用函數(shù)說明為外部可用函數(shù)。(4) 若有參數(shù)傳遞,按照表6-3 所列的規(guī)則使用參數(shù)。(5) 若有返回值,按照表6-4 所列規(guī)則存入寄存器。習題 77 1 什么是中斷?CPU 為什么要采用中斷結構?中斷是指CPUE在執(zhí)行某程序時,外部或者內部發(fā)生了隨機的事件,請求 CPUS速去處理,CPU時停止現(xiàn)行的程序的執(zhí)行,而自動轉去執(zhí)行預先安排好 的處理

37、該事件的服務子程序。處理完成后返回到斷點處繼續(xù)執(zhí)行。中斷結構使CPLM有隨機應變的能力,提高了 CPUt率,增強了實時性。7 2 STC12C5A60S2 單片機有哪幾個中斷源?單片機響應各中斷后,應如何清除相應中斷標志位?其中斷服務程序的入口地址各是多少?STC12C5A60S2片機有10個中斷源:外部中斷0 (INT0)、定時/計數(shù)器T0、外部中斷1 (INT1)、定時計數(shù)器T1、用行口 1 (UART1、A/D轉換、串行 口 2 (UART2、低壓檢測(LVD中斷、PCA中斷和SPI中斷。單片機響應各中斷后, 相應中斷標志位的清除:IE0、IE1:外部中斷0、外部中斷1設置為下降沿觸發(fā)方

38、式時,CPU向應該中斷時由硬件自動將IE0、IE1 位清0,如果設置為低電平觸發(fā)方式,必須在程序中通過指令清0。TF0、 TF1 中斷響應后由內部硬件電路自動清0。其余各中斷標志位都要通過用戶程序清0。中斷服務程序的入口地址:INT0: 0003H T0 : 000BH INT1 : 0013H T1 : 001BHUART:1 0023H ADC:002BH LVD:0033H PCA:003BHUATR2:0043H SPI:004BH7 3 STC12C5A60S2 單片機的中斷系統(tǒng)中有幾個優(yōu)先級?如何設定?當中斷優(yōu)先級相同時,其自然優(yōu)先權順序是怎樣的?STC12C5A60S2片機的中斷

39、系統(tǒng)中有4個優(yōu)先級。STC系列單片機中,設置特殊功能寄存器IP、IP2、IPH、IP2H可以實現(xiàn)4個中斷優(yōu)先級選擇。當中斷優(yōu)先級相同時,如果其中的幾個中斷源同時產生中斷請求,中斷源響應中斷的次序取決于內部的查詢次序。各中斷源中斷優(yōu)先查詢次序由高到低依次是:INT0、T0、INT1、T1、UART、1ADC、LVD、PCA、UATR、2SPI7 4簡述STC12C5A60S2單片機的中斷嵌套原則。1 .在運行低優(yōu)先級中斷源的中斷服務程序中,能被高優(yōu)先級的中斷源中斷, 反之不能。2 .任何中斷,一旦得到CPU向應,就不會被同一中斷優(yōu)先級別的中斷源中 斷。7-5中斷響應過程中,為什么要保護現(xiàn)場?如何

40、保護?因為中斷服務程序會用到一些寄存器和存儲器,如果不保護現(xiàn)場,這些寄 存器和存儲器中的數(shù)據就會覆蓋,當中斷返回繼續(xù)運行原來的程序時,就會得 到錯誤的結果。所以通常要保護現(xiàn)場。保護現(xiàn)場的方法是把中斷程序中用到的寄存器、存儲器等要保護的內容壓 入到堆棧。7-6 STC系列單片機中如何選擇和設置外部中斷的邊沿觸發(fā)和電平觸發(fā)方式?TCO隔存器中的IT0/TCON.0和IT1/TCON.2決定了外部中斷 0和1是下降 沿觸發(fā)還是低電平觸發(fā)。當ITx=1 (x=0,1),系統(tǒng)在INTx (x=0,1)引腳檢測到下降沿后產生外部中當ITx=0 (x=0,1),系統(tǒng)在INTx (x=0,1)引腳檢測到低電平

41、后產生外部中 斷。7-7在STC12C5A60S2單片機中,假設系統(tǒng)的時鐘頻率為12MHz ,利用定時/計數(shù)器T0 ,分別用匯編語言和 C51編程實現(xiàn)在P1.0引腳輸出周期為2s的方波。用寄存器R2作為定時器T0中斷次數(shù)計數(shù)器。分析:要產生周期2s的方波,需定時1s。選擇12T模式,T0x12=0,1f=12MHz,機器周期T= *12=1us, T0工作在萬式1,最大定時時間為12M216*T =65.536ms,所以一個定時器完成不了定時 1s的任務??梢岳肦2計數(shù)20次,每次定時50ms,則(216-C) * 1us =50ms ,計數(shù)初值 C=15536=3CB0H(1)匯編程序:O

42、RG 0000HLJMP MAINORG 000BH ; T0的中斷向量入口地址LJMP T0_INTORG 0100HMAIN: MOV SP,#0BFH初始化堆棧指針MOV TMOD,# 01H; T0 工作在方式 1MOV TL0,#0B0H ;給T0寫入初值 MOV TH0,#03CHMOV R2,#20 ;利用寄存器 R2計數(shù)20次SETB EA ;開放總中斷SETB ET0 ; T0溢出中斷允許SETB TR0 ;啟動T0開始工作 SJMP $T0_INT: MOV TL0,#0B0H;重新賦初值MOV TH0,#03CHDJNZ R2,NEXTCPL P1.0MOV R2,#20

43、 ;重新賦給 R2值20NEXT: RETIEND1) C51 程序:#include/sbit P1_0=P1A0;unsigned char i=0;void main( )TMOD=0x01;/T0工作在方式1 TL0=0xB0;/給T0裝入初值 TH0=0x3C;EA=1;/開放總中斷ET0=1;/T0溢出中斷允許TR0=1;啟動T0開始工作 while(1);void T0_INT( ) interrupt 1/T0 中斷服務程序TH0=0x3C;TL0=0xB0;/l新置入初值 i+;if(i= =20) P1_0=P1_0;i=0;7 8 由 P1 口驅動 8 個指示燈,利用定時

44、/計數(shù)器T1 的定時功能分別用匯編語言和C51 編程實現(xiàn)8 個指示燈依次循環(huán)點亮(輸出高電平),點亮間隔為1s,反復循環(huán)。分析:仿照上題,T1需定時50ms, R7計數(shù)20次,達到定時1s的目的, 每隔1s,循環(huán)一次,實現(xiàn)輪流點亮。( 1)匯編程序ORG 0000HLJMP MAINORG 001BH; T1 的中斷向量入口地址LJMP T1_INTORG 0100HMAIN: MOV SP,#0BFH初始化堆棧指針MOV TMOD,# 10H; T1 工作在方式1MOV TL1,#0B0H ;給 T1 寫入初值MOV TH1,#03CHMOV R7,#20 ;利用寄存器R7計數(shù)20次MOV

45、A, #01HSETB EA ;開放總中斷SETB ET1 ; T1 溢出中斷允許SETB TR1 ;啟動 T1 開始工作SJMP $T1_INT: MOV TL1,#0B0H;重新賦初值MOV TH1,#03CHDJNZ R7,NEXT R7減1不為0,說明中斷次數(shù)未到 20次,跳轉到 NEXT ;處返回MOV P1, A;RL A;為下一次做準備MOV R7,#20 ;重新賦給R7值50NEXT: RETIEND( 2) C51 程序:#includeunsigned char i=0;unsigned char ;jvoid main( )TMOD=0x10;/T1 工作在方式1TL1=

46、0xB0;/給T1裝入初值TH1=0x3C;j=0x01;EA=1;/肝放總中斷ET1=1;/T1溢出中斷允許TR1=1;/啟動T1開始工作 while(1); void T1_INT( ) interrupt 3T1 中斷服務程序 TH1=0x3C;TL1=0xB0;/t新置入初值 i+; if(i= =20) P1寸/定時中斷20次 i=0;j=_crol_(j,1); 7 9假設STC12C5A60S2單片機的系統(tǒng)時鐘頻率為12MHz ,利用定時/計數(shù)器T1在方式1下的功能,分別用匯編語言和 C51編程實現(xiàn)測量P3.3 ( INT1)引腳上的正脈沖的寬度(單位 ws)。 匯編程序:;計時

47、數(shù)據存放到 60H (高位字節(jié))、61T 62H單元。ORG 0 LJMP START ORG 001BH LJMP T1_INT START: MOV TMOD,#90HMOV TL1,#00HMOV TH1,#00H MOV R0,#60H MOV A,#0 SETB EA;SETB ET1;JB P3.3 , $ SETB TR1 JNB P3.3,$ JB P3.3 , $ CLR TR1 MOV R0A INC R0 MOV R0TH1 INC R0MOV R0 TL1SJMP $T1_INT: INC ARETIENDC51語言:#include#include聲明本征函數(shù)庫#de

48、fine uchar unsigned charsbit P3_3=P3A3;uchar nvar0=0,nvar1,nvar2;/ 存放計時數(shù)據void main()TMOD=0x90;TH1=0x00;TL1=0x00;EA=1;ET1=1;while(P3_3=1);/ 等待 P3.3 變低TR1=1;P3_3為低電平時,啟動 T1工作while(P3_3=0);/ 等待 P3.3 變高while(P3_3=1);/ 等待 P3.3 再變低TR1=0;/T1停止計數(shù)nvar1=TH0;nvar2=TL0;while(1);void T1_INT interrupt 3nvar0+;7-1

49、0在STC89/90xx系列單片機中利用定時/計數(shù)器T2的時鐘輸出功能,分別用匯編語言和 C51編程實現(xiàn)在P1.0引腳上輸出頻率為50Hz的方波。分析:設系統(tǒng)時鐘頻率為12MHz工彳在12T模式,n=2,已知需要輸出頻 fosc率為50Hz的萬波,由公式(RCAP2H RCAP2L =65536,計算出重裝初2n f值為 RCAP2H=15H,RCAP2L=A0H.匯編程序:TH2 DATA0CDH特殊功能寄存器地址聲明TL2 DATA0CCHRCAP2L DATA0CAHRCAP2H DATA0CBHT2MOD DATA0C9HT2CON DATA0C8HTR2BIT 0CAHTF2 BIT

50、 0CFHORG 0000HLJMP MAINORG 0100HMAIN: MOVT2CON,#00H;T2!作在時鐘輸出方式MOVT2MOD,#02H;T2俞出時鐘使能MOVTL2, #0A0H;輸出50Hz頻率方波MOVTH2, #15HMOV RCAP2L,#0A0HMOV RCAP2H,#15HSETB TR2;T2開始工作SJMP $ENDC51 程序:#includesfr T2MOD=0xC9;void main()T2CON=0x00;T2MOD=0x02;TL2=0xA0;/輸出50Hz頻率方波TH2=0x15;RCAP2L=0xA0;RCAP2H=0x15;TR2=1;wh

51、ile(1);7-11簡述STC12C5A60S單片機的PC醴塊的功能。PCA每個模塊都有自己的工作方式寄存器,通過對工作方式寄存器的設置,可以使各模塊工作在定時方式(相當于定時、計數(shù)器)、 捕獲方式(相對應模塊計數(shù)器所計數(shù)據進行捕獲的方式,用于測量外部信號產生的時間間隔)、 方波輸出方式、 輸出信號脈寬調制(PWM方式。7-12假設系統(tǒng)時鐘頻率為12MHz利用PCA真塊的功能,分別用匯編語言和C51編程實現(xiàn)在P1.3引腳上間斷重復輸出頻率為 450Hz的方波,持續(xù)和停止時間均為4s。分析:將PCA模塊的工作方式寄存器 CCAPM0寄存器寫為4DH,即PCA0設 為時鐘輸出方式,從而可以在 P

52、1.3引腳自動翻轉,輸出方波,并允許 PCA中 斷。要求方波頻率為 450hz,即周期為1/450,定時時間應設定為1/900S,選擇 計數(shù)器時鐘來源為系統(tǒng)時鐘頻率的12 分頻,即工作方式寄存器CMOD 設為00H,需要計數(shù)(1/900) / (12/12000000) =10000/9弋 1111=0457H時鐘脈沖, 可將CL CH初始值設為零,CCAP0HK為04H, CCAP0改為57H,在每次PCA 中 斷 里 : 將 計 數(shù) 值 加 到 比 較 匹 配 寄 存 器 里 CCAP0H、 CCAP0L=CCAP0、H CCAP0L+0457H啟動PCA計數(shù)持續(xù)4秒(CR=D,停止(CR

53、=0持續(xù)4秒;4秒鐘定時:定時器 T1,工作在方式1,計數(shù)時鐘fosc/12,定時50毫 秒,用R7計數(shù)T1中斷80次產生4秒鐘定時。初值為 N:由(65536-N) *1=50000 得 N=15536=3cb0H(1)匯編程序:CCON EQU 0D8H;PCA 制寄存器CMOD EQU 0D9H;PC模式寄存器CL EQU 0E9H;PCA時器的低8位CH EQU 0F9H;PC模時器的高8位CCAPM0 EQU 0DAH; PCA塊0的模式寄存器CCAP0L EQU 0EAH;PCA決0的捕獲寄存器的低 8位CCAP0H EQU 0FAH;PCA決0的捕獲寄存器的高 8位 AUXR EQU 8EHCR BIT CCON.6;PCA時控制位CF BIT CCON.7;PCA出標志位 ORG 0000HLJMP MAIN ORG 001BH LJMP T1_INT ORG 003BH LJMP PCA_INT ORG 0100HMAIN:CLR AMO

溫馨提示

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

評論

0/150

提交評論