單片機(jī)原理及應(yīng)用(林立張俊亮版)課后習(xí)題答案_第1頁
單片機(jī)原理及應(yīng)用(林立張俊亮版)課后習(xí)題答案_第2頁
單片機(jī)原理及應(yīng)用(林立張俊亮版)課后習(xí)題答案_第3頁
單片機(jī)原理及應(yīng)用(林立張俊亮版)課后習(xí)題答案_第4頁
單片機(jī)原理及應(yīng)用(林立張俊亮版)課后習(xí)題答案_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第一章習(xí)題

1.什么是單片機(jī)?單片機(jī)和通用微機(jī)相比有何特點(diǎn)?

答:單片機(jī)又稱為單片微計算機(jī),它的結(jié)構(gòu)特點(diǎn)是將微型計算機(jī)的基本功能部件(如中央處理器(CPU)、存儲器、輸入接口、輸出接口、定時/計數(shù)器及終端系統(tǒng)等)全部集成在一個半導(dǎo)體芯片上。

雖然單片機(jī)只是一個芯片,但無論從組成還是從邏輯功能上來看,都具有微機(jī)系統(tǒng)的定義。與通用的微型計算機(jī)相比,單片機(jī)體積小巧,可以嵌入到應(yīng)用系統(tǒng)中作為指揮決策中心,是應(yīng)用系統(tǒng)實(shí)現(xiàn)智能化。

2.單片機(jī)的發(fā)展有哪幾個階段?8位單片機(jī)會不會過時,為什么?

答:單片機(jī)誕生于1971年,經(jīng)歷了SCM、MCU、SOC三大階段,早期的SCM單片機(jī)都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上發(fā)展出了MCS51系列MCU系統(tǒng)?;谶@一系統(tǒng)的單片機(jī)系統(tǒng)直到現(xiàn)在還在廣泛使用。隨著工業(yè)控制領(lǐng)域要求的提高,開始出現(xiàn)了16位單片機(jī),但因為性價比不理想并未得到很廣泛的應(yīng)用。90年代后隨著消費(fèi)電子產(chǎn)品大發(fā)展,單片機(jī)技術(shù)得到了巨大提高。隨著INTEL

i960系列特別是后來的ARM系列的廣泛應(yīng)用,32位單片機(jī)迅速取代16位單片機(jī)的高端地位,并且進(jìn)入主流市場。然而,由于各應(yīng)用領(lǐng)域大量需要的仍是8位單片機(jī),因此各大公司紛紛推出高性能、大容量、多功能的新型8位單片機(jī)。

目前,單片機(jī)正朝著高性能和多品種發(fā)展,但由于MCS-51系列8位單片機(jī)仍能滿足絕大多數(shù)應(yīng)用領(lǐng)域的需要,可以肯定,以MCS-51系列為主的8位單片機(jī),在當(dāng)前及以后的相當(dāng)一段時間內(nèi)仍將占據(jù)單片機(jī)應(yīng)用的主導(dǎo)地位。

3.舉例說明單片機(jī)的主要應(yīng)用領(lǐng)域。

答:單片機(jī)廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過程控制等領(lǐng)域,大致可分如下幾個范疇:智能儀器

單片機(jī)具有體積小、功耗低、控制功能強(qiáng)、擴(kuò)展靈活、微型化和使用方便等優(yōu)點(diǎn),廣泛應(yīng)用于儀器儀表中,結(jié)合不同類型的傳感器,可實(shí)現(xiàn)諸如電壓、電流、功率、頻率、濕度、溫度、流量、速度、厚度、角度、長度、硬度、元素、壓力等物理量的測量。采用單片機(jī)控制使得儀器儀表數(shù)字化、智能化、微型化,且功能比起采用電子或數(shù)字電路更加強(qiáng)大。例如精密的測量設(shè)備(電壓表、功率計,示波器,各種分析儀)。

工業(yè)控制

單片機(jī)具有體積小、控制功能強(qiáng)、功耗低、環(huán)境適應(yīng)能力強(qiáng)、擴(kuò)展靈活和使用方便等優(yōu)點(diǎn),用單片機(jī)可以構(gòu)成形式多樣的控制系統(tǒng)、數(shù)據(jù)采集系統(tǒng)、通信系統(tǒng)、信號檢測系統(tǒng)、無線感知系統(tǒng)、測控系統(tǒng)、機(jī)器人等應(yīng)用控制系統(tǒng)。例如工廠流水線的智能化管理,電梯智能化控制、各種報警系統(tǒng),與計算機(jī)聯(lián)網(wǎng)構(gòu)成二級控制系統(tǒng)等。

家用電器現(xiàn)在的家用電器廣泛采用了單片機(jī)控制,從電飯煲、洗衣機(jī)、電冰箱、空調(diào)機(jī)、彩電、其他音響視頻器材、再到電子秤量設(shè)備和白色家電等。

網(wǎng)絡(luò)和通信

現(xiàn)代的單片機(jī)普遍具備通信接口,可以很方便地與計算機(jī)進(jìn)行數(shù)據(jù)通信,為在計算機(jī)網(wǎng)絡(luò)和通信設(shè)備間的應(yīng)用提供了極好的物質(zhì)條件,現(xiàn)在的通信設(shè)備基本上都實(shí)現(xiàn)了單片機(jī)智能控制,從手機(jī),電話機(jī)、小型程控交換機(jī)、樓宇自動通信呼叫系統(tǒng)、列車無線通信、再到日常工作中隨處可見的移動電話,集群移動通信,無線電對講機(jī)等。

醫(yī)用設(shè)備領(lǐng)域

單片機(jī)在醫(yī)用設(shè)備中的用途亦相當(dāng)廣泛,例如醫(yī)用呼吸機(jī),各種分析儀,監(jiān)護(hù)儀,超聲診斷設(shè)備及病床呼叫系統(tǒng)等等。

模塊化系統(tǒng)

某些專用單片機(jī)設(shè)計用于實(shí)現(xiàn)特定功能,從而在各種電路中進(jìn)行模塊化應(yīng)用,而不要求使用人員了解其內(nèi)部結(jié)構(gòu)。如音樂集成單片機(jī),看似簡單的功能,微縮在純電子芯片中(有別于磁帶機(jī)的原理),就需要復(fù)雜的類似于計算機(jī)的原理。如:音樂信號以數(shù)字的形式存于存儲器中(類似于ROM),由微控制器讀出,轉(zhuǎn)化為模擬音樂電信號(類似于聲卡)。在大型電路中,這種模塊化應(yīng)用極大地縮小了體積,簡化了電路,降低了損壞、錯誤率,也方便于更換。

汽車電子

單片機(jī)在汽車電子中的應(yīng)用非常廣泛,例如汽車中的發(fā)動機(jī)控制器,基于CAN總線的汽車發(fā)動機(jī)智能電子控制器、GPS導(dǎo)航系統(tǒng)、abs防抱死系統(tǒng)、制動系統(tǒng)、胎壓檢測等。

此外,單片機(jī)在工商、金融、科研、教育、電力、通信、物流和國防航空航天等領(lǐng)域都有著十分廣泛的用途。

4.將十進(jìn)制數(shù)37轉(zhuǎn)換為二進(jìn)制,BCD碼和十六進(jìn)制數(shù),并對轉(zhuǎn)換結(jié)果進(jìn)行對比分析。

答:37=(100101)B=(25)H;BCD

碼為

0011

0111;

可見,同一個數(shù)用不同進(jìn)制表示,其結(jié)果也不同。

5.寫出下列十進(jìn)制數(shù)在8位微機(jī)中的原碼,反碼和補(bǔ)碼形式。

(1)+36

原碼

0010

0100B

反碼

0010

0100B

補(bǔ)碼

0010

0100B

(2)-36

原碼

1010

0100B

反碼

1101

1011B

補(bǔ)碼

1101

1100B

(3)+127

原碼

0111

1111B

反碼

0111

1111B補(bǔ)碼

0111

1111B

(4)-128

原碼

1000

0000B

反碼

0111

1111B

補(bǔ)碼

1000

0000B

(5)-121

原碼

1111

1001B

反碼

1000

0110B

補(bǔ)碼

1000

0111B

6.對于二進(jìn)制數(shù)1000

1001B,若理解為無符號數(shù),則該數(shù)對應(yīng)十進(jìn)制數(shù)為多少?若理解為有符號數(shù),則該數(shù)對應(yīng)十進(jìn)制為多少?若理解為BCD數(shù),則該數(shù)對應(yīng)十進(jìn)制數(shù)為多少?

答:1000

1001B無符號數(shù):137有符號數(shù):-9;

BCD數(shù):89;

7.對下列各組數(shù)進(jìn)行“與”,“或”和“異或”運(yùn)算。

(1)1010

1010

和0000

0000與

0000

0000或

1010

1010異或

1010

1010(2)0111

0111

和1000

1000與

0000

0000或

1111

1111異或

1111

1111(3)1110

1110

0111

0111與

0110

0110或

1111

1111異或

1001

1001(4)0011

1100

1111

0000與

0011

0000或

1111

1100異或

1100

11008.Proteus

ISIS的工作界面中包含哪幾個窗口?菜單欄中包含哪幾個選項?

答:Proteus

ISIS的工作界面主要包括標(biāo)題欄、菜單欄、工具欄、狀態(tài)欄、方位控制按鈕、仿真進(jìn)程控制按鈕、對象選擇窗口,原理圖編輯窗口和預(yù)覽窗口等。

主菜單欄包含文件、查看、編輯、工具、設(shè)計、圖形、源文件、調(diào)試、庫、模板、系統(tǒng)、幫助選項。

9.利用ISIS模塊開發(fā)單片機(jī)系統(tǒng)需要經(jīng)過哪幾個主要步驟?

答:(1)啟動ISIS;(2)繪制電路原理圖;

(3)輸入單片機(jī)程序;

(4)進(jìn)行源代碼調(diào)試;

(5)仿真運(yùn)行。

10.何謂PCB?利用ARES模塊進(jìn)行PCB設(shè)計需要經(jīng)過哪幾個主要步驟?

答:PCB(Printed

Circuit

Board),中文名稱為印制電路板,又稱印刷電路板、印刷線路板,是重要的電子部件,是電子元器件的支撐體,是電子元器件電氣連接的提供者。由于它是采用電子印刷術(shù)制作的,故被稱為“印刷”電路板。

利用ARES模塊進(jìn)行PCB設(shè)計的主要步驟:

(1)啟動ARES;

(2)元器件布局;

(3)元器件布線;

(4)鋪銅;

(5)三維效果圖;

(6)CADCAM輸出。第2章MCS-51單片機(jī)結(jié)構(gòu)及原理習(xí)題MSC-51單片機(jī)內(nèi)部由哪些功能部件組成,各有什么功能?答:以51單片機(jī)為例,其內(nèi)部功能部件有:控制器:是對取自程序存儲器中的指令進(jìn)行譯碼,在規(guī)定的時刻發(fā)出各種操作所需的控制信號,完成指令所規(guī)定的功能;運(yùn)算器:根據(jù)控制器發(fā)來的信號,執(zhí)行算術(shù)邏輯運(yùn)算操作;存儲器:包括程序存儲和數(shù)據(jù)存儲器;定時器計數(shù)器:2個16位定時器/計數(shù)器,可對機(jī)器周期計數(shù),也可對外部輸入脈沖計數(shù);中斷系統(tǒng):可響應(yīng)三個內(nèi)部中斷源和兩個外部中斷源的中斷請求;輸入輸出接口:4個8位并行口和一個全雙工串行口;2.MSC-51單片機(jī)外部引腳的名稱是什么?各有什么功能?答:(1)電源及晶振引腳VCC(40腳):+5V電源引腳VSS(20腳):接地引腳XTAL1(19腳);外接晶振引腳(內(nèi)置放大器輸入端)XTAL2(18腳):外接晶振引腳(內(nèi)置放大器輸出端)(2)控制引腳RST/VPD(9)為復(fù)位/備用電源引腳ALE/PROG(30)為地址鎖存使能輸出/編程脈沖輸入PSEN(29):輸出訪問片外程序存儲器讀選通信號EA/VPP(31):外部ROM允許訪問/編程電源輸入(3)并行I/O口引腳P0.0~P0.7(39~32腳)——P0口; P1.0~P1.7(1~8腳)——P1口;P2.0~P2.7(21~28腳)——P2口;P3.0~P3.7(10~17腳)——P3口。3.51系列單片機(jī)的封裝有哪些類型?請說明每一種封裝引腳之間的距離。答:51系列單片機(jī)的封裝有:40引腳雙列直插封裝(DIP——dualin-linepackage),引腳之間的距離是100mil();44引腳方形扁平封裝(QFP——quadflatpackage)方式,引腳之間的距離是;44引腳帶引線的塑料芯片載體PLCC(PlasticLeadedChipCarrier)。4.什么是復(fù)位?單片機(jī)復(fù)位電路有哪幾種,工作原理分別是什么?答:復(fù)位——使單片機(jī)恢復(fù)原始默認(rèn)狀態(tài)的操作。單片機(jī)復(fù)位電路有:上電復(fù)位電路,由電阻和電容構(gòu)成,通過上電時,電容相當(dāng)于短路而使復(fù)位引腳在晶振有效的情況下保持2個機(jī)器周期的高電平;按鈕開關(guān)復(fù)位電路,由兩個電阻的分壓構(gòu)成,通過手工按下按鈕,使復(fù)位引腳在晶振有效的情況下保持2個機(jī)器周期的高電平。5.通常的微機(jī)系統(tǒng)存儲器結(jié)構(gòu)有哪幾種?MCS-51單片機(jī)存儲器屬于哪一類?CS-51可尋址多大空間?答:通常的微機(jī)系統(tǒng)存儲器結(jié)構(gòu)有兩種結(jié)構(gòu),即哈佛結(jié)構(gòu)和馮諾依曼結(jié)構(gòu)(也叫普林斯頓結(jié)構(gòu)),MCS-51單片機(jī)存儲器屬于,MCS-51可尋址空間是兩個64KB,即64KB的程序存儲空間和64KB的數(shù)據(jù)存儲空間。6.片內(nèi)RAM中低128個單元劃分為哪三個主要部分?各部分的主要功能是什么?答:片內(nèi)RAM中低128個單元劃分為三個部分:①工作寄存器區(qū)(00H-1FH),四組,每組8個,可作用工作寄存器切換使用;②可位尋址區(qū)(20H-2FH),16B,位地址為00H-7FH,用作為按位尋址的空間;③用戶RAM區(qū)(30H-7FH),80B,用作普通RAM單元或堆棧。7.程序狀態(tài)字寄存器PSW各位的定義是什么?答:程序狀態(tài)字寄存器PSW各位的定義如下:CYCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PPSW.7PSW.6PSW.5PSW.4PSW.3PSW.2PSW.1PSW.0PSW.7:進(jìn)/借位標(biāo)志CY,加法有進(jìn)位時置1,減法有借位時置1;PSW.6:輔助進(jìn)位標(biāo)志AC,加法運(yùn)算低四位向高上四位有進(jìn)位時置1;PSW.5、PSW.1:用戶標(biāo)志位F0和用戶標(biāo)志位F1,保存用戶的位數(shù)據(jù);PSW.4、PSW.3:工作寄存器選擇控制位RS1和RS0,00至11分別選擇四組工作之一作為當(dāng)前工作寄存器PSW.2:溢出標(biāo)志位OV,有符號數(shù)加、減運(yùn)算結(jié)果有溢出或乘除上結(jié)果異常(乘法運(yùn)算結(jié)果大于255即乘積在BA中,或除法運(yùn)算除數(shù)為0)時置1PSW.0:奇偶標(biāo)志位P,累加器A中1的個數(shù)為奇數(shù)時置1。8.什么是時鐘周期?什么是機(jī)器周期?什么是指令周期?當(dāng)振蕩頻率為12MHz時,一個機(jī)器周期為多少微秒?答:時鐘周期又叫振蕩周期或拍,用P表示,是MCS-51單片機(jī)中最小的時間單位,在一個時鐘周期內(nèi),CPU完成一個最基本的動作。機(jī)器周期:由12個時鐘周期構(gòu)成,完成一個基本操作指令周期:是執(zhí)行一條指令所需的時間,根據(jù)指令的復(fù)雜性,可由1~4個機(jī)器周期構(gòu)成。當(dāng)振蕩頻率為12MHz時,一個機(jī)器周期為1微秒。9.P0、P1、P2和P3口的結(jié)構(gòu)和功能分別是什么?答:P0口的每一位由1個鎖存器、2個三態(tài)緩沖器、1個輸出控制電路(非門X、與門、電子開關(guān)MUX、輸出驅(qū)動電路構(gòu)成,其功能既可以作為通用I/O口實(shí)現(xiàn)輸入/輸出功能,也可作為單片機(jī)地址線的低8位和數(shù)據(jù)線實(shí)現(xiàn)外部擴(kuò)展功能。在用作輸入輸出口時,需外接上拉電阻。P1口的每一位由1個鎖存器、1個場效應(yīng)管驅(qū)動器V和2個三態(tài)門緩沖器構(gòu)成,其作用是用作輸入輸出口P2口的每一位由1個鎖存器、2個三態(tài)緩沖器、1個輸出控制單元、1個輸出驅(qū)動單元構(gòu)成,其功能是用作輸入輸出口,或地址總線的高8位。P3口的每一位由1個鎖存器、2個三態(tài)緩沖器、1個第二功能控制單元、1個輸出驅(qū)動單元構(gòu)成,其作用是用作輸入輸出口或第二功能。10.51單片機(jī)引腳ALE的作用是什么?當(dāng)51不外接存儲器時,ALE上的輸出的脈沖頻率是多少?答:51單片機(jī)引腳ALE的作用是對外部存儲尋址時鎖存P0口輸出的低8位地址,當(dāng)51不外接存儲器時,ALE上的輸出的脈沖頻率是fosc/6。第3章單片機(jī)的匯編語言與程序設(shè)計習(xí)題1.MCS-51單片機(jī)有哪幾種尋址方式?適用于什么地址空間?答:MCS-51單片機(jī)有7種尋址方式:直接尋址、寄存器尋址、寄存器間接尋址、立即尋址、變址尋址、位尋址、相對尋址。直接尋址方式:操作數(shù)的地址由指令直接給出,適用于片內(nèi)RAM的所有地址空間;如 MOV A,68H MOV A,PSW寄存器尋址方式:指令給出的是寄存器的編碼,操作數(shù)在編碼指定的寄存器中,適用于片內(nèi)00H至1FH的32個字節(jié),用R0,…,R7表示,通過PSW的RS1和RS0選擇組號確定對應(yīng)32個字節(jié)中的其中8個,還有累加器A,以及乘除法指令中的A和B寄存器,位尋址方式中的布爾累加器C; MOV A,R1 MUL AB INC DPTR寄存器間接尋址方式:指令給出的是寄存器的編碼,操作數(shù)地址在編碼指定的寄存器中,適用于片內(nèi)RAM的全部空間,其中52系列中的80H至FFH只能用寄存器間接尋址;如 MOV A,@R0 MOV A,@R1 MOVX A,@DPTR立即尋址方式:操作數(shù)本身在指令中直接,給出適用于用8位立即數(shù)對片內(nèi)RAM所有地址單元賦值,也可用16位立即數(shù)對DPTR賦值;如 MOV A,#0E2H MOV DPTR,#2000H變址尋址方式:以DPTR或PC作為基地址寄存器,以累加器A作為變址寄存器,將基址寄存器與變址寄存器的內(nèi)容相加形成操作數(shù)的實(shí)際地址的一種尋址方式,變址尋址方式適用于程序存儲器ROM,僅有三條指令如下:MOVC A,@A+DPTR MOVC A,@A+PC JMP @A+DPTR位尋址方式:指令中直接給出操作數(shù)所在單元的位地址,適用于片內(nèi)RAM中地址20H至2FH中的16個字節(jié)中的128個位地址空間和80H至FFH中地址中可以被8整除的所有SFR中的每個位地址空間;如 MOV C,7FH MOV F0,C MOV C,ACC.7相對尋址方式:為相對轉(zhuǎn)移指令而設(shè),指令中直接給出轉(zhuǎn)移的相對偏移量,其轉(zhuǎn)移目標(biāo)在當(dāng)前指令-128至+127字節(jié)范圍內(nèi)的地址空間。如 SJMP START HERE: SJMP HERE ;等效于: SJMP $2.MCS-51單片機(jī)的PSW程序狀態(tài)字中無ZERO(零)標(biāo)志位,怎樣判斷某內(nèi)部數(shù)據(jù)單元的內(nèi)容是否為零?答:MCS-51單片機(jī)的PSW程序狀態(tài)字中無ZERO(零)標(biāo)志位,判斷某內(nèi)部數(shù)據(jù)單元的內(nèi)容是否為零是能通過取數(shù)到A累加器,再判斷A中的每一位是否為零來確定其值是否為零。3.編程將內(nèi)部RAM的20H--30H單元內(nèi)容清零。解:設(shè)一個片內(nèi)RAM指針R0,先指向首地址20H,通過累加器A清零,然后采用間接尋址方式依次將A中的零值傳送到指針?biāo)傅钠瑑?nèi)RAM單元,每傳送一個字節(jié),地址指針加1,直到達(dá)到地址為30H或達(dá)到計數(shù)器規(guī)定的17個字節(jié)為止。程序1: MOV R0,#20H ;設(shè)地址指針初值 CLR A ;累加器清0CONT: MOV @R0,A ;置0指針?biāo)竼卧? INC R0 ;地址指針加1 CJNE R0,#31H,CONT ;指針未超過終點(diǎn)則繼續(xù) SJMP $ ;暫停程序2: MOV R0,#20H ;設(shè)地址指針初值 CLR A ;累加器清0 MOV R7,#17 ;計數(shù)器賦初值,從20H到30H共17個字節(jié)CONT: MOV @R0,A ;置0指針?biāo)竼卧? INC R0 ;地址指針加1 DJNZ R7,CONT ;計數(shù)器減1,非0,則繼續(xù) SJMP $ ;暫停4.編程查找內(nèi)部RAM的32H~41H單元中是否有0AAH這個數(shù)據(jù),若有這一數(shù)據(jù),則將50H單元置為0FFH,否則將50H單元清零。解:設(shè)一個片內(nèi)RAM指針R0,先指向首地址32H,比較@R0與#0AAH,若相等,則退出循環(huán),給50H單元賦0FFH,若不相等,則R0加1為繼續(xù)比較下一個字節(jié)做準(zhǔn)備,直到達(dá)到地址為41H或達(dá)到計數(shù)器規(guī)定的16個字節(jié)為止還沒找到,則給50H單元賦00H程序1: MOV R0,#32H ;設(shè)地址指針初值CONT: CJNE @R0,#0AAH,NEXT;比較查找值與指針?biāo)竼卧闹担幌嗟绒D(zhuǎn)移 MOV A,#0FFH ;相等,則準(zhǔn)備好要賦的標(biāo)志值0FFH SJMP DOWN ;轉(zhuǎn)存到保存結(jié)果處NEXT: INC R0 ;修改地址指針 CJNE R0,#42H,CONT ;若指針未越過終點(diǎn),則繼續(xù) MOV A,#00H ;查找失敗,則將00H存入結(jié)果標(biāo)志單元DOWN: MOV 50H,A ;將比較結(jié)果標(biāo)志存入50H單元 SJMP $ ;暫停 END程序2: MOV R7,#16 ;計數(shù)器賦初值,從20H到30H共16個字節(jié) MOV R0,#32H ;設(shè)地址指針初值CONT: CJNE @R0,#0AAH,NEXT ;比較查找值與指針?biāo)竼卧闹担幌嗟绒D(zhuǎn)移 MOV A,#0FFH ;相等,則準(zhǔn)備好要賦的標(biāo)志值0FFH SJMP DOWN ;轉(zhuǎn)存到保存結(jié)果處NEXT: INC R0 ;修改地址指針 DJNZ R7,CONT ;計數(shù)器減1,非0,則繼續(xù) MOV A,#00H ;查找失敗,則將00H存入結(jié)果標(biāo)志單元DOWN: MOV 50H,A ;將比較結(jié)果標(biāo)志存入50H單元 SJMP $ ;暫停 END5.查找20H~4FH單元中出現(xiàn)00H的次數(shù),并將查找結(jié)果存入50H單元。解:從20H到4FH共48個字節(jié) MOV R7,#48 ;字節(jié)計數(shù)器賦初值MOV R0,#20H ;設(shè)地址指針初值CONT: CJNE @R0,#00H,NEXT ;比較查找值與指針?biāo)竼卧闹?,不相等轉(zhuǎn)移 INC R6 ;相等,0的個數(shù)計數(shù)器加1NEXT: INC R0 ;修改地址指針 DJNZ R7,CONT ;計數(shù)器減1,非0,則繼續(xù) MOV 50H,R6 ;保存O的個數(shù)計數(shù)值到50H單元 SJMP $ ;暫停 END END6.已知A=83H,R0=17H,(17H)=34H,寫出下列程序段執(zhí)行之后的A中的內(nèi)容。ANL A,#17HORL 17H,AXRL A,@R0CPL A END答: ANL A,#17H ;A=03H ORL 17H,A ;(17H)=00110100∨00000011=00110111 XRL A,@R0 ;A=00000011∨00110111=00110100 CPL A ;A=110010117.已知單片機(jī)的晶振頻率為12MHz,分別設(shè)計延時為0.1s、1s的子程序。答:已知單片機(jī)的晶振頻率為12MHz,則機(jī)器周期為1us,延時子程序是通過執(zhí)行指令序列中機(jī)器周期數(shù)來達(dá)到,如果要0.1s,即100ms,也就是100000us,所以需要機(jī)器周期數(shù)達(dá)到100000。要延時達(dá)到1S,可通過對延時為0.1秒的子程序調(diào)用10次來實(shí)現(xiàn)。DELAY100MS: MOVR6,#200 ;1個機(jī)器周期D1: MOVR7,#250 ;1個機(jī)器周期D2: NOP ;1個機(jī)器周期 DJNZR7,D2 ;2個機(jī)器周期,3*251=753 DJNZR6,D1 ;2個機(jī)器周期,(1+753+2)*132=99792 RET ;2個機(jī)器周期,1+99792+2=99795,約100msDELAY1S: MOV R7,#10 ;計數(shù)10次 1LOOP: ACALL DELAY100MS ;延時100ms子程序 99795+2 DJNZ R7,LOOP ;未達(dá)到10次則繼續(xù) 10*(2+99795+2) RET ;返回2+10*(2+99795+2)=9979928.內(nèi)部RAM從20H單元開始處有一數(shù)據(jù)塊,以O(shè)DH為結(jié)束標(biāo)志,試統(tǒng)計該數(shù)據(jù)塊的長度,將該數(shù)據(jù)塊送到外部數(shù)據(jù)存儲器7E01H開始的單元,并將長度存入7E00H單元。解:從20H的指針用R0,從外部RAM7E01開始的指針用DPTR,計數(shù)器用R7 MOV R7,#0 ;字節(jié)計數(shù)器賦初值 MOV R0,#20H ;設(shè)片內(nèi)RAM地址指針初值 MOV DPTR,#7E01H ;設(shè)片外RAM地址指針初值CONT: MOV A,@R0 ;取片內(nèi)RAM中的一個字節(jié) MOVX @DPTR,A ;存入片外RAM指針?biāo)竼卧? INC R7 ;長度計數(shù)器加1 INC R0 ;片內(nèi)RAM地址指針加1 INC DPTR ;片外RAM地址指針加1 CJNE A,#0DH,CONT ;未達(dá)到結(jié)束標(biāo)志 MOV A,R7 ;取塊計數(shù)長度值 MOVX @DPTR,A ;保存 SJMP $ ;暫停 END9.內(nèi)部RAM從DATA開始的區(qū)域中存放著10個單字節(jié)十進(jìn)制數(shù),求其累加和,并將結(jié)果存入SUM和SUM+1單元。解:R7計數(shù),R6保存累加和高8位,R0用作地址指針 ORG 0000H LJMP MAIN ORG 100HSUM EQU 30HDATAA EQU 40HMAIN: MOV R7,#10 ;字節(jié)計數(shù)器賦初值 MOV R0,#DATAA ;設(shè)片內(nèi)RAM地址指針初值 CLR A ;累加器清0 MOV R6,A ;累加結(jié)果的高8位CONT: ADD A,@R0 ;加RAM中的一個字節(jié)到ACC DA A JNC NEXT ;若無進(jìn)位則不用管高8位 INC R6 ;有進(jìn)位,高8位加1NEXT: INC R0 ;片內(nèi)RAM地址指針加1 DJNZ R7,CONT ;未完繼續(xù) MOV SUM,A ;保存低8位 MOV SUM+1,R6 ;保存高8位 SJMP $ ;暫停 END10.內(nèi)部RAM從DATA1和DATA2單元開始處存放著兩個等長的數(shù)據(jù)塊,數(shù)據(jù)塊的長度在LEN單元中。請編程檢查這兩個數(shù)據(jù)塊是否相等,若相等,將0FFH寫入RESULT單元,否則將0寫入RESULT單元。解:從DATA1開始的指針用R0,從DATA2開始的指針用R1,計數(shù)器用R7LEN EQU 10DATA1 EQU 30HDATA2 EQU 40HRESULT EQU 50H MOV R7,#LEN ;字節(jié)計數(shù)器賦初值 MOV R0,#DATA1 ;設(shè)片內(nèi)RAM地址指針初值 MOV R1,#DATA2 ;設(shè)片外RAM地址指針初值CONT: MOV A,@R0 ;取片內(nèi)RAMR0所指的的一個字節(jié) MOV 7FH,@R1 ;將R1所指單元內(nèi)容取到片內(nèi)RAM地址7FH中 CJNE A,7FH,NOEQ ;比較,不相等則結(jié)束 INC R0 ;DATA1RAM地址指針加1 INC R1 ;DATA2RAM地址指針加1 DJNZ R7,CONT ;未完,繼續(xù) MOV A,#0FFH ;相等,準(zhǔn)備寫入FFH SJMP DOWN ;轉(zhuǎn)寫入結(jié)果處NOEQ: MOV A,#0 ;不相等,準(zhǔn)備寫入00HDOWN: MOV RESULT,A ;保存比較結(jié)果標(biāo)志 SJMP $ ;暫停 END11.編制程序,將內(nèi)部RAM中M1、M2、M3和M4單元中的無符號數(shù)xl、x2、x3和x4相加,并把和存入RO和R1(R0中為高8位)中。解:M1 EQU 30HM2 EQU 40HM3 EQU 45HM4 EQU 4FH MOV A,M1 ;取第一個數(shù) ADD A,M2 ;與第二個數(shù)相加 JNC NEXT1 ;如果無進(jìn)位,則轉(zhuǎn)移至第三個相加 MOV R0,#1 ;有進(jìn)位,高8位置1NEXT1: ADD A,M3 ;與第三個數(shù)相加 JNC NEXT2 ;沒有進(jìn)位,則轉(zhuǎn)至第四個數(shù)相加 INC R0 ;有進(jìn)位,高8位加1NEXT2: ADD A,M4 ;與第四個數(shù)相加 JNC NEXT3 ;沒有進(jìn)位,則轉(zhuǎn)至結(jié)束 INC R0 ;有進(jìn)位,高8位再加1NEXT3: MOV R1,A ;低8位保存到R1 SJMP $ ;暫停 END第4章單片機(jī)的C51語言習(xí)題1.C語言的優(yōu)點(diǎn)是什么?C程序的主要結(jié)構(gòu)特點(diǎn)是什么?答:C語言是一種高級語言,學(xué)習(xí)比低級容易,不需要具體組織、分配存儲器資源和處理端口數(shù)據(jù),可以直接驅(qū)動單片機(jī)的所有資源。C程序以函數(shù)為單位,由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)是程序的入口,其他函數(shù)由主函數(shù)直接或間接調(diào)用。程序可以由一個文件或多個文件組成。文件類型包括頭文件和C語言源文件,也可以是匯編語言文件,C程序可與匯編語言混合編程。2.C51語言的變量定義包含哪些關(guān)鍵因素?為何這樣考慮?答:C語言的變量定義格式如下:[存儲種類]數(shù)據(jù)類型[存儲類型]變量名其中:存儲種類與標(biāo)準(zhǔn)C語言相同,包括:自動型(auto)、外部型(extern)、靜態(tài)型(static)、寄存器型(register)。數(shù)據(jù)類型除了包含標(biāo)準(zhǔn)C語言類型的字符型(char),整型(int),長整型(long),浮點(diǎn)型(float),雙精度型(double)外,還有二進(jìn)制位型(bit),特殊功能寄存器型(sfr),SFR可位尋址的位類型(sbit)。存儲類型包括:片內(nèi)RAM區(qū)(data)、片內(nèi)可位尋址區(qū)(bdata),片內(nèi)RAM間接尋址區(qū)(idata),片外RAM頁尋址區(qū)(pdata),片外RAM區(qū)(xdata)、ROM區(qū)(code)。只所以比標(biāo)準(zhǔn)C語言多了存儲類型,就是因為MCS-51單片機(jī)的存儲結(jié)構(gòu)中有四個物理存儲空間(片內(nèi)RAM、片內(nèi)ROM,片外RAM,片外ROM),三個邏輯地址空間(片內(nèi)RAM,片外RAM,ROM),而且有多種尋址方式(直接尋址、間接尋址、頁面尋址、位尋址)所致,所以在定義變量時,要根據(jù)其所在位置和尋址方式明確指定存儲類型。3.C51與匯編語言的特點(diǎn)各有哪些?怎樣實(shí)現(xiàn)兩者的優(yōu)勢互補(bǔ)?答:C51是結(jié)構(gòu)化語言,代碼緊湊;接近自然語言,程序可讀性強(qiáng),易于調(diào)試、維護(hù);庫函數(shù)豐富,編程工作量小,可使產(chǎn)品開發(fā)周期短;具有機(jī)器級控制能力,功能很強(qiáng),適合于嵌入式系統(tǒng)開發(fā);匯編指令無關(guān),易于掌握,上手快。 匯編語言優(yōu)點(diǎn)是編寫的程序代碼精煉、執(zhí)行速度快,在相同功能下,匯編語言程序可能比C語言程序效率高。缺點(diǎn)是對程序員要求高,必須對單片機(jī)的硬件結(jié)構(gòu)非常熟悉才能編程,不便于編寫比較復(fù)雜的程序??筛鶕?jù)需要對要求時間性很強(qiáng)的代碼用匯編語言編寫,其它部分用C語言編寫,兩者混合編程就可以實(shí)現(xiàn)優(yōu)勢互補(bǔ)。4.指出下面程序的語法錯誤:#include<reg51.h>main(){a=C;inta=7,Cdelay(10)voiddelay();{cgari;for(i=O;i<=255;”++”);}答:#include<reg51.h>main(){a=C; //a和C必須先定義才可使用inta=7,C //缺分號,應(yīng)該提在使用前說明delay(10) //延時子程序必須先定義,或先有函數(shù)原型說明voiddelay();{ //作為函數(shù)定義,有函數(shù)定義不能嵌套的問題,//即不能在一個函數(shù)內(nèi)定義另一個函數(shù),而且“{”前不應(yīng)有分號//作為函數(shù)原型說明,應(yīng)該放在函數(shù)調(diào)用之前,且其后不應(yīng)該接函數(shù)體cgari; //字符型應(yīng)該是unsignedcharfor(i=O;i<=255;”++”);//”++”應(yīng)改成i++}//主函數(shù)沒有結(jié)束,缺”}”5.定義變量a,b,c,其中a為內(nèi)部RAM的可位尋址區(qū)的字符變量,b為外部數(shù)據(jù)存儲區(qū)浮點(diǎn)型變量,c為指向int型xdata區(qū)的指針。答: charbdataa; floatxdatab; intxdata*c;6.編程將8051的內(nèi)部數(shù)據(jù)存儲器20H單元和35H單元的數(shù)據(jù)相乘,結(jié)果存到外部數(shù)據(jù)存儲器中(任意位置)。解:方法一:用嵌入式匯編語言實(shí)現(xiàn)#include<reg51.h>voidmain(){ #pragma asm MOV A,20H MOV B,35H MUL AB MOV DPTR,#1234H MOVX @DPTR,A INC DPTR MOV A,B MOVX @DPTR,A #pragma endasm}方法二:單用C語言編程實(shí)現(xiàn)#include<reg51.h>#include<math.h>intmovdata(char);voidmain(){unsignedintxdatax;unsignedchar*ptr,a,b;ptr=0x25;a=*ptr;ptr=0x30;b=*ptr;x=a*b;}7.8051的片內(nèi)數(shù)據(jù)存儲器25H單元中存放有一個0~10的整數(shù),編程求其平方根(精確到5位有效數(shù)字),將平方根放到30H單元為首址的內(nèi)存中。解:方法一:用C語言與匯編語言混合編程實(shí)現(xiàn)//用C語言編寫的主函數(shù)MAIN.C#include<reg51.h>#include<math.h>chargetdata(char);voidmain(){chara=0x25,c;floatf;c=getdata(a);f=sqrt(c);};用匯編語言編寫的取數(shù)據(jù)子函數(shù),只有一個地址參數(shù)在R7中,返回值為指定地址單元中的內(nèi)容,用R7返回主函數(shù)。PUBLIC_GETDATADE SEGMENTCODERSEG DE_GETDATA: MOV A,R7 ;取地址參數(shù) MOV R0,A MOV A,@R0 MOV R7,A ;返回地址單元中的內(nèi)容EXIT: RET END方法二:單用C語言編程實(shí)現(xiàn)//MAIN.C#include<reg51.h>#include<math.h>intmovdata(char);voidmain(){charn;char*ptr;float*ptr2;floatf;ptr=0x25;n=*ptr;f=sqrt(n);ptr2=0x30;*ptr2=f;}8.將外部RAM10H~15H單元的內(nèi)容傳送到內(nèi)部RAM10H~15H單元。解:方法一:采用C語言與匯編語言混合編程//用C語言編寫的主函數(shù)MAIN.C#include<reg51.h>charmovdata(char,char);voidmain(){ chara=0x10,b=0x06;movdata(a,b);};用匯編語言編寫的移動數(shù)據(jù)子函數(shù)MOVDATA,其中第一個參數(shù)在R7中為首地址,第二個參數(shù)在R5中為字節(jié)數(shù)PUBLIC_MOVDATADE SEGMENTCODERSEG DE_MOVDATA: MOV A,R7 ;取參數(shù) MOV R0,ALOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOPEXIT: RET END方法二:單用C語言編程實(shí)現(xiàn)//MAIN.C#include<reg51.h>intmovdata(char);voidmain(){charn=6;char*ptr1=0x10;charxdata*ptr2;ptr2=0x20;while(n--){*ptr2++=*ptr1++;}}9.內(nèi)部RAM20H、21H和22H、23H單元分別存放著兩個無符號的16位數(shù),將其中的大數(shù)置于24H和25H單元。解:方法一:#include<reg51.h>voidmain(){ unsignedint*ptr; //設(shè)置一個內(nèi)部RAM指針unsignedintx,y,z; ptr=0x20; //指向0x20單元x=*ptr; //取第一個數(shù)ptr=0x22; //指向0x22單元y=*ptr; //取第二個數(shù)z=(x>y)?x:y; //將兩數(shù)中的較大者賦給zptr=0x24; //指向地址為0x24的目標(biāo)單元*ptr=z; //將大數(shù)存入目標(biāo)單元}方法二:#include<reg51.h>#include<absacc.h>voidmain(){ unsignedintx,y,z; x=DBYTE[0X20]*256+DBYTE[0X21];y=DBYTE[0X22]*256+DBYTE[0X23];z=(x>y)?x:y; //將兩數(shù)中的較大者賦給zDBYTE[0X24]=z/256; DBYTE[0X25]=z%256;}方法三:#include<reg51.h>unsignedintx_at_0x20;unsignedinty_at_0x22;unsignedintz_at_0x24;voidmain(){ z=(x>y)?x:y;}第4章單片機(jī)的C51語言習(xí)題1.C語言的優(yōu)點(diǎn)是什么?C程序的主要結(jié)構(gòu)特點(diǎn)是什么?答:C語言是一種高級語言,學(xué)習(xí)比低級容易,不需要具體組織、分配存儲器資源和處理端口數(shù)據(jù),可以直接驅(qū)動單片機(jī)的所有資源。C程序以函數(shù)為單位,由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)是程序的入口,其他函數(shù)由主函數(shù)直接或間接調(diào)用。程序可以由一個文件或多個文件組成。文件類型包括頭文件和C語言源文件,也可以是匯編語言文件,C程序可與匯編語言混合編程。2.C51語言的變量定義包含哪些關(guān)鍵因素?為何這樣考慮?答:C語言的變量定義格式如下:[存儲種類]數(shù)據(jù)類型[存儲類型]變量名其中:存儲種類與標(biāo)準(zhǔn)C語言相同,包括:自動型(auto)、外部型(extern)、靜態(tài)型(static)、寄存器型(register)。數(shù)據(jù)類型除了包含標(biāo)準(zhǔn)C語言類型的字符型(char),整型(int),長整型(long),浮點(diǎn)型(float),雙精度型(double)外,還有二進(jìn)制位型(bit),特殊功能寄存器型(sfr),SFR可位尋址的位類型(sbit)。存儲類型包括:片內(nèi)RAM區(qū)(data)、片內(nèi)可位尋址區(qū)(bdata),片內(nèi)RAM間接尋址區(qū)(idata),片外RAM頁尋址區(qū)(pdata),片外RAM區(qū)(xdata)、ROM區(qū)(code)。只所以比標(biāo)準(zhǔn)C語言多了存儲類型,就是因為MCS-51單片機(jī)的存儲結(jié)構(gòu)中有四個物理存儲空間(片內(nèi)RAM、片內(nèi)ROM,片外RAM,片外ROM),三個邏輯地址空間(片內(nèi)RAM,片外RAM,ROM),而且有多種尋址方式(直接尋址、間接尋址、頁面尋址、位尋址)所致,所以在定義變量時,要根據(jù)其所在位置和尋址方式明確指定存儲類型。3.C51與匯編語言的特點(diǎn)各有哪些?怎樣實(shí)現(xiàn)兩者的優(yōu)勢互補(bǔ)?答:C51是結(jié)構(gòu)化語言,代碼緊湊;接近自然語言,程序可讀性強(qiáng),易于調(diào)試、維護(hù);庫函數(shù)豐富,編程工作量小,可使產(chǎn)品開發(fā)周期短;具有機(jī)器級控制能力,功能很強(qiáng),適合于嵌入式系統(tǒng)開發(fā);匯編指令無關(guān),易于掌握,上手快。 匯編語言優(yōu)點(diǎn)是編寫的程序代碼精煉、執(zhí)行速度快,在相同功能下,匯編語言程序可能比C語言程序效率高。缺點(diǎn)是對程序員要求高,必須對單片機(jī)的硬件結(jié)構(gòu)非常熟悉才能編程,不便于編寫比較復(fù)雜的程序??筛鶕?jù)需要對要求時間性很強(qiáng)的代碼用匯編語言編寫,其它部分用C語言編寫,兩者混合編程就可以實(shí)現(xiàn)優(yōu)勢互補(bǔ)。4.指出下面程序的語法錯誤:#include<reg51.h>main(){a=C;inta=7,Cdelay(10)voiddelay();{cgari;for(i=O;i<=255;”++”);}答:#include<reg51.h>main(){a=C; //a和C必須先定義才可使用inta=7,C //缺分號,應(yīng)該提在使用前說明delay(10) //延時子程序必須先定義,或先有函數(shù)原型說明voiddelay();{ //作為函數(shù)定義,有函數(shù)定義不能嵌套的問題,//即不能在一個函數(shù)內(nèi)定義另一個函數(shù),而且“{”前不應(yīng)有分號//作為函數(shù)原型說明,應(yīng)該放在函數(shù)調(diào)用之前,且其后不應(yīng)該接函數(shù)體cgari; //字符型應(yīng)該是unsignedcharfor(i=O;i<=255;”++”);//”++”應(yīng)改成i++}//主函數(shù)沒有結(jié)束,缺”}”5.定義變量a,b,c,其中a為內(nèi)部RAM的可位尋址區(qū)的字符變量,b為外部數(shù)據(jù)存儲區(qū)浮點(diǎn)型變量,c為指向int型xdata區(qū)的指針。答: charbdataa; floatxdatab; intxdata*c;6.編程將8051的內(nèi)部數(shù)據(jù)存儲器20H單元和35H單元的數(shù)據(jù)相乘,結(jié)果存到外部數(shù)據(jù)存儲器中(任意位置)。解:方法一:用嵌入式匯編語言實(shí)現(xiàn)#include<reg51.h>voidmain(){ #pragma asm MOV A,20H MOV B,35H MUL AB MOV DPTR,#1234H MOVX @DPTR,A INC DPTR MOV A,B MOVX @DPTR,A #pragma endasm}方法二:單用C語言編程實(shí)現(xiàn)#include<reg51.h>#include<math.h>intmovdata(char);voidmain(){unsignedintxdatax;unsignedchar*ptr,a,b;ptr=0x25;a=*ptr;ptr=0x30;b=*ptr;x=a*b;}7.8051的片內(nèi)數(shù)據(jù)存儲器25H單元中存放有一個0~10的整數(shù),編程求其平方根(精確到5位有效數(shù)字),將平方根放到30H單元為首址的內(nèi)存中。解:方法一:用C語言與匯編語言混合編程實(shí)現(xiàn)//用C語言編寫的主函數(shù)MAIN.C#include<reg51.h>#include<math.h>chargetdata(char);voidmain(){chara=0x25,c;floatf;c=getdata(a);f=sqrt(c);};用匯編語言編寫的取數(shù)據(jù)子函數(shù),只有一個地址參數(shù)在R7中,返回值為指定地址單元中的內(nèi)容,用R7返回主函數(shù)。PUBLIC_GETDATADE SEGMENTCODERSEG DE_GETDATA: MOV A,R7 ;取地址參數(shù) MOV R0,A MOV A,@R0 MOV R7,A ;返回地址單元中的內(nèi)容EXIT: RET END方法二:單用C語言編程實(shí)現(xiàn)//MAIN.C#include<reg51.h>#include<math.h>intmovdata(char);voidmain(){charn;char*ptr;float*ptr2;floatf;ptr=0x25;n=*ptr;f=sqrt(n);ptr2=0x30;*ptr2=f;}8.將外部RAM10H~15H單元的內(nèi)容傳送到內(nèi)部RAM10H~15H單元。解:方法一:采用C語言與匯編語言混合編程//用C語言編寫的主函數(shù)MAIN.C#include<reg51.h>charmovdata(char,char);voidmain(){ chara=0x10,b=0x06;movdata(a,b);};用匯編語言編寫的移動數(shù)據(jù)子函數(shù)MOVDATA,其中第一個參數(shù)在R7中為首地址,第二個參數(shù)在R5中為字節(jié)數(shù)PUBLIC_MOVDATADE SEGMENTCODERSEG DE_MOVDATA: MOV A,R7 ;取參數(shù) MOV R0,ALOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOPEXIT: RET END方法二:單用C語言編程實(shí)現(xiàn)//MAIN.C#include<reg51.h>intmovdata(char);voidmain(){charn=6;char*ptr1=0x10;charxdata*ptr2;ptr2=0x20;while(n--){*ptr2++=*ptr1++;}}9.內(nèi)部RAM20H、21H和22H、23H單元分別存放著兩個無符號的16位數(shù),將其中的大數(shù)置于24H和25H單元。解:方法一:#include<reg51.h>voidmain(){ unsignedint*ptr; //設(shè)置一個內(nèi)部RAM指針unsignedintx,y,z; ptr=0x20; //指向0x20單元x=*ptr; //取第一個數(shù)ptr=0x22; //指向0x22單元y=*ptr; //取第二個數(shù)z=(x>y)?x:y; //將兩數(shù)中的較大者賦給zptr=0x24; //指向地址為0x24的目標(biāo)單元*ptr=z; //將大數(shù)存入目標(biāo)單元}方法二:#include<reg51.h>#include<absacc.h>voidmain(){ unsignedintx,y,z; x=DBYTE[0X20]*256+DBYTE[0X21];y=DBYTE[0X22]*256+DBYTE[0X23];z=(x>y)?x:y; //將兩數(shù)中的較大者賦給zDBYTE[0X24]=z/256; DBYTE[0X25]=z%256;}方法三:#include<reg51.h>unsignedintx_at_0x20;unsignedinty_at_0x22;unsignedintz_at_0x24;voidmain(){ z=(x>y)?x:y;}第5章單片機(jī)的中斷系統(tǒng)習(xí)題1.什么是中斷、中斷源、中斷優(yōu)先級和中斷嵌套?答:中斷是指單片機(jī)內(nèi)部有一個中斷管理系統(tǒng),它對內(nèi)部的定時器事件、串行通信的發(fā)送和接收及外部事件(如鍵盤按鍵動作)等進(jìn)行自動的檢測判斷。當(dāng)CPU正在處理某件事情(例如正在執(zhí)行主程序)的時候,外部或內(nèi)部發(fā)生的某一事件(如某個引腳上電平的變化,一個脈沖沿的發(fā)生或計數(shù)器的計數(shù)溢出等)請求CPU迅速處理,于是,中斷管理系統(tǒng)會置位相應(yīng)標(biāo)志通知CPU暫時中止當(dāng)前的工作,迅速轉(zhuǎn)去處理所發(fā)生的事件。處理完該事件后,再回到原來被中止的地方,繼續(xù)原來的工作,這樣的過程稱為中斷。引發(fā)中斷的事件稱為中斷源。將中斷事件按輕重緩急分若干級別叫中斷優(yōu)先級。允許中斷優(yōu)先級高的中斷源中斷正在執(zhí)行的低優(yōu)先級的中斷服務(wù)程序叫中斷嵌套。2.什么叫中斷源?MCS-51有哪些中斷源?各有什么特點(diǎn)?它們的中斷向量地址分別是多少?答:中斷源即引發(fā)中斷的事件。MCS-51單片機(jī)有5個中斷源,它們是外部中斷0,定時器T0,外部中斷1,定時器T1,串行口。外部中斷源是由引腳的觸發(fā)信號引起的中斷,定時器中斷源是由于定時器計數(shù)器的溢出引發(fā)的中斷,串行口是由于串行通信的發(fā)送或接收引發(fā)的中斷。外部中斷0,定時器T0,外部中斷1,定時器T1,串行口五個中斷源的中斷向量地址依次為:0003H,000BH,0013H,001BH,0023H。3.MCS-51中斷的中斷響應(yīng)條件是什么?答:(1)中斷源有中斷請求;(2)此中斷源允許位為1,即中斷源可以向CPU發(fā)中斷請求;(3)CPU開總中斷,即EA=1;(4)無同級或者更高級中斷正在服務(wù)4.MCS-51的中斷響應(yīng)過程是怎樣的?答:(1)將相應(yīng)的中斷優(yōu)先級狀態(tài)觸發(fā)器置1,以阻斷后來的同級和低級中斷請求;(2)由硬件清除相應(yīng)的中斷請求標(biāo)志,串行口的發(fā)送和接收中斷除外;(3)執(zhí)行一條硬件LCALL指令,即把程序計數(shù)器PC的內(nèi)容壓入堆棧保存,再將相應(yīng)的中斷服務(wù)程序的入口地址送入PC;5.編寫出外部中斷1為下跳沿觸發(fā)的中斷初始化程序。解:voidInt1_init(){ IT1=1; EA=1;EX1=1; //IE=0x84;//IE|=0x84;}6.有一外部中斷源,接入端,當(dāng)其中有中斷請求時,要求CPU把一個從內(nèi)部RAM30H單元開始的50個字節(jié)的數(shù)據(jù)塊傳送到外部RAM從1000H開始的連續(xù)存儲區(qū)。請編寫對應(yīng)的程序。解: #include<reg51.h> voidmain(){ IT0=1

;EA=1; EX0=1; while(1)

; } voidintx0()interrupt0using1{ char*ptr1=0x30; charxdata*ptr2=0x1000; for(i=0;i<50;i++)*ptr2++=*ptr1++; }7.設(shè)fosc=12MHz,利用定時器,TO(工作在方式2)在P1.1引腳上獲取輸出周期為O.4ms的方波信號,定時器溢出時采用中斷方式處理,請編寫,T0的初始化程序及中斷服務(wù)程序。解:fosc=12MHz,則機(jī)器周期=1us;當(dāng)T0工作在方式2時,其最大定時時間為256us,要輸出周期為0.4mS即400us的方波信號,則其高、低電平應(yīng)各為200us,顯然當(dāng)定時器T0按方式2工作時,只需計數(shù)達(dá)到200次即可,因此其時間常數(shù)初值為256-200=56。在T0的中斷服務(wù)程序中,只需將P1.1引腳求反即可。#include<reg51.h>sbitP1_1=P1^1;voidtimer0()interrupt1using1{P1_1=!P1_1;}voidmain(){P1_1=0;TMOD=0x02;TH0=56;TL0=56;IE=0x82;TR0=1;for(;;){}}8.設(shè)fosc=6MHz,要求每隔50ms,從內(nèi)部RAM以30H開始的數(shù)據(jù)存儲區(qū)傳送一個字節(jié)數(shù)據(jù)到外部RAM以2000H開始的連續(xù)存儲區(qū),共傳送50個數(shù)據(jù)。要求:采用定時器T1以方式2實(shí)現(xiàn)定時,數(shù)據(jù)傳送在中斷服務(wù)程序中完成。解:fosc=6MHz,機(jī)器周期=12/6*10-6S=2us,T1工作在方式2時,最大定時時間為512us,要定時50ms,可以計數(shù)100次,每次定時500us來實(shí)現(xiàn),方式2定時500us需計數(shù)250次,故其時間常數(shù)為256-250=6。#include<reg51.h>charintcnt=0;charmovcnt=0;char*ptr1=0x30;charxdata*ptr2=0x2000;voidtimer1()interrupt3using1{ intcnt++; if(intcnt==100){if(mocnt<50){*ptr2++=*ptr1++;movcnt++; } elseEX1=0; intcnt=0; }}voidmain(){TMOD=0x20;TH1=6;TL1=6;IE=0x84;TR1=1;for(;;){}}9.805l單片機(jī)只有兩個外部中斷源,若要擴(kuò)展成8個外部中斷源,請畫出實(shí)現(xiàn)這種擴(kuò)展的硬件線路圖,并說明如何確定各中斷源的優(yōu)先級。解:用按鈕開關(guān)模擬中斷源的中斷請求,INT0單獨(dú)作為一個中斷源,INT1擴(kuò)展成7個中斷源,有中斷請求時,借助于P2口識別是這七個中斷源是哪個請求中斷,為了驗證正確性,如果是INT0中斷,則在P0口的數(shù)碼管上顯示0,是INT1中斷,則根據(jù)從上到下是哪個中斷源在P0口的數(shù)碼管上顯示1—7。具體電路和程序如下:#include<reg51.h>charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};voidINT0_srv(void)interrupt0using1//外部中斷0處理程序{P0=led_mod[0];}voidINT1_srv(void)interrupt2using2//外部中斷1處理程序{charintnum;intnum=P2;switch(intnum){case0xfe:P0=led_mod[1];break; case0xfd:P0=led_mod[2];break; case0xfb:P0=led_mod[3];break; case0xf7:P0=led_mod[4];break; case0xef:P0=led_mod[5];break; case0xdf:P0=led_mod[6];break; case0xbf:P0=led_mod[7];}}voidmain(){EA=1; EX0=1;EX1=1;P0=0;while(1);}第6章單片機(jī)的定時器/計數(shù)器習(xí)題1.MCS-51系列的8051單片機(jī)內(nèi)有幾個定時/計數(shù)器?每個定時/計數(shù)器有幾種工作方式?如何選擇?答:MCS-51系列的8051單片機(jī)內(nèi)有2個定時/計數(shù)器,即T0和T1,每個都可以編程為定時器或計數(shù)器,T0有四種工作方式(方式0—13位、方式1—16位、方式2-可自動裝入初值的8位、方式3-兩個8位),T1有三種工作方式(與T0相同的前三種),通過對TMOD的設(shè)置選擇,其高四位選擇T1,低四位選擇T0。2.如果采用的晶振頻率為3MHz,定時/計數(shù)器TO分別工作在方式0、1和2下,其最大的定時時間各為多少?答:如果采用的晶振頻率為3MHz,機(jī)器周期為12×1/(3*106)=4us,由于定時/計數(shù)器TO工作在方式0、1和2時,其最大的計數(shù)次數(shù)為8192、65536和256所以,其最大定時時間分別是:方式0為8192×4us=32.768ms、方式1為65536×4us=262.144ms、方式2為256×4us=1024us。3.定時/計數(shù)器TO作為計數(shù)器使用時,其計數(shù)頻率不能超過晶振頻率的多少?答:由于定時/計數(shù)器TO作為計數(shù)器使用時,是對外部引腳輸入的脈沖進(jìn)行計數(shù),CPU在每個機(jī)器周期采樣一次引腳,當(dāng)前一次采樣為高電平,后一次采樣為低電平,則為一次有效計數(shù)脈沖,所以如果晶振頻率為fosc,則其采樣頻率fosc/12,兩次采樣才能決定一次計數(shù)有效,所以計數(shù)頻率不能超過fosc/24。4.簡單說明定時/計數(shù)器在不同工作模式下的特點(diǎn)。答:方式0為13位的定時/計數(shù)器,由THx的8位和TLx的低5位構(gòu)成、方式1為16位的定時/計數(shù)器,由THx的8位和TLx的8位構(gòu)成,方式2為8位的定時/計數(shù)器,TLx為加1計數(shù)器,THx為計數(shù)初值寄存器。方式3只能用于T0,是將T0的低8位用作一個獨(dú)立的定時/計數(shù)器,而高8位的TH0用作一個獨(dú)立的定時器,并借用T1的TR1和TF1作為高8位定時器的啟??刂莆缓鸵绯鰳?biāo)志位。5.定時器工作在方式2時有何特點(diǎn)?適用于什么應(yīng)用場合?答:定時器工作在方式2時是一個可自動裝入時間常數(shù)初值的8位定時/計數(shù)器,TLx為加1計數(shù)器,THx為計數(shù)初值寄存器。由于其恢復(fù)初值由硬件自動完成,所以當(dāng)需要反復(fù)計數(shù)時,用方式2可以方便地實(shí)現(xiàn)精確的定時。6.一個定時器的定時時間有限,如何采用兩個定時器的串行定時來實(shí)現(xiàn)較長時間的定時?答:一個定時器的定時時間有限,可采用兩個定時器的串行定時來實(shí)現(xiàn)較長時間的定時,比如,當(dāng)fosc=12MHz時,單個定時/計數(shù)器采用方式1的最大定時時間為65.536ms,此時若用另一個定時/計數(shù)器按方式1進(jìn)行溢出次數(shù)計數(shù),在定時器溢出中斷時,給計數(shù)器發(fā)一個計數(shù)脈沖,且兩者均為方式一,則兩者串行可達(dá)到的定時時間為65536×65.536ms=4294967.296ms。7.設(shè)MCS-51單片機(jī)的晶振頻率為12MHz,請編程使P1.O端輸出頻率為20kHz的方波。解:fosc=12MHz,所以機(jī)器周期為1us。20kHz的方波周期為1/(20×1000)=50us,方波即高電平和低電平和時間相等,所以只需設(shè)一個定時器定時25us將P1.O求反一次即可。由于題目沒有規(guī)定,所以可以用查詢方式,也可以用中斷方式進(jìn)行編程實(shí)現(xiàn)。方法一:采用查詢方式實(shí)現(xiàn)#include<reg51.h>sbitP1_0=P1^0;//定義輸出引腳變量voidmain(){P1_0=0; //輸出初值為0TMOD=0x02; //T0方式2定時TH0=256-25; //計25次,計數(shù)初值為模256減25TL0=TH0; TR0=1; //啟動T0while(1) //無限循環(huán)if(TF0){ //查詢T0溢出標(biāo)志 TF0=0; //溢出標(biāo)志復(fù)位 P1_0=!P1_0; //輸出求反 }}方法二:采用中斷方式實(shí)現(xiàn)#include<reg51.h>sbitP1_0=P1^0;//定義輸出引腳變量voidmain(){P1_0=0; //輸出初值為0TMOD=0x02; //T0方式2定時TH0=256-25; //計25次,計數(shù)初值為模256減25TL0=TH0;IE=0x82; //允許CPU響應(yīng)中斷,允許T0發(fā)中斷請求TR0=1; //啟動T0for(;;){} //無限循環(huán)等待中斷}timer0()interrupt1using1{P1_0=!P1_0; //輸出求反}8.采用定時/計數(shù)器TO對外部脈沖進(jìn)行計數(shù),每計數(shù)10O個脈沖,TO切換為定時工作方式。定時1ms后,又轉(zhuǎn)為計數(shù)方式,如此循環(huán)不止。假定MCS-5l單片機(jī)的晶體振蕩器的頻率為6MHz,要求T0工作在方式1狀態(tài),請編寫出相應(yīng)程序。解:晶體振蕩器的頻率為6MHz,則機(jī)器周期為12×1/(6*106)=2us,要定時1ms,需計數(shù)次數(shù)為1000/2=500次#include<reg51.h>sbitP1_0=P1^0;voidmain(){while(1){TMOD=0x05;//T0計數(shù),方式一TH0=(65536-100)/256;//計數(shù)100次TL0=(65536-100)%256;TR0=1;while(!TF0);//等待計數(shù)100次的溢出TF0=0; //溢出標(biāo)志復(fù)位TMOD=0x01;//T0定時,方式一TH0=(65536-500)/256;//計數(shù)100次TL0=(65536-500)%256;TR0=1; //啟動T0while(!TF0); //等待定時時間到1ms的溢出TF0=0; //溢出標(biāo)志復(fù)位}}9.設(shè)單片機(jī)的fosc=12MHz,使P1.O和P1.1分別輸出周期為1ms和lOms的方波,請用定時器TO方式2編程實(shí)現(xiàn)。解:fosc=12MHz,所以機(jī)器周期為1us。要使P1.0輸出周期為1000us的方波,可以通過定時中斷方式實(shí)現(xiàn),定時時間為250us,定時計數(shù)2次來實(shí)現(xiàn),對P1.0求反即可。要使P1.1輸出周期為10ms的方波,也可以通過定時中斷方式實(shí)現(xiàn),定時時間為5ms,當(dāng)時間到時,對P1.1求反即可。由于5ms/250us=20,所以也可以通過對250us的定時計數(shù)20次來實(shí)現(xiàn)。程序如下:#include<reg51.h>sbitP1_0=P1^0;//輸出周期為400us的方波的引腳sbitP1_1=P1^1;//輸出周期為10ms的方波的引腳unsignedcharnum1=0,num2=0;//中斷次數(shù)計數(shù)器,初值為0voidmain(){P1_0=0; //輸出初值為0P1_1=0; //輸出初值為0TMOD=0x02; //T0方式2定時TH0=256-250;//計200次,計數(shù)初值為模256減200TL0=TH0;IE=0x82; //允許CPU響應(yīng)中斷,允許T0發(fā)中斷請求TR0=1; //啟動T0for(;;){} //無限循環(huán)等待中斷}voidtimer0()interrupt1using1{num1++;num2++; //中斷次數(shù)加1if(num1==2) //中斷次數(shù)達(dá)到2次{P1_0=!P1_0;//輸出P1_0求反num1=0;//中斷次數(shù)復(fù)位為0}if(num2==20){ //中斷次數(shù)達(dá)到20次num2=0; //中斷次數(shù)復(fù)位為0 P1_1=!P1_1; //輸出P1_1求反}}10.編寫程序,要求使用TO,采用方式2定時,在P1.0輸出周期為400us占空比為10:1的矩形脈沖。解:設(shè)fosc=12MHz,則機(jī)器周期為1us。設(shè)P1.0初值為0。周期為400us,可定義方式2定時,計數(shù)初值為256-40,一個周期中斷10次為400us,在中斷計數(shù)為1和2(或任意兩次計數(shù)之間)時,對P1.0求反即可。#include<reg51.h>sbitP1_0=P1^0;//輸出周期引腳unsignedcharcnt=0;//中斷次數(shù)計數(shù)器,初值為0voidmain(){P1_0=0; //輸出初值為0TMOD=0x02; //T0方式2定時TH0=256-40; //計40次,計數(shù)初值為模256減40TL0=TH0;IE=0x82; //允許CPU響應(yīng)中斷,允許T0發(fā)中斷請求TR0=1; //啟動T0for(;;){} //無限循環(huán)等待中斷}voidtimer0()interrupt1using1{cnt++;//中斷次數(shù)加1if(cnt==1||cnt==2)P1_0=!P1_0;//中斷次數(shù)為1或2時對輸出引腳求反if(cnt==10)cnt=0;//中斷次數(shù)達(dá)到10時復(fù)位為0}第七章7.1.什么事串行異步通信?在串行異步通信中,數(shù)據(jù)幀的傳輸格式是什么?含義如何?答:串行異步通信是指在串行通信中發(fā)送端和接收端可以由各自的時鐘來控制數(shù)據(jù)的發(fā)送和接收,這兩個時鐘源彼此獨(dú)立,互不同步。數(shù)據(jù)幀的傳輸格式:起始位,數(shù)據(jù)位,奇偶校驗位和停止位含義:起始位用于實(shí)現(xiàn)發(fā)送和接收雙方設(shè)備之間的同步;數(shù)據(jù)位包含所要傳輸?shù)男畔?;奇偶校驗位用于判斷接收?shù)據(jù)的正確性;停止位表示一幀數(shù)據(jù)發(fā)送結(jié)束,開始下一幀數(shù)據(jù)的傳輸。7.3.89C51單片機(jī)串行通信接口控制寄存器有幾個?每個寄存器的含義是什么?答:有電源控制寄存器PCON和串行口控制寄存器SCONPCON中SMOD與串口通信有關(guān)。SMOD=0;串口方式1,2,3時,波特率正常。SMOD=1;串口方式1,2,3時,波特率加倍其余與串行通信無關(guān)SCON中SM0、SM1:串行口工作方式控制位SM2:多機(jī)通信控制位REN:串行口接收使能控制端;REN=1時,允許接收,REN=0時,禁止接收TB8:發(fā)送接收數(shù)據(jù)位8RB8:接收數(shù)據(jù)位8TI:發(fā)送中斷標(biāo)志位;TI=1表示幀發(fā)送結(jié)束,TI可由軟件置0RI:接收中斷標(biāo)志位;RI=1表示幀接收完成,RI可由軟件置07.4.在方式1和方式3的通信模式下,波特率通過那個定時器驅(qū)動產(chǎn)生?采用何種定時方式?如果要求采用晶振為11.0592MHz,產(chǎn)生的傳送波特率為2400b/s,應(yīng)該怎樣對定時器初始化操作?答:由定時器1驅(qū)動產(chǎn)生,采用定時器1的工作方式2,自動從裝初值當(dāng)晶振為11.0592MHz,波特率為2400b/s,由波特率公式:波特率=可求得初值a為F4H初始化操作:TMOD=0x20;TL1=0xF4;TH1=0xF4;PCON=0x00;SCON=0x00;TR1=1;8.3在由單片機(jī)80C51和一片ADC0809組成的數(shù)據(jù)采集系統(tǒng)中,假設(shè)ADC0809的地址為0x7ff8~0x7fff,畫出接口電路圖,并編寫每隔1ms輪流采集一次8個通道數(shù)據(jù)的程序。采樣100次取平均值。答:電路圖書上實(shí)例有,做了如下改動控制端ADDA,ADDB,ADDC分別接P2^0,P2^!,P2^2.刪去了譯碼器與邏輯器件器件,74LS373,74HC14,74HC02,中斷檢測端EOC接P3^2。參考程序如下,自己寫的沒經(jīng)過仿真,#include<reg52.h>#include<absacc.h>#defineucharunsignedchar//宏定義#defineuintunsignedint#defineAD_0XBYTE[0xff8]//定義通道訪問地址#defineAD_1XBYTE[0xff9]#defineAD_2XBYTE[0xffa]#defineAD_3XBYTE[0xffb]#defineAD_4XBYTE[0xffc]#defineAD_5XBYTE[0xffd]#defineAD_6XBYTE[0xffe]#defineAD_7XBYTE[0xfff]sbitbusy=P3^2;//定義中斷請求端ucharcount=0;//定義采樣次數(shù)uchardatcode[100]={0};//定義數(shù)據(jù)存放數(shù)組intdat=0,dat1=0;//定義臨時數(shù)據(jù)與最終平均數(shù)據(jù)uchari,j,num;//定義變量voidmain(){TMOD=0x01;//定時器0工作方式1TL0=(65536-1000)/256;//1ms中斷一次TH0=(65536-1000)%256;EA=1;//開總中斷,定時器中斷,打開定時器0ET0=1;TR0=1;while(count<100)//100次數(shù)據(jù)求和函數(shù){ dat1=dat1+datcode[i]; count++; }dat=dat1/100;if(count>=100)count=0;}voidtimer0()interrupt1//中斷函數(shù){TMOD=0x01;TL0=(65536-1000)/256;TH0=(65536-1000)%256;AD_0=0;//啟動0通道AD轉(zhuǎn)換while(busy==1){num=AD_0+1;//把0通道數(shù)據(jù)附給num,并指向AD_1通道查詢datcode[i+1]=num;j++;if(j==7)//八次查詢完畢退出循環(huán){busy=0;j=0; }}}第一章習(xí)題參考答案1-1:何謂單片機(jī)?與通用微機(jī)相比,兩者在結(jié)構(gòu)上有何異同?答:將構(gòu)成計算機(jī)的基本單元電路如微處理器(CPU)、存儲器、I/O接口電路和相應(yīng)實(shí)時控制器件等電路集成在一塊芯片上,稱其為單片微型計算機(jī),簡稱單片機(jī)。單片機(jī)與通用微機(jī)相比在結(jié)構(gòu)上的異同:(1)兩者都有CPU,但通用微機(jī)的CPU主要面向數(shù)據(jù)處理,其發(fā)展主要圍繞數(shù)據(jù)處理功能、計算速度和精度的進(jìn)一步提高。例如,現(xiàn)今微機(jī)的CPU都支持浮點(diǎn)運(yùn)算,采用流水線作業(yè),并行處理、多級高速緩沖(Cache)技術(shù)等。CPU的主頻達(dá)到數(shù)百兆赫茲(MHz),字長普遍達(dá)到32位。單片機(jī)主要面向控制,控制中的數(shù)據(jù)類型及數(shù)據(jù)處理相對

溫馨提示

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

評論

0/150

提交評論