單片機原理與應用課后習題_第1頁
單片機原理與應用課后習題_第2頁
單片機原理與應用課后習題_第3頁
單片機原理與應用課后習題_第4頁
單片機原理與應用課后習題_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章

1.給出下列有符號數(shù)的原碼、反碼和補碼(假設計算機字長為8位)。+45-89-6

+112

答:[+45]原=00101101,[+45]反=00101101,[+45]#=00101101[-89]原=11011001,

[-89]反=10100110,[-89]#=10100111[-6]原=10000110,[-6]反=11111001,[-6]

補=11111010[+112]原=01110000,1+45]反=01110000,[+45]補=01110000

2.指明下列字符在計算機內(nèi)部的表示形式。AsENdfJFmdsvl20

答:41H73H45H4EH64H66H4AH46H6DH64H73H76H31H32H30H

3.什么是單片機?

答:單片機是把微型計算機中的微處理器、存儲器、I/O接口、定時器/計數(shù)器、串行接口、

中斷系統(tǒng)等電路集成到一個集成電路芯片上形成的微型計算機。因而被稱為單片微型計算

機,簡稱為單片機。

4.單片機的主要特點是什么?

答:主要特點如下:1)在存儲器結構上,單片機的存儲器采用哈佛(Harvard)結構2)在芯

片引腳上,大部分采用分時復用技術3)在內(nèi)部資源訪問上,采用特殊功能寄存器(SFR)的

形式4)在指令系統(tǒng)上,采用面向控制的指令系統(tǒng)5)內(nèi)部一般都集成?個全雙工的串行接

口6)單片機有很強的外部擴展能力

5.指明單片機的主要應用領域。

答:單機應用:1)工業(yè)自動化控制;2)智能儀器儀表;3)計算機外部設備和智能接口;4)家

用電器多機應用:功能彌散系統(tǒng)、并行多機處理系統(tǒng)和局部網(wǎng)絡系統(tǒng)。

第二章

1.MCS-51單片機由哪幾個部分組成?

答:MCS-51單片機主要山以下部分組成的:時鐘電路、中央處理器(CPU)、存儲器系統(tǒng)(RAM

和ROM)、定時/計數(shù)器、并行接口、串行接口、中斷系統(tǒng)及一些特殊功能寄存器(SFR)。

2.MCS-51的標志寄存器有多少位,各位的含義是什么?

答:MCS-51的標志寄存器PSW有8位;D7D61)5D4D31)2DIDO;CAFR;

C0SISOV;0-P含義如下:C(PSW.7):進位或借位標志位。AC(PSW.6):輔助進

位或借位可標志位。F0(PSM5):用戶標志位。是系統(tǒng)預留給用戶自己定義的標志位。RS1、

RS0(PSW.4、PSW.3):寄存器組選擇位。可用軟件置位或清零,用于從四組工作寄存器中選

定當前的工作寄存器組。OV(PSW.2):溢出標志位。在加法或減法運算時,如運算的結果超

出8位二進制數(shù)的范圍,則0V置1,標志溢出,否則0V清零。P(PSW.O):奇偶標志位。用于記

錄指令執(zhí)行后累加器A中1的個數(shù)的奇偶性。若累加器A中1的個數(shù)為奇數(shù),則P置位,若累加

器A中1的個數(shù)為偶數(shù),貝UP清零。其中PSW.1未定義,可供用戶使用。

3.在8051的存儲器結構中,內(nèi)部數(shù)據(jù)存儲器可分為幾個區(qū)域?各有什么特點?答:片內(nèi)數(shù)

據(jù)存儲器按功能可以分成以下幾個部分:工作寄存器組區(qū)、位尋址區(qū)、一般RAM區(qū)和特殊功

能寄存器區(qū),其中還包含堆棧區(qū)。工作寄存器組區(qū),00H?1FH單元,可用R0?R7等8個寄存

器訪問;位尋址區(qū),20H?2FH單元,可按位方式訪問;?般RAM區(qū),30H?7FH單元:堆棧區(qū),

可從08到7F單元;特殊功能寄存器區(qū)位于80H?FFH單元。

4.什么是堆棧?說明MCS-51單片機的堆棧處理過程。

答:堆棧是按先入后出、后入先出的原則進行管理的一段存儲區(qū)域。CS-51單片機的堆

棧是向上生長型的,存入數(shù)據(jù)是從地址低端向高端延伸,取出數(shù)據(jù)是從地址高端向低端延伸。

入棧和出棧數(shù)據(jù)是以字節(jié)為單位的。入棧時,SP指針的內(nèi)容先自動加1,然后再把數(shù)據(jù)存入

到SP指針指向的單元;出棧時,先把SP指針指向單元的數(shù)據(jù)取出,然后再把SP指針的內(nèi)容自

動減1。

5.MCS-51單片機有多少根I/O線?它們和單片機的外部總線有什么關系?答:MCS-51單片

機有32根I/O線,由P0口經(jīng)地址鎖存器提供低8位(A7?AO),P2口提供高8位(A15?A8)而形

成。數(shù)據(jù)總線寬度為8位,由P0口直接提供??刂瓶偩€山第二功能狀態(tài)下的P3口和4根獨立

的控制線RST、EA、ALE和PSEN組成。6.什么是機器周期?MCS-51單片機的一個機器周期

包括多少個時鐘周期?答:機器周期:機器周期是單片機的基本操作周期,每個機器周期包

含Sl、S2、、S66個狀態(tài),每個狀態(tài)包含兩拍P1和P2,每一拍為一個時鐘周期(振蕩周期)。

因此,一個機器周期包含12個時鐘周期。

如果時鐘周期的頻率為12MHz,那么ALE信號的頻率為多少?答:2MHz

第三章

1.在MCS-51單片機中,尋址方式有幾種?其中對片內(nèi)RAM可以用哪幾種尋址方式?對片外

RAM可以用哪兒種尋址方式?

答:尋址方式可分為數(shù)的尋址和指令尋址,數(shù)的尋址有:常數(shù)尋址(立即尋址)、寄存器數(shù)

尋址(寄存器尋址)、存儲器數(shù)尋址(直接尋址方式、寄存器間接尋址方式、變址尋址方式)

和位尋址,指令的尋址有絕對尋址和相對尋址。片內(nèi)RAM尋址有:寄存器尋址、直接尋址方

式和寄存器間接尋址方式。片外RAM尋址有:寄存器間接尋址方式。

2.在對片外RAM單元尋址中,用Ri間接尋址與用DPTR間接尋址有什么區(qū)別?

答:片外數(shù)據(jù)存儲器尋址中,用Ri間接尋址只能訪問低端的256字節(jié)單元,而用DPTR作指

針間接訪問可訪問整個64K字節(jié)。

3.在位處理中,位地址的表示方式有哪幾種?

答:1.直接位地址(OOH'OFFH).例如:20H

2.字節(jié)地址帶位號。例如:20H.3表示20H單元的3位。

3.特殊功能寄存器名帶位號。例如:P0.1表示P0口的1位。

4.位符號地址。例如:TR0是定時/計數(shù)器T0的啟動位。

4.寫出完成下列操作的指令。

(1)R0的內(nèi)容送到R1中。

MOVA,RO

MOVRI,A

(2)片內(nèi)RAM的20H單元內(nèi)容送到片內(nèi)RAM的4011單元中。

MOV40H,20H

(3)片內(nèi)RAM的30H單元內(nèi)容送到片外RAM的50H單元中。

MOVA,30H

MOVR0,#50H

MOVX@R0,A

(4)片內(nèi)RAM的50H單元內(nèi)容送到片外RAM的3000H單元中。

MOVA,50H

MOVDPTR,#3000H

MOVX@DPTR,A

(5)片外RAM的2000H單元內(nèi)容送到片內(nèi)RAM的20H單元中。

MOVDPTR,#2000H

MOVXA,@DPTR

MOV20H,A

(6)片外RAM的1000H單元內(nèi)容送到片外RAM的4000H單元中。

MOVDPTR,#1000H

MOVXA,@DPTR

MOVDPTR,#4000H

MOV@DPTR,A

(7)ROM的1000H單元內(nèi)容送到片內(nèi)RAM的50H單元中。

MOVA,#0

MOVDPTR,#1000H

MOVCA,@A+DPTR

MOV50H,A

(8)ROM的1000H單元內(nèi)容送到片外RAM的1000H單元中。

MOVA,#0

MOVDPTR,#1000H

MOVCA,@A+DPTR

MOVX@DPTR,A

5.區(qū)分下列指令有什么不同?

(1)MOVA,20H和MOVA,#20H

答:前者源操作數(shù)是直接尋址,后者源操作數(shù)立即尋址。

(2)MOVA,@R1和MOVXA,@R1

答:前者源操作數(shù)是訪問片內(nèi)數(shù)據(jù)存儲器,后者源操作數(shù)訪問片外數(shù)據(jù)存儲器低

256字節(jié)。

(3)MOVA,R1和MOVA,@R1

答:前者源操作數(shù)是寄存器尋址,后者源操作數(shù)寄存器間接尋址。

(4)MOVXA,@R1和MOVXA,?DPTR

答:前者源操作數(shù)是訪問片外數(shù)據(jù)存儲器低256字節(jié),后者源操作數(shù)訪問片外數(shù)據(jù)

存儲器整個64K字節(jié)。

(5)MOVXA,@DPTR和MOVCA,@A+DPTR

答:前者源操作數(shù)是訪問片外數(shù)據(jù)存儲器,后者源操作數(shù)訪問程序數(shù)據(jù)存儲器。

6.設片內(nèi)RAM的(20H)=40H,(40H)=10H,(10H)=50H,(Pl)=0CAHo分析下列指令

執(zhí)行后片內(nèi)RAM的20H、40H、10H單元以及Pl、P2中的內(nèi)容。

MOVRO,#20H;R0=20H

MOVA,@R0;A=40H

MOVRI,A;Rl=40H

MOVA,@R1;A=10H

MOV@R0,Pl;(40H)=OCAH

MOVP2,Pl;P2=0CAII

MOV10H,A;(10H)=10H

MOV20H,10H;(20H)=10H

結果:(20H)=10H、(10H)=10H>(40H)=OCAH、P2=0CAH和P1=OCAH

7.已知(A)=0211,(R1)=7FH,(DPTR)=2FFCH,片內(nèi)RAM(7FII)=70H,片外RAM(2FFEH)

=11H,ROM(2FFEH)=64H,試分別寫出以下各條指令執(zhí)行后目標單元的內(nèi)容。

(1)MOVA,@R1結果:累加器A等于70H

(2)MOVX@DPTR,A結果:片外RAM(2FFCH)單元等于02H

(3)MOVCA,?A+DPTR結果:累加器A等于64H

(4)XCHDA,@R1結果:累加器A等于OOH,片內(nèi)RAM(7FH)單元等于72H

8.已知:(A)=78H,(RI)=78H,(B)=04H,CY=1,片內(nèi)RAM(78H)=ODDH,(80H)=6CH,

試分別寫出下列指令執(zhí)行后目標單元的結果和相應標志位的值。

(1)ADDA,@R1;累加器A等于55H,CY等于1

(2)SUBBA,#77H;累加器A等于OOH,CY等于0

(3)MULAB;累加器A等于EOH,B寄存器等于01H,CY等于1,OV等

于0

(4)DIVAB;累加器A等于1EH,B寄存器等于OOH,CY、OV等于0

(5)ANL78H,#78H;片內(nèi)RAM(78H)單元等于58H

(6)ORLA,#OFH;累加器A等于7FH

(7)XRL80H,A;片內(nèi)RAM(80H)等于14H

9.設(A)=83H,(RO)=17H,(17H)=34H,分析當執(zhí)行完下面指令段后累加器A、RO、

17H單元的內(nèi)容。

ANLA,#17H;A=O3H

ORL17H,A;(17H)=37H

XRLA,@R0;A=34H

CPLA;A=CBH

結果:A=CBH,(RO)=17H,(17H)=37H

10.寫出完成下列要求的指令。

(1)累加器A的低2位清零,其余位不變。

ANLA,#11111100B

(2)累加器A的高2位置“1”,其余位不變。

ORLA,#11000000B

(3)累加器的高4位取反,其余位不變。

XRLA,ttllllOOOOB

(4)累加器第0位、2位、4位、6位取反,其余位不變。

XRLA,S01010101B

11.說明LJMP指令與AJMP指令的區(qū)別?

答:LJMP指令后面提供的是16位目標地址,所以可以轉(zhuǎn)移到64KB程序存儲器的

任意位置,缺點是:執(zhí)行時間長,字節(jié)數(shù)多。

AJMP指令后帶的是11位直接地址,執(zhí)行時,先將程序指針PC的值加2(該指

令長度為2字節(jié)),然后把指令中的11位地址addrll送給程序指針PC的低11位,而程序

指針的高5位不變,只能在當前2K范圍內(nèi)轉(zhuǎn)移。

12.設當前指令CJNEA,#12H,10H的地址是0FFEH,若累加器A的值為10H,則該指

令執(zhí)行后的PC值為多少?若累加器A的值為12H呢?

答:指令執(zhí)行后的PC值為1011H,若累加器A的值為12H,則指令執(zhí)行后的PC值

為lOOlHo

13.用位處理指令實現(xiàn)Pl.4=PL0A(Pl.lvP1.2)v/PL3的邏輯功能。

程序:

MOVC,Pl.1

ORLC,Pl.2

ANLC,P1.0

ORLC,/Pl,3

MOVPl.4,C

14.下列程序段匯編后,從1000H單元開始的單元內(nèi)容是什么?

ORG1000H

TAB:DB12H,34H

DS3

DW5567H,87H

答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=00,(1004H)=00,

(1005H)=67H,(1006H)=55H,(1007H)=87H,(1008H)=00H

15.試編一段程序,將片內(nèi)RAM的20H、21H、22H單元的內(nèi)容依次存入片外RAM的20H、

21H、22H中。

程序:

MOVRO,#20H

MOVR2,#03H

LOOP:MOVA,@R0

MOVX@R0,A

INCRO

DJNZR2,LOOP

SJMP$

16.編程實現(xiàn)將片外RAM的2000H~2030H單元的內(nèi)容,全部搬到片內(nèi)RAM的20H單元開

始位置,并將源位置清零。

程序:

MOVR0,#20H

MOVDPTR,#200011

MOVR2,#31H

LOOP:MOVXA,?DPTR

MOV@R0,A

MOVA,#00

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR2,LOOP

SJMP$

17.編程將片外RAM的1000H單元開始的100個字節(jié)數(shù)據(jù)相加,結果放于R7R6中。

程序:

MOVDPTR,#100011

MOVR2,#100

MOVR7,#00

MOVR6,#00

LOOP:MOVXA,?DPTR

ADDA,R6

MOVR6,A

MOVA,R7

ADDCA,#0

MOVR7,A

INCDPTR

DJNZR2,LOOP

SJMP$

18.編程實現(xiàn)R4R3xR2,結果放于R7R6R5中。

程序:

ORG0100H

MUL1:MOVA,R2

MOVB,R3

MULAB;R2xR3,結果的低字節(jié)直接存入積的R5

MOVR5,A;結果的高字節(jié)存入R6中暫存起來

MOVR6,B

MUL2:MOVA,R2

MOVB,R4

MULAB;R2xR4,結果的低字節(jié)與R6相加后,再存入R6中

ADDA,R6

MOVR6,A

MOVA,B;結果的高字節(jié)加上進位位后存入R7中

ADDCA,#00

MOVR7,A

SJMP$

19.編程實現(xiàn)把片內(nèi)RAM的20H單元的。位、1位,21H單元的2位、3位,22H單元的

4位、5位,23H單元的6位、7位,按原位置關系拼裝在一起放于R2中。

程序:

MOVC,20H.0

MOVA.0,C

MOVC,20H.1

MOVA.1,C

MOVC,21H.2

MOVA.2,C

MOVC,21H.3

MOVA.3,C

MOVC,22H.4

MOVA.4,C

MOVC,22H.5

MOVA.5,C

MOVC,23H.6

MOVA.6,C

MOVC,23H.7

MOVA.7,C

MOVR2,A

20.用查表的方法實現(xiàn)一位十六進制數(shù)轉(zhuǎn)換成ASCH。

程序:(設一位十六進制數(shù)放在R2中,輪換的ASCH也放于R2中)

C16STASC:MOVDPTR,#TAB

MOVA,R2

MOVCA,?A+DPTR

MOVR2,A

RET

TAB:DB30H,31H,32H,33H,34H,35H,36H,37H

DB38H,391H,41H,42H,43H,44H,45H,46H

21.編程統(tǒng)計從片外RAM2000H開始的100個單元中“0”的個數(shù)放于R2中。

程序:

MOVDPTR,#2000H

MOVR3,#100

MOVR2,#00

LOOP:MOVXA,?DPTR

JNZNEXT

INCR2

NEXT:INCDPTR

DJNZR3,LOOP

SJMP$

第四章

1.C語言有哪些特點?

答:C語言具有以下特點:

1)語言簡潔、緊湊,使用方便、靈活

2)運算符豐富

3)數(shù)據(jù)結構豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結構

4)可進行結構化程序設計

5)可以直接對計算機硬件進行操作

6)生成的目標代碼質(zhì)量高,程序執(zhí)行效率高

7)可移植性好

2.有哪些數(shù)據(jù)類型是MCS-51單片機直接支持的?

答:MCS-51單片機宜接支持的數(shù)據(jù)類型標準分為基本數(shù)據(jù)類型和組合數(shù)據(jù)類型,基本數(shù)

據(jù)類型有字符型char、短整型short、整型int、長整型long、浮點型float、雙精度型double、

特殊功能寄存器型和位類型,其中char型與short型相同,float型與double型相同。組合數(shù)

據(jù)類型有數(shù)組類型、結構體類型、共同體類型和枚舉類型,另外還有指針類型和空類型。

3.C51特有的數(shù)據(jù)類型有哪些?

答:C51特有的數(shù)據(jù)類型有特殊功能寄存器型和位類型。

4.C51中的存儲器類型有幾種,它們分別表示的存儲器區(qū)域是什么?

答:C51中的存儲器類型有6種,分別如下:

data:直接尋址的片內(nèi)RAM低128B,訪問速度快

bdata:片內(nèi)RAM的可位尋址區(qū)(20H?2FH),允許字節(jié)和位混合訪問

idata:間接尋址訪問的片內(nèi)RAM,允許訪問全部片內(nèi)RAM

pdata:用Ri間接訪問的片外RAM低256B

xdata:用DPTR間接訪問的片外RAM,允許訪問全部64KB片外RAM

code:程序存儲器ROM64KB空間

5.在C51中,bit位與sbit位有什么區(qū)別?

答:bit位類型符用于定義一般的位變量。存儲器類型只能是bdata、data、idata,只

能是片內(nèi)RAM的可位尋址區(qū),嚴格來說只能是bdata。

sbit位類型符用于定義在可位尋址字節(jié)或特殊功能寄存器中的位,定義時需指明其位地

址,可以是位直接地址,可以是可位尋址變量帶位號,也可以是特殊功能寄存器名帶位號。

6.在C51中,通過絕對地址來訪問的存儲器有幾種?

答:通過絕對地址來訪問存儲器有三種方法:1.使用C51運行庫中預定義宏。2.通過

指針訪問。3.使用C51擴展關鍵字.at

7.在C51中,中斷函數(shù)與一般函數(shù)有什么不同?

答:中斷函數(shù)在定義時后面帶interruptm修飾符,m的取值為。?31,對應的中斷情況

如下:0——外部中斷0,1——定時/計數(shù)器TO,2——外部中斷1,3—定時/計數(shù)器T1,4—

串行口中斷,5——定時/計數(shù)器T2,其他值預留。

編寫MCS-51中斷函數(shù)需要注意如下幾點。

(1)中斷函數(shù)不能進行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導致編譯

出錯。

(2)中斷函數(shù)沒有返回值。

(3)在任何情況下都不能直接調(diào)用中斷函數(shù)

(4)如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)用函數(shù)所使用的寄存器必須與中斷函數(shù)

相同,否則會產(chǎn)生不正確的結果。

(5)C51編譯器對中斷函數(shù)編譯時會自動在程序開始和結束處加上相應的內(nèi)容。

(6)C51編譯器從絕對地址8m+3處產(chǎn)生一個中斷向量,其中m為中斷號,也即interrupt

后面的數(shù)字。該向量包含一個到中斷函數(shù)入口地址的絕對跳轉(zhuǎn)。

(7)中斷函數(shù)最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其他程序

調(diào)用.

8.按給定的存儲類型和數(shù)據(jù)類型,寫出卜列變量的說明形式。

(1)在data區(qū)定義字符變量vail。

chardatavail;

(2)在idata區(qū)定義整型變量val2。

intidataval2;

(3)在xdata區(qū)定義無符號字符型數(shù)組val3[4]。

unsignedcharxdataval3[4];

(4)在xdata區(qū)定義一個指向char類型的指針px。

charxdata*px;

(5)定義可尋址位變量flag。

bitflag;

(6)定義特殊功能寄存器變量P3。

sfrP3=0xa0;

(7)定義特殊功能寄存器變量SCON。

sfrSCON=0x98;

(8)定義16位的特殊功能寄存器TO。

sfrl6T0=0x8a;

9.寫出下列關系表達式或邏輯表達式的結果,設a=3,b=4,c=5o

(1)a+b>c&&b==c結果:假

(2)a||b+c&&b-c結果:真

(3)!(a>b)&&!c||1結果:真

(4)!(a+b)+c-l&&b+c/2結果:假

10.寫出下列C51程序的執(zhí)行結果。

(1)

ftinclude<stdio.h>

externserial_initial();

main()

{intx,y,z;

serialinitial();

x=y=8;z=++x;

printfC\n%d%d%d〃,y,z,x)

x=y二8;z=x++;

printfC\n%d%d%d”,y,z,x)

x=y=8;z=-x;

printf(,z\n%d%d%d〃,y,z,x)

x=y二8;z二x一;

printf(,z\n%d%d%d”,y,z,x)

printf(〃\n〃);

while(l);

結果:899

889

877

887

ttinclude<stdio.h>

externserialinitial();main()

(

intx,y,z;

serial_initial();

printf("inputdatax,y?\n〃);

scanf("%d%d〃,&x,&y);

printf(z/\nxyx<yx<=yx>yx>=yx!=yx=y〃);

printf(〃\n〃);

printf(,z\n%3d%3dz/,x,y);

z=x<y;printf(〃%5d〃,z);

z=x<=y;printf(〃%5d〃,z);

z=x>y;printf(〃%5d〃,z);

z=x>=y;printf(〃%5d〃,z);

z=x!=y;printf(,z%5d,z,z);

z=x==y;printfC%5dz,,z);

while(l);

)

執(zhí)行結果:

inputdatax,y?

12

xyx<yx<=yx>yx>=yx!=yx==y

12110010

(3)

ftinclude<stdio.h>

externserial_initial0;

main()

(

intx,y,z;

serial_initial();

printf(z,inputdatax,y?\n〃);

scanf(〃%d%d〃,&x,&y);

printf(,z\nxy!xx||yx&&y〃);

printf(,z\n%3d%3dz,,x,y);

z=!y;printf(〃%5d〃,z);

z=xIIy;printf(zz%5dz/,z);

z=x&&y;printf("%5d〃,z);

printf(〃\n");printf(〃\n");

printf(,/Thatisall\n〃);

while(l);

)

執(zhí)行結果:

inputdatax,y?

xy!xxI'yx&&y

12011

Thatisall

(4)

#include<stdio.h>

externserial_initial();

main()

(

inta,b;

unsignedintx,y;

serial_initial();

a=b=0xaa55;x=y=0xaa55;

printf(,z\na=%4xb=%4xx=%4xy=%4x”,a,b,x,y);

a=a<<l;b=b?l;

x=x?l;y=y?l;

printf(〃\na=%4xb=%4xx=%4xy=%4x〃,a,b,x,y);

printf(,z\nz/);

printf(〃\n〃);

printf(,zThatisall.\n");

while(l);

)

執(zhí)行結果:

a=aa55b=aa55x=aa55y=aa55

a=54aab=d52ax=54aay=552a

Thatisall.

11.break和continue語句的區(qū)別是什么?

答:break語句可以跳出switch結構,使程序繼續(xù)執(zhí)行switch結構后面的一個語句。break

語句還可以從循環(huán)體中跳出循環(huán),提前結束循環(huán)而接著執(zhí)行循環(huán)結構下面的語句。

continue語句用在循環(huán)結構中,用于結束本次循環(huán),跳過循環(huán)體中continue下面尚未執(zhí)

行的語句,直接進行下一次是否執(zhí)行循環(huán)的判定。

continue語句和break語句的區(qū)別在于:continue語句只是結束本次循環(huán)而不是終止整

個循環(huán);break語句則是結束循環(huán),不再進行條件判斷。

12.用分支結構編程實現(xiàn):輸入“1”顯示“A”,輸入“2”顯示,輸入“3”顯

示“C”,輸入“4”顯示“D”,輸入“5”結束。

參考程序:

#include<reg52.h>

ftinclude<stdio.h>

voidmain(void)

(

unsignedcharx;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

while(l)

(

printf(,zinputx:\n〃);〃輸出提示信息

scanf(〃%c〃,&x);

switch(x)

(

case'r:printf(〃A\n〃);break;

case'2':printf(〃B\n〃);break;

case'3':printf(〃C\n〃);break;

case'4':printf(〃D\n,z);break;

case'5':printfCQUIT\n,z);break;

default:printfCRETRY\n〃);;

)

if(x='5')break;

)

while(l);

)

13.輸入3個無符號的字符數(shù)據(jù),要求按由大到小的順序輸出。

參考程序:

#include<reg52.h>

#include<stdio.h>

voidmain(void)

(

unsignedcharx,y,z,m;

SC0N=0x52;〃串口初始化

TMOD=0x20;

TH1=OXF3;

TR1=1;

printf(,zinputx,y,z:〃);〃輸出提示信息

scanfC%c,%c,%c",&x,&y,&z);

printf(〃\n〃);

if(x<y){m=x;x=y;y=m;}

if(y<z){m=y;y=z;z=m;}

if(x<y){m=x;x=y;y=m;}

printf("output%c,%c,%c\rT,x,y,z);〃輸出

while(1);

)

14.用3種循環(huán)結構編寫程序?qū)崿F(xiàn)輸出1到10的平方之和。

參考程序:

(1)while循環(huán)

ttinclude<reg52.h>〃包含特殊功能寄存器庫

#include<stdio.h>〃包含I/O函數(shù)庫

voidmain(void)〃主函數(shù)

(

inti,s=0;〃定義整型變量

i=l;

SC0N=0x52;//串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

while(i<=10)〃累加1到10的平方之和在s中

(

s=s+i*i;

i++;

)

printf("1到10的平方之和=%d\n”,s);

while(l);

)

(2)dowhile循環(huán)

ttinclude<reg52.h>〃包含特殊功能寄存器庫

ttinclude<stdio.h>〃包含I/O函數(shù)庫

voidmain(void)〃主函數(shù)

(

inti,s=0;〃定義整型變量

i=l;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

do〃累加1到10的平方之和在s中

s=s+i*i;

i++;

)

while(i<=10);

printf("1到10的平方之和=%d\n",s);

whiled);

)

(3)for循環(huán)

ttinclude<reg52.h>〃包含特殊功能寄存器庫

tfinclude<stdio.h>〃包含I/O函數(shù)庫

voidmain(void)〃主函數(shù)

inti,s=0;〃定義整型變量

SCON=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

for(i=l;i<=10;i++)s=s+i*i;〃累加1到10的平方之和在s中

printf(〃1到10的平方之和二%d\n〃,s);

while(l);

)

15.對一個由5個元素組成的無符號字符數(shù)組按山小到大的順序進行排序。

參考程序:

#include<reg52.h>〃包含特殊功能寄存器庫

#include<stdio.h>〃包含I/O函數(shù)庫

main()

(

unsignedcharf[5],m,i,j;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

printf(〃輸入任意5個字符:〃);

scanfC%c,%c,%c,%c,%c〃,&f[2],&f[3],&f[4]);

printf(〃\n〃);

for(i=0;i<5;i++)

for(j=0;j<5-i;j++)

if(f[j]>f[j+l])

printf(〃由小到大的順序為*c,%c,%c,%c,枇〃,f[0],f[l],f[2],f[3],f[4]);

printf(〃\n");

while(l);

16.用指針實現(xiàn),輸入3個無符號字符數(shù)據(jù),按由大到小的順序輸出。

參考程序:

^include<reg52.h>〃包含特殊功能寄存器庫

#include<stdio.h>〃包含I/O函數(shù)庫

main()

{

unsignedcharx,y,z;

unsignedchar*p,*p1,*p2,*p3;

SC0N=0x52;〃串口初始化

TM01>0x20;

TH1=OXF3;

TR1=1;

printf("inputx,yandz:\n〃);

scanfC%c,%c,&x,&y,&z);

printf(〃\n〃);

pl=&x;p2=&y;p3=&z;

if(*pl<*p2){p=pl;pl=p2;p2=p;}

if(*p2<*p3){p=p2;p2=p3;p3=p;}

if(*pl<*p2){p=pl;pl=p2;p2=p;}

printf(z,maxtominis:%c,%c,%c\n,z,*pl,*p2,*p3);

while(l);

)

17.有3個學生,每個學生都包括學號、姓名和成績,要求找出成績最高的學生的姓名

和成績。

參考程序:

tfinclude<reg52.h>〃包含特殊功能寄存器庫

#include<stdio.h>〃包含I/O函數(shù)庫

structstudent

unsignedcharnumber[10];

unsignedcharname[10];

unsignedintgrade;

}pl[3];

main()

unsignedchari,j=0;

SC0N=0x52;〃串口初始化

TM01>0x20;

TH1=OXF3;

TR1=1;

printf(z/input3studendnumber,nameandgrade:\nz/);

for(i=0;i<3;i++)

(

printf(/zinputnumber:\nz,);

scanfpl[i].number);

printf("inputname:\nz/);

scanfpl[i].name);

printf(z/inputgrade:\n/z);

scanf&pl[i].grade);

}

for(i=l;i<3;i++)

(

if(pl[i].grade>pl[j],grade)j=i;

}

printf("成績最高的學生是:%s,成績是:%d",pl[j].name,pl[j].grade);

printf;

)

while(l);)

第五章

1.單片機C語言與匯編語言混合編程有哪幾種方式?通常采用什么方式?

答:單片機C語言和匯編語言混合編程分為匯編中調(diào)用C51函數(shù)和C51程序中引用匯編,

通常使用的是在C51程序中引用匯編。在C51程序中使用匯編語言有兩種情況:一種是匯編程

序部分和C51程序部分為不同的模塊,或不同的文件,通常山C51程序調(diào)用匯編程序模塊的變

量和函數(shù)(也可稱為子程序或過程);另一種是嵌入式匯編,即在C51程序中嵌入一段匯編語

言程序。

2.簡述C51程序調(diào)用匯編程序時如何實現(xiàn)參數(shù)傳遞。

答:C51中調(diào)用匯編程序進行參數(shù)傳遞時都必須嚴格遵守C51函數(shù)的參數(shù)和返回值的相關

約定。行參數(shù)傳遞的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實參會存

入相應的寄存器,在匯編中只需對相應寄存器進行操作,即可達到傳遞參數(shù)的目的;第二種

是通過固定存儲區(qū)傳遞。

3.簡述嵌入式匯編的實現(xiàn)方法。

答:在C51程序中嵌入?yún)R編程序通常的處理方法如下。

第一步:在C文件中以如下方式嵌入?yún)R編程序。

第二步:在KeilC51軟件的Project窗口右擊嵌入?yún)R編程序的C文件,在彈出的快捷菜

單中選擇Optionsfor...命令,選中右邊的GenerateAssemblerSRCFile和AssembleSRC

File復選框,使檢查框由灰色變成黑色(有效)狀態(tài)。

第三步:根據(jù)選擇的編譯模式,把相應的庫文件(如Small模式時,是

Keil\C51\Lib\C51S.Lib)加入到工程中,該文件必須作為工程的最后文件。

4.簡述C51中調(diào)用匯編程序的實現(xiàn)方法。

答:編寫為C51調(diào)用的匯編程序,參數(shù)須按規(guī)定的寄存器或存儲器傳送,程序格式有相

應的規(guī)則,這些規(guī)則比較繁瑣,為了便于處理,在實際中我們往往先用C51寫出這個程序的

主體,然后用SRC控制指令編譯產(chǎn)生asm文件,修改這個asm文件得到我們所要的匯編函數(shù)。

處理過程具體如下。

第一步:先用C語言程序編寫出程序框架,如文件名為al.c(注意參數(shù))。

第二步:在KeilC51的Project窗口中右擊該C語言文件,在彈出的快捷菜單中選擇

Optionsfor...,右邊的GenerateAssemblerSRCFile和AssembleSRCFile,使檢查框由

灰色變成黑色(有效)狀態(tài);

第三步:根據(jù)選擇的編譯模式,把相應的庫文件(如Small模式時,是Keil\C51\Lib\

C51S.Lib)加入工程中,該文件必須作為工程的最后文件。庫文件與編譯模式的關系如前面。

第四步:編譯后將會產(chǎn)生一個SRC的文件,將這個文件擴展名改為ASM。這樣就形成了可

供C51程序調(diào)用的匯編程序。隨后可在該文件的代碼段中加入所需的指令代碼。

第五步:將該匯編程序與調(diào)用它的主程序一起加到工程文件中,這時工程文件中不再需

要原來的C語言文件和庫文件,主程序只需要在程序開始處用EXTERN對所調(diào)用的匯編程序中

的函數(shù)作聲明,在主程序中就可調(diào)用匯編程序中的函數(shù)了.

第六章

1.何為“準雙向I/O接口”?在MCS-51單片機的四個并口中,哪些是“準雙向I/O接

口”?

答:準雙向I/O接口是能實現(xiàn)輸入輸出功能,但在使用時只能從輸入和輸出中選擇一個。

MCS-51單片機的四個并口中Pl、P2、P3是準雙向I/O接口。

2.80c51單片機內(nèi)部有幾個定時/計數(shù)器?它們由哪些功能寄存器組成?怎樣實現(xiàn)定

時功能和計數(shù)功能?

答:80c51單片機內(nèi)部有兩個16位的可編程定時/計數(shù)器,由THO,TLO,TH1,TL1,TMOD和

TCON功能寄存器組成。通過TMOD中的C/T位選擇對機器周期計數(shù)實現(xiàn)計數(shù)功能,選擇對外部

脈沖計數(shù)實現(xiàn)計數(shù)功能。

3.定時/計數(shù)器T0有幾種工作方式?各自的特點是什么?

答:有四種工作方式,特點見下表:

MlM0工作方式方式說明

00013位定時/計數(shù)器

01116位定時/計數(shù)器

1028位自動重置定時/計數(shù)器

113兩個8位定時/計數(shù)器(只有T0有)

4.定時/計數(shù)器的四種工作方式各自的計數(shù)范圍是多少?如果要計10個單位,不同的

方式初值應為多少?

答:有四種方式。方式0計數(shù)范圍:廣8192;方式1計數(shù)范圍:P65536;方式2計數(shù)范圍:

廣256;方式3計數(shù)范圍:「256。

如果計10個單位,方式0初值為:8192-10=8182;方式1初值為:65536-10=65526;方式

2初值為:256-10=246;方式2初值為:256-10=246。

5.設振蕩頻率為12MHz,如果用定時/計數(shù)器TO產(chǎn)生周期為100ms的方波,可以選擇哪

幾種方式,其初值分別設為多少?

答:只能選擇方式1,初值為65536-50000=15536。

6.何為同步通信?何為異步通信?各自的特點是什么?

答:異步通信方式的特點是數(shù)據(jù)在線路上傳送時是以一個字符(字節(jié))為單位,未傳送時

線路處于空閑狀態(tài),空閑線路約定為高電平“1”。特點是對發(fā)送時鐘和接收時鐘的要求相

對不高,線路簡單,但傳送速度較慢。

同步通信方式的特點是數(shù)據(jù)在線路上傳送時以字符塊為單位,一次傳送多個字符,傳送

時須在前面加上一個或兩個同步字符,后面加上校驗字符。特點是對發(fā)送時鐘和接收時鐘要

求較高,往往用同一個時鐘源控制,控制線路復雜,傳送速度快。

7.單工、半雙工和全雙工有什么區(qū)別?

答:單工方式只有一根數(shù)據(jù)線,信息只能單向傳送;半雙工方式也只有一根數(shù)據(jù)線,但

信息可以分時雙向傳送;全雙工方式有兩根數(shù)據(jù)線,在同?個時刻能夠?qū)崿F(xiàn)數(shù)據(jù)雙向傳送。

8.設某異步通信接口,每幀信息格式為10位,當接口每秒傳送1000個字符時,其波特

率為多少?

答:10000波特

9.串行口數(shù)據(jù)寄存器SBUF有什么特點?

答:發(fā)送數(shù)據(jù)寄存器和接收數(shù)據(jù)寄存器合起用一個特殊功能寄存器SBUF(串行口數(shù)據(jù)寄

存器),執(zhí)行MOVSBUF,A發(fā)送時為發(fā)送數(shù)據(jù)寄存器,執(zhí)行MOVA,SBUF接收時為接收數(shù)據(jù)寄

存器。

10.MCS-51單片機串行口有幾種工作方式?各自特點是什么?

答:有四種工作方式,分別是方式0、方式1、方式2和方式3。其中:

方式0,稱為同步移位寄存器方式,一般用于外接移位寄存器芯片擴展I/O接口。

方式1,稱為8位的異步通信方式,通常用于雙機通信。

方式2和方式3,稱為9位的異步通信方式,通常用于多機通信。

11.說明SM2在方式2和方式3對數(shù)據(jù)接收有何影響。

答:通過SM2對方式2和方式3數(shù)據(jù)接收進行控制,SM2=1,那么只有接收的第9位為“1”

才接收有效。如SM2=0,接收的第9位無論為1還是0都接收有效。

12.怎樣來實現(xiàn)利用串行口擴展并行輸入/輸出口?

答:利用串行口在方式0時,當外接一個串入并出的移位寄存器,就可以擴展并行輸出

口;當外接一個并入串出的移位寄存器時,就可以擴展并行輸入口。

13.什么是中斷、中斷允許和中斷屏蔽?

答:在計算機中,由于計算機內(nèi)外部的原因或軟硬件的原因,使CPU從當前正在執(zhí)行的

程序中暫停下來,而自動轉(zhuǎn)去執(zhí)行預先安排好的為處理該原因所對應的服務程序。執(zhí)行完服

務程序后,再返回被暫停的位置繼續(xù)執(zhí)行原來的程序,這個過程稱為中斷,實現(xiàn)中斷的硬件

系統(tǒng)和軟件系統(tǒng)稱為中斷系統(tǒng)。中斷允許是允許中斷請求送CPU產(chǎn)生中斷,中斷屏蔽是禁止

中斷請求信號送CPU產(chǎn)生中斷。

14.8051有兒個中斷源?中斷請求如何提出?

答:MCS-51單片機提供5個硬件中斷源:兩個外部中斷源INTO(P3.2)和INTI(P3.3),

兩個定時/計數(shù)器TO和T1中斷;1個串行口中斷。

外部中斷源INTO和1NT1的中斷請求信號從外部引腳P3.2和P3.3輸入:兩個定時/計數(shù)

器T0和T1的溢出中斷TFO和TF1定時/計數(shù)器T0(或T1)溢出時提出;串行口中斷由發(fā)送中斷標

志T1和接收中斷標志R1產(chǎn)生。

15.8051的中斷源中,哪些中斷請求信號在中斷響應時可以自動清除?哪些不能自動清

除?應如何處理?

答:工作在邊沿觸發(fā)方式下的兩個外部中斷源和兩個定時/計數(shù)器中斷中斷請求信號在

中斷響應時可以自動清除,工作在電平觸發(fā)方式下的兩個外部中斷源和串行口中斷不能自動

清除。工作在電平觸發(fā)方式下的兩個外部中斷源的中斷請求信號通過外加硬件和加軟件的方

式清除,串行口中斷標志T1和標志R1完全由軟件清除。

16.8051的中斷優(yōu)先級有幾級?在形成中斷嵌套時各級有何規(guī)定?

答:8051的中斷優(yōu)先級有兩級;形成中斷嵌套時規(guī)定(D正在進行的中斷過程不能

被新的同級或低優(yōu)先級的中斷請求所中斷,直到該中斷服務程序結束,返回了主程序且執(zhí)行

了主程序中的一條指令后,CPU才響應新的中斷請求。

(2)正在進行的低優(yōu)先級中斷服務程序能被高優(yōu)先級中斷請求所中斷,實現(xiàn)兩級中斷嵌

套。

(3)CPU同時接收到幾個中斷請求時,首先響應優(yōu)先級最高的中斷請求。

17.設8051的P1中各位接發(fā)光二極管,分別用匯編語言和C語言編程實現(xiàn)逐個輪流點亮

二極管,并循環(huán)顯示。

參考程序:

ORG0000H

LJMPMAIN

ORGO1OOH;主程序

MAIN:MOVA,#O1H

LOOP:MOVPl,A

CALLDELAY

RLA

SJMPLOOP

SJMP$

DELAY:MOVR7,#OFFH

DJNZR7,$

RET

END

C語言程序:

#include<reg51.h>〃包含特殊功能寄存器庫

voiddelay(unsignedintx);

voidmain()

(

unsignedchari,j;

while(l)

{i=01;

for(j=0;j<8;j++)

{Pl=i;

delay(100);

i=i*2;

)

)

)

voiddelay(unsignedintx)

unsignedcharj;

while(x一)

{for(j=0;j<125;j++);}

18.8051系統(tǒng)中,已知振蕩頻率為12MHz,用定時/計數(shù)器TO,實現(xiàn)從PL0產(chǎn)生周期為2ms

的方波。要求分別用匯編語言和C語言進行編程。

解:分析:從PL0輸出周期為2ms的方波,只須P1.0每1ms取反一次則可。當系統(tǒng)時鐘為

12MHZ,定時7計數(shù)器T0工作于方式1時,最大的定時時間為65.536ms,滿足1ms的定時要求,

方式控制字應設定為OOOOOOOIB(OIH)。定時1ms,計數(shù)值N為1000,初值X=65536-1000=64536,

則THO=FCH,TL0=18Ho

采用中斷處理方式:

程序如下:

ORG0000H

LJMPMAIN

ORGOOOBH;中斷處理程序

MOVTHO,#OFCH

MOVTLO,#18H

CPLP1.0

RETI

ORG0100H;主程序

MAIN:MOVTMOD,#01H

MOVTII0,#OFCH

MOVTLO,#18H

SETBEA

SETBETO

SETBTRO

SJMP$

END

C語言程序:

#include<reg51.h>〃包含特殊功能寄存器庫

sbitPl_0=Pr0;

voidmain()

TM0D=0x01;

TH0-0xFC;TL0=0xl8;

EA=1;ETO=1;

TRO=1;

while(l);

)

voidtimeO_int(void)interrupt1〃中斷服務程序

(

TH0=0xFC;TL0=0xl8;

P1_O=!P1_O;

19.8051系統(tǒng)中,已知振蕩頻率為12MHz,用定時/計數(shù)器T1,實現(xiàn)從PL1產(chǎn)生周期為2s

的方波。要求分別用匯編語言和C語言進行編程。

解:

從PL1產(chǎn)生2s的方波,應產(chǎn)生500ms的周期性的定時,定時到對PL1取反就可實現(xiàn)。山

于定時時間較長,一個定時/計數(shù)器T1不能直接實現(xiàn),采用定時/計數(shù)器T1產(chǎn)生周期性為10ms

的定時;然后用一個寄存器R2對10ms計數(shù)100次來實現(xiàn)。系統(tǒng)時鐘為12MHZ,定時/計數(shù)器T1

定時10ms,計數(shù)值N為10000,只能選方式1,方式控制字為00010000B(10H),初值X:

X=65536-l0000=55536=1101100011110000B

則THl=H011000B=D8H,TLl=11110000B=F0Ho

定時/計數(shù)器T1采用中斷處理方式。

匯編程序:

ORG0000H

LJMPMAIN

ORG001BH

LJMPINTT1

ORG01OOH

MAIN:MOVTMOD,#10H

MOVTH1,#0D8H

MOVTL1,#OFOH

MOVR2,#OOH

SETBEA

SETBET1

SETBTRI

溫馨提示

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

評論

0/150

提交評論