單片機(jī)原理及應(yīng)用_第1頁
單片機(jī)原理及應(yīng)用_第2頁
單片機(jī)原理及應(yīng)用_第3頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、n第2章MCS-51單片機(jī)結(jié)構(gòu)及原理 習(xí)題1. MSC-51 單片機(jī)內(nèi)部由哪些功能部件組成,各有什么功能?答:以 51 單片機(jī)為例,其內(nèi)部功能部件有: 控制器:是對取自程序存儲器中的指令進(jìn)行譯碼,在規(guī)定的時(shí)刻發(fā)出各種操作所 需的控制信號,完成指令所規(guī)定的功能; 運(yùn)算器:根據(jù)控制器發(fā)來的信號,執(zhí)行算術(shù)邏輯運(yùn)算操作; 存儲器:包括程序存儲和數(shù)據(jù)存儲器;定時(shí)器計(jì)數(shù)器: 2個(gè) 16位定時(shí)器 / 計(jì)數(shù)器,可對機(jī)器周期計(jì)數(shù),也可對外部輸入 脈沖計(jì)數(shù); 中斷系統(tǒng):可響應(yīng)三個(gè)內(nèi)部中斷源和兩個(gè)外部中斷源的中斷請求; 輸入輸出接 口: 4個(gè) 8位并行口和一個(gè)全雙工串行口;2. MSC-51單片機(jī)外部引腳的名稱是什

2、么?各有什么功能?答:(1)電源及晶振引腳VCC(40腳):+5V電源引腳VSS (20 腳):接地引腳XTAL1 (19 腳);外接晶振引腳(內(nèi)置放大器輸入端)XTAL2C18腳):外接晶振引腳(內(nèi)置放大器輸出端)(2) 控制引腳RST/VPD (9) 為復(fù)位/ 備用電源引腳 ALE/PR0G(30) 為地址鎖存使能輸出 / 編程脈沖 輸入PSENC29 :輸出訪問片外程序存儲器讀選通信號EA/ VPP ( 31):外部ROM允許訪問/編程電源輸入并行 I/O 口引腳P0. 0-P0. 7(3932 腳) P0 口;Pl. 0-P1. 7(1 ? 8 腳) P1 口;P2. 0 ? P2.

3、7(21 28 腳) P2 口;P3. 0 ? P3. 7( 10? 17 腳)P3 口。3. 51 系列單片機(jī)的封裝有哪些類型?請說明每一種封裝引腳之間的距離。 答: 51 系列單片機(jī)的封裝有:40 引腳雙列直插圭寸裝 (DIP - dual in-line package), 引腳之間的距離 lOOmilQ ;44 引腳方形扁平圭寸裝 (QFP - quad flat package)方式,引腳之間的距離是;44 引腳帶引線的塑料芯片載體 PLC C (Plastic Leaded Chip Carrier) 04. 什么是復(fù)位?單片機(jī)復(fù)位電路有哪幾種,工作原理分別是什么? 答:復(fù)位 使單

4、片機(jī)恢復(fù)原始默認(rèn)狀態(tài)的操作。單片機(jī)復(fù)位電路有 : 上電復(fù)位電路,由電阻和電容構(gòu)成,通過上電時(shí),電容相當(dāng) 于短路而使復(fù)位引腳在晶振有效的情況下保持 2 個(gè)機(jī)器周期的高電平;按鈕開關(guān) 復(fù)位電路,由兩個(gè)電阻的分壓構(gòu)成,通過手工按下按鈕,使復(fù)位引腳在晶振有效 的情況下保持2個(gè)機(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可尋址空間是兩個(gè)64KB, 即64KB的程序存儲空間和64KB的數(shù)據(jù)存儲空間。6.

5、 片內(nèi)RAM中低128個(gè)單元劃分為哪三個(gè)主要部分?各部分的主要功能是什么?答:片內(nèi)RAM中低128個(gè)單元劃分為三個(gè)部分:%1工作寄存器區(qū)(00H-1FH),四組,每組8個(gè),可作用工作寄存器切換使用;%1可位尋址區(qū)(20H-2FH), 16B,位地址為00H-7FH,用作為按位尋址的空間;%1用戶RAM區(qū)(30H-7FH), 80B,用作普通RAM單元或堆棧。7.程序狀態(tài)字寄存器PSW各位的定義是什么?答:程序狀態(tài)字寄存器PSW各位的定義如下:PSW. 7 PSW. 6 PSW. 5 PSW. 4 PSW. 3 PSW. 2 PSW. 1 PSW. 0CYACF0RS1RSO0VFlPPSW.

6、7:進(jìn)/借位標(biāo)志CY,加法有進(jìn)位時(shí)置1,減法有借位時(shí)置1;PSW. 6:輔助進(jìn)位標(biāo)志AC,加法運(yùn)算低四位向高上四位有進(jìn)位時(shí)置 1;PSW.5 PSW. 1:用戶標(biāo)志位F0和用戶標(biāo)志位F1,保存用戶的位數(shù)據(jù);PSW. 4、PSW. 3:工作寄存器選擇控制位RS1和RSO, 00至11分別選擇四組工作 之一作為當(dāng)前工作寄存器PSW.2 :溢出標(biāo)志位0V,有符號數(shù)加、減運(yùn)算結(jié)果有溢出或乘除上結(jié)果異常(乘法運(yùn)算結(jié)果大于255即乘積在BA中,或除法運(yùn)算除數(shù)為0)時(shí)置1PSW. 0:奇偶標(biāo)志位P,累加器A中1的個(gè)數(shù)為奇數(shù)時(shí)置Io8. 什么是時(shí)鐘周期?什么是機(jī)器周期?什么是指令周期?當(dāng)振蕩頻率為12MHz時(shí)

7、,一個(gè)機(jī)器周期為多少微秒?答:時(shí)鐘周期又叫振蕩周期或拍,用 P表不,是MCS-51單片機(jī)中最小的時(shí)間單 位,在一個(gè)時(shí)鐘周期內(nèi),CPU完成一個(gè)最基本的動作。機(jī)器周期:由12個(gè)時(shí)鐘周期構(gòu)成,完成個(gè)基本操作指令周期:是執(zhí)行一條指令所需的時(shí)間,根據(jù)指令的復(fù)雜性,可由4個(gè)機(jī)器周期構(gòu)成。當(dāng)振蕩頻率為12MHz時(shí),一個(gè)機(jī)器周期為1微秒。9. P0、Pl、P2和P3 口的結(jié)構(gòu)和功能分別是什么?答:P0 口的每一位由1個(gè)鎖存器、2個(gè)三態(tài)緩沖器、1個(gè)輸出控制電路(非門 X、與門、電子開關(guān) MUX輸出驅(qū)動電路構(gòu)成,其功能既可以作為通用I/O 口實(shí)現(xiàn)輸入/輸出功能,也可作為單片機(jī)地址線的低8位和數(shù)據(jù)線實(shí)現(xiàn)外部擴(kuò)展功能

8、。在用作輸入輸出口時(shí),需外接上拉電阻。Pl 口的每一位由1個(gè)鎖存器、1個(gè)場效應(yīng)管驅(qū)動器V和2個(gè)三態(tài)門緩沖器 構(gòu)成,其作用是用作輸入輸出口P2 口的每一位由1個(gè)鎖存器、2個(gè)三態(tài)緩沖器、1個(gè)輸出控制單元、1個(gè)輸 出驅(qū)動單元構(gòu)成,其功能是用作輸入輸出口,或地址總線的高8位。P3 口的每一位由1個(gè)鎖存器、2個(gè)三態(tài)緩沖器、1個(gè)第二功能控制單元、1 個(gè)輸出驅(qū)動單元構(gòu)成,其作用是用作輸入輸岀口或第二功能。10. 51單片機(jī)引腳ALE的作用是什么?當(dāng)51不外接存儲器時(shí),ALE上的輸出的 脈沖頻率是多少?答:51單片機(jī)引腳ALE的作用是對外部存儲尋址時(shí)鎖存 P0 口輸出的低8位地址, 當(dāng)51不外接存儲器時(shí),AL

9、E上的輸出的脈沖頻率是fosc/6o習(xí)題答:MCS-51單片機(jī)立即尋址、變址第3章單片機(jī)的匯編語言與程序設(shè)計(jì)RAM的所有地址1. MCS-51單片機(jī)有哪幾種尋址方式?適用于什么地址空間? 有7種尋址方式:直接尋址、寄存器尋址、寄存器間接尋址、 尋址、位尋址、相對尋址。直接尋址方式:操作數(shù)的地址由指令直接給出,適用于片內(nèi) 空間;女口 MOV A, 68HMOV A, PSW寄存器尋址方式:指令給岀的是寄存器的編碼,操作數(shù)在編碼指定的寄存器 中,適用于片內(nèi)00H至1FH的32個(gè)字節(jié),用R0, . R7 表示,通過PSW勺RS1 和RSO選擇組號確定對應(yīng)32個(gè)字節(jié)中的其中8個(gè),還有累加器A,以及乘除

10、法指 令中的A和B寄存器,位尋址方式中的布爾累加器 C;MOV A, MUL R1AB INC DPTR寄存器間接尋址方式:指令給出的是寄存器的編碼,操作數(shù)地址在編碼指 定 的寄存器中,適用于片內(nèi) RAM的全部空間,其中52系列中的80H至FFH只能 用寄存器間接尋址;如 MOV A, R0MOV A, R1 MOVX A, DPTR立即尋址方式:操作數(shù)本身在指令中直接,給出適用于用8位立即數(shù)對片內(nèi)RAM所有地址單元賦值,也可用16位立即數(shù)對DPTR賦值;如MOV A, #0E2HMOV DPTR, #2000H變址尋址方式:以DPTR或 PC作為基地址寄存器,以累加器 A作為變址寄存 器,將

11、基址寄存器與變址寄存器的內(nèi)容相加形成操作數(shù)的實(shí)際地址的一種尋址 方 式,變址尋址方式適用于程序存儲器 ROM僅有三條指令如下:MOVC A, A+DPTRMOVC A, A+PCJMP A+DPTR位尋址方式:指令中直接給出操作數(shù)所在單元的位地址,適用于片內(nèi)RAM中地址20H至2FH中的16個(gè)字節(jié)中的128個(gè)位地址空間和80H至FFH中地址中 可以被 8整除的所有SFR中的每個(gè)位地址空間;如MOVC, 7FHMOVFO, CMOVC, ACC.7相對尋址方為相對轉(zhuǎn)移指令而指令中直接給出轉(zhuǎn)移的相對偏移其轉(zhuǎn)移目標(biāo)在當(dāng)前指設(shè),T28至+ 127字節(jié)范圍內(nèi)的地址空間。如SJMP STARTHERE S

12、JMP 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的 20H30H單元內(nèi)容清零。解:設(shè)個(gè)片內(nèi)RAM指針R0,先指向首地址20H,通過累加器A清零,然后采用 間 接尋址方式依次將A中的零值傳送到指針?biāo)傅钠瑑?nèi)RAM單元,每傳送一個(gè)字 節(jié),地址指針加1,直到達(dá)到地址為30H或達(dá)到計(jì)數(shù)器規(guī)定的17個(gè)字節(jié)為止。程

13、序1:MOVCLRRO, #20HA;設(shè)地址指針初值;累加器清oCONT:MOVR0, A;置0指針?biāo)竼呜NCRO;地址指針加1CJNERO, #31H, CONT ;指針未超過終點(diǎn)則繼續(xù)SJMP$;暫停程序2:MOVRO, #20H;設(shè)地址指針初值CLRA;累加器清0MOVR7,#17;計(jì)數(shù)器賦初值,從20H到30H共17個(gè)字CONT:MOVR0, A節(jié)置0指針?biāo)竼呜NCRO;地址指針加1DJNZR7, CONT;計(jì)數(shù)器減1,非0,則繼續(xù)SJMP$;暫停4.編程查找內(nèi)部RAM的32H? 41H單元中是否有0AAH這個(gè)數(shù)據(jù),若有這一數(shù)據(jù),則 將50H單元置為0FFH,否則將50H單元清

14、零。解:設(shè)一個(gè)片內(nèi)RAM指針R0,先指向首地址32H,比較R0與#0AAH,若相等,則退出 循環(huán),給50H單元賦0FFH,若不相等,則R0加1為繼續(xù)比較下-個(gè)字節(jié) 做準(zhǔn)備, 直到達(dá)到地址為41H或達(dá)到計(jì)數(shù)器規(guī)定的16個(gè)字節(jié)為止還沒找到,則 給50H單 元賦00H程序1:MOVRO, #32H;設(shè)地址指針初值CONT:CJNER0, #OAAH, NEXT:比較查找值與指針?biāo)竼卧闹?,不相等轉(zhuǎn)MOV移A,#offh;相等,則準(zhǔn)備好要賦的標(biāo)志值OFFHSJMPDOWN;轉(zhuǎn)存到保存結(jié)果處NEXT:INCRO;修改地址指針CJNERO,#42H, CONT;若指針未越過終點(diǎn),則繼續(xù)MOVA,#00H

15、;查找失敗,則將00H存入結(jié)果標(biāo)志單元DOWN:MOV50H.A;將比較結(jié)果標(biāo)志存入50H單元SJMP$;暫停程序oEND2 :MOVR7, #16;計(jì)數(shù)器賦初值,從20H到30H共16個(gè)字節(jié)MOVRO, #32H;設(shè)地址指針初值CONT:CJNER0, #OAAH,;比較查找值與指針?biāo)竼卧闹?,等轉(zhuǎn)NEXT不相MOVA,#OFFH;相等,則準(zhǔn)備好要賦的標(biāo)志值 OFFHSJMPDOWN;轉(zhuǎn)存到保存結(jié)果處NEXT:INCRO;修改地址指針DJNZR7, CONT;計(jì)數(shù)器減1,非0,則繼續(xù)MOVA,#00H;查找失敗,則將00H存入結(jié)果標(biāo)志單元DOWN:MOV50H,A;將比較結(jié)果標(biāo)志存入50H

16、單元SJMP$;暫停END5.查找20H? 4FH單元中出現(xiàn)OOH勺次數(shù),并將查找結(jié)果存入50H單元。解:從20H至U 4FH共48個(gè)字節(jié)MOVR7, #48;字節(jié)計(jì)數(shù)器賦初值MOVRO,#20H;設(shè)地址指針初值CONT: CJNER0, #00H,;比較查找值與指針?biāo)竼卧闹担幌嗟菼NCNEXT;相等,0的個(gè)數(shù)計(jì)數(shù)器加1NEXT: INCRO;修改地址指針DJNZR7, CONT;計(jì)數(shù)器減1,非0,則繼續(xù)MOV50H, R6;保存0的個(gè)數(shù)計(jì)數(shù)值到50H單元SJMP$;暫停ENDEND6.已知 A=83H, R0=17H, (17H)=34H,寫出下列程序段執(zhí)行之后的A中的內(nèi)容。ANLA,

17、#17HORL17H.AXRLA, R0CPLAEND答:AA, #17H;A=03H17H,A:(17H)=0011 0100NLRLOV 0000 0011=0011 0111xA, R0RL;A= 0000 00110011 0111 =0011 01007.已知單片機(jī)的晶振頻率為12MHz,分別設(shè)計(jì)延時(shí)為0. Is, Is 的子程序。 答:已 知單片機(jī)的晶振頻率為12MHz,則機(jī)器周期為lus,延時(shí)子程序是通過執(zhí)行指令序列中機(jī)器周期數(shù)來達(dá)到,如果要 0. Is,即100ms,也就是lOOOOOus,所以需要機(jī)器 周期數(shù)達(dá)到1000000要延時(shí)達(dá)到IS,可通過對延時(shí)為0. 1秒的子程序調(diào)

18、用10次來 實(shí)現(xiàn)。DELAY100MS:MOR6,#200;1個(gè)機(jī)器周期D1:V MOR7,#250;1個(gè)機(jī)器周期D2:VNOP;1個(gè)機(jī)器周期DJR7,D2;2個(gè)機(jī)器周期,3*251=753NZ DJR6, DI;2個(gè)機(jī)器周期,(1+753+2)*132=99792NZ RET;2個(gè)機(jī)器周期,1+99792+2=99795,約 100msDELAY1S:MOVR7,#10;計(jì)數(shù)10次1LOOP:ACALDELAY100MS;延時(shí) 100ms 子程序99795+2L DJNZR7, LOOP;未達(dá)到10次則繼續(xù)10* (2+99795+2)RET; 返回 2+10* (2+99795+2) =9

19、979928.內(nèi)部RAM從20H單元開始處有一數(shù)據(jù)塊,以0DH為結(jié)束標(biāo)志,試統(tǒng)計(jì)該數(shù)據(jù) 塊 的長度,將該數(shù)據(jù)塊送到外部數(shù)據(jù)存儲器7E01H開始的單元,并將長度存入7E00H單元。解:從20H的指針用R0,從外部RAM7E01開始的指針用DPTR計(jì)數(shù)器用R7MOVR7, #0;字節(jié)計(jì)數(shù)器賦初值MOVR0, #20H;設(shè)片內(nèi)RAM地址指針初值MOVDPTR, #7E01H;設(shè)片外RAM地址指針初CONT: MOVA, R0;取片內(nèi)RAM中的一個(gè)字節(jié)MOVXDPTR,A;存入片外RAM指針?biāo)窱NCR7單元長度計(jì)數(shù)器加1INCR0;片內(nèi)RAM地址指針加1INCDPTR;片外RAM地址指針加1CJNE

20、A, #ODH,CONT;未達(dá)到結(jié)束標(biāo)志MOVA, R7;取塊計(jì)數(shù)長度值MOVXDPTR,A;保存SJMP$;暫停END9.內(nèi)部RAM從 DATA開始的區(qū)域中存放著10個(gè)單字節(jié)十進(jìn)制數(shù),求其累加和,并 將結(jié)果存入SUM和SUM+1單元。解:R7計(jì)R6保存累加和高8位,R0用作地址指針ORG0000HLJMPMAINORG100HSUMEQU30HDATAA EQU40HMAIN:MOVR7,#10;字節(jié)計(jì)數(shù)器賦初值MOVRO, #DATAA;設(shè)片內(nèi)RAM地址指針初值CLRA;累加器清0MOVR6,A;累加結(jié)果的高8位CONT: ADDA, R0/ RAM中的一個(gè)字節(jié)到ACCDAAJNCNEXT

21、;若無進(jìn)位則不用管高8位INCR6;有進(jìn)位,高8位加1NEXT: INCRO;片內(nèi)RAM地址指針加1DJNZR7, CONT;未完繼續(xù)MOVSUM, A;保存低8位MOVSUM+1, R6;保存咼8位SJMP$;暫停END10.內(nèi)部RAM從DATA1和DATA2單元開始處存放著兩個(gè)等長的數(shù)據(jù)塊,數(shù)據(jù)塊的 度在LEN單元中。請編程檢查這兩個(gè)數(shù)據(jù)塊是否相等,若相等,將 OFFH寫入 RESULT單元,否則將0寫入RESULT單元。解:從DATA1開始的指針用R0,從DATA2開始的指針用R1,計(jì)數(shù)器用R7LENEQU10DATA1EQU30HDATA2EQU40HRESULEQU50HTMOVR7

22、, #LEN;字節(jié)計(jì)數(shù)器賦初值MOVRO, #DATA1;設(shè)片內(nèi)RAM:地址指針初值MOVRl, #DATA2;設(shè)片外RAM:地址指針初值CONT:MOVA, R0;取片內(nèi)RAM R0所指的的一個(gè)字節(jié)MOV7FH, R1;將R1所指單元內(nèi)容取到片內(nèi)RAM:地址7FHCJNEA, 7FH, NOEQ中;比較,不相等則結(jié)束INCRO;DATA1 RAM地址指針加1INCR1;DATA2 RAM地址指針加 1DJNZR7, CONT;未完,繼續(xù)MOVA, #OFFH;相等,準(zhǔn)備寫入FFHSJMPDOWN;轉(zhuǎn)寫入結(jié)果處NOEQ:MOVA, #0;不相等,準(zhǔn)備寫入00HDOWN:MOVRESULT,A;

23、保存比較結(jié)果標(biāo)志SJMP$;暫停END11?編制程將內(nèi)部RAMM1、M2、M3和M4單兀中的無符號數(shù) xl、x2、x3和x4相加,并把和存入R0和R1 ( R0中為高8位)中。 解:ADD A, M2;與第二個(gè)數(shù)相加MlEQU30M2EQUH40M3EQUH45M4EQUH4FMOVHA,;取第一個(gè)Ml數(shù)JNCNEXT1;如果無進(jìn)位,則轉(zhuǎn)移至第三個(gè)MOVRO, #1相加有進(jìn)位,高8位置1NEXT1: ADDA, M3;與第三個(gè)數(shù)相加JNCNEXT2;沒有進(jìn)位,則轉(zhuǎn)至第四個(gè)數(shù)相INCRO加;有進(jìn)位,高8位加1NEXT2: ADDA, M4;與第四個(gè)數(shù)相加JNCNEXT3;沒有進(jìn)位,則轉(zhuǎn)至結(jié)束IN

24、CRO;有進(jìn)位,高8位再加1NEXT3: MOVR1,A;低8位保存到R1SJMP$;暫停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ù)為單位,由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成,主函數(shù)是程序 的入口,其他函數(shù)由主函數(shù)直接或間接調(diào)用。程序可以由個(gè)文件或多個(gè)文件 組成。文件類型包括頭文件和 c語言源文件,也可以是匯編語言文件,C程序 可與匯編語言混合編程。2. C51語言的變量定義包含哪些關(guān)鍵因素?為何這樣考慮?答:C語言的變

25、量定義格式如下:存儲種類數(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ū) (xd

26、ata)、ROM區(qū) (code) o只所以比標(biāo)準(zhǔn)C語言多了存儲類型,就是因?yàn)镸CS-51單片機(jī)的存儲結(jié)構(gòu)中有四個(gè)物理存儲空間(片內(nèi)RAM片內(nèi)ROM片外RAM片外ROM),三個(gè)邏輯地址空間 (片內(nèi)RAM片外RAM, ROM),而且有多種尋址方式(直接尋址、間接尋址、 頁面尋 址、位尋址)所致,所以在定義變量時(shí),要根據(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ā);匯編指令

27、無關(guān),易于掌握,上手快。匯編語言優(yōu)點(diǎn)是編寫的程序代碼精煉、執(zhí)行速度快,在相同功能下,匯編 語言程序可能比C語言程序效率高。缺點(diǎn)是對程序員要求高,必須對單片機(jī)的硬件 結(jié)構(gòu)非常熟悉才能編程,不便于編寫比較復(fù)雜的程序可根據(jù)需要對要求時(shí)間性很強(qiáng)的代碼用匯編語言編寫,其它部分用C語言編寫,兩者混合編程就可以實(shí)現(xiàn)優(yōu)勢互補(bǔ)。4. 指出下面程序的語法錯誤:#in eludemai n() a=C;int a=7, Cdelay(10)void delay () ; cgar i ;for(i=0; i =255; ” +”); 答:#include mai n() a=C;/a和C必須先定義才可使用int a

28、=7,C缺分號,應(yīng)該提在使用前說明delay(10)/延時(shí)子程序必須先定義,或先有函數(shù)原型說明void delay () ; 作為函數(shù)定義,有函數(shù)定義不能嵌套的問題,即不能在一個(gè)函數(shù)內(nèi)定義另一個(gè)函數(shù),而且前不應(yīng)有分號/作為函數(shù)原型說明,應(yīng)該放在函數(shù)調(diào)用之前,且其后不應(yīng)該接函數(shù)體cgar i ;/ 字符型應(yīng)該是 un sig ned charfor(i=0; 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ū)的指針。答: char bdata a;fl

29、oat xdata b; int xdata *c;6. 編程將8051的內(nèi)部數(shù)據(jù)存儲器20H單元和35H單元的數(shù)據(jù)相乘,結(jié)果存到外 部數(shù)據(jù)存儲器中(任意位置)。解:方法一:用嵌入式匯編語言實(shí)現(xiàn)# in cludevoid mai n()#pragma asmMOV A,20HMOV B,35H MUL ABMOV DPTR,#1234HMOV DPTR,AINC DPTRMOV A,BMOV DPTR,A pragmaen dasm方法二:單用c語言編程實(shí)現(xiàn)#include reg51. h#include niath. hint movdata(char);void mai n ()un

30、sig ned int xdata x;un sig ned char *ptr,a, b;ptr 二 0x25;a=*ptr;ptr=0x30;b=*ptr;x 二 Q*b;7. 8051的片內(nèi)數(shù)據(jù)存儲器25H單元中存放有一個(gè)0? 10的整數(shù),編程求其平方 根(精確到5位有效數(shù)字),將平方根放到30H單元為首址的內(nèi)存中。解:方法一:用C語言與匯編語言混合編程實(shí)現(xiàn)/用C語言編寫的主函數(shù)MAIN. C#include#includechar getdata (char);void mai n()char a=0x25, c;float f;c=getdata(a);f=sqrt(c);用匯編語言

31、編寫的取數(shù)據(jù)子函數(shù),只有一個(gè)地址參數(shù)在R7中,返回值為指定地址單元中的內(nèi)容,用R7返回主函數(shù)。PUBLIC GETDATADE SEGMENT CODERSEG DE_GETDATA:MOVA, R7;取地址參數(shù)MOVro, AMOVa,MOVR0,a;返回地址單元中的內(nèi)EXIT:RET容END方法二:單用C語言編程實(shí)現(xiàn)/MAIN. C#inelude reg51. h#ineludeint movdata(char);void mai n ()char n;char *ptr;float *ptr2;float f;ptr=0x25;n=*ptr;f=sqrt( n);ptr2=0x30;*

32、ptr2=f;8. 將外部RAM 10H? 15H單元的內(nèi)容傳送到內(nèi)部 RAM 10H? 15H單元。 解:方法 一:采用C語言與匯編語言混合編程用 C語言編寫的主函數(shù) MAIN. C #include char movdata(ehar, char);void mai n ()char a=0xl0, b=0x06;movdata(a, b);用匯編語言編寫的移動數(shù)據(jù)子函數(shù)MOVDATA其中第一個(gè)參數(shù)在R7中為首地址,第二個(gè)參數(shù)在R5中為字節(jié)數(shù)PUBLIC _MOVDATADE SEGMENT CODERSEG DE _MOVDATA:MOVMOV A, R7;取參MOVLOOP: MOVX

33、ro, AA, R0R0, ADJNZ R5, LOOPEXIT:RETEND方法二:單用C語言編程實(shí)現(xiàn)/MAIN. C#inelude reg51. h int movdata(char); void main ()char n=6;char *ptrl=OxlO;char xdata *ptr2; ptr2=0x20;while(n 一)*ptr2+=*ptr1+;16位數(shù),將其9. 內(nèi)部RAM 20H. 21H和22H、23H單元分別存放著兩個(gè)無符號的中的大數(shù)置于24H和25H單元。解:方法一:#include void main ()un sig ned int *ptr; un si

34、g ned int x, y, z; ptr=0x20;x=*ptr; ptr=0x22; y=*ptr; z=(xy) ?x 0x24;*ptr 二 z;#include #include void main ()un sig ned int x, y, z;x=DBYTE0X20F256+DBYTE0X21; y=DBYTE0X22F256+DBYTE0X23;z= (xy)?x:y;/將兩數(shù)中的較大者賦給zDBYTE0X24=z/256;DBYTE0X25z%256;方法二:#includeun sig ned int x _at_ 0x20; un sig ned int y _at_

35、 0x22; un sig ned int z _at_ 0x24; void mai n()z= (xy)?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ù)為單位,由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成,主函數(shù)是程序 的入口,其他函數(shù)由主函數(shù)直接或間接調(diào)用。程序可以由一個(gè)文件或多個(gè)文件 組 成。文件類型包括頭文件和 c 語言源文件,也可以是匯編語言文件, C 程序 可與 匯編語言混合編程。2. C51語言的變量定

36、義包含哪些關(guān)鍵因素?為何這樣考慮?答:C語言的變量定義格式如下:存儲種類數(shù)據(jù)類型存儲類型變量名 其中:存儲種類與標(biāo)準(zhǔn) C 語言相同,包括:自動型 (auto) 、外部型 (extern) 、靜態(tài) 型 (static)寄存器型 (register) 0數(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間 接尋 址

37、區(qū)(idata), 片夕卜 RAM頁尋址區(qū)(pdata), 片夕卜 RAM區(qū) (xdata)、ROM區(qū) (code) o只所以比標(biāo)準(zhǔn) C 語言多了存儲類型,就是因?yàn)?MCS-51 單片機(jī)的存儲結(jié)構(gòu)中 有四個(gè)物理存儲空間(片內(nèi)RAM片內(nèi)ROM片外RAM片外ROM),三個(gè)邏輯地址空間 (片內(nèi)RAM片外RAM, ROM),而且有多種尋址方式(直接尋址、間接尋址、頁面尋址、位尋址 ) 所致,所以在定義變量時(shí),要根據(jù)其所在位置和尋址方式明 確指 定存儲類型。3. C51 與匯編語言的特點(diǎn)各有哪些?怎樣實(shí)現(xiàn)兩者的優(yōu)勢互補(bǔ)?答: C51 是結(jié)構(gòu)化語言,代碼緊湊;接近自然語言,程序可讀性強(qiáng),易于調(diào)試、 維護(hù);

38、庫函數(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ù)需要對要求時(shí)間性很強(qiáng)的代碼用匯編語言編寫,其它部分用 c 語言編 寫,兩者混合編程就可以實(shí)現(xiàn)優(yōu)勢互補(bǔ)。4. 指出下面程序的語法錯誤: #include reg51 ? h main() a=C; int a=7, C delay(10) void delay ()

39、; cgar i ;for(i=0; imain() a=C;Ila和C必須先定義才可使用int a=7,C/ 缺分號,應(yīng)該提在使用前說明delay(10)延時(shí)子程序必須先定義,或先有函數(shù)原型說明void delay () ; / 作為函數(shù)定義,有函數(shù)定義不能嵌套的問題,即不能在一個(gè)函數(shù)內(nèi)定義另一個(gè)函數(shù),而且前不應(yīng)有分號 / 作為函 數(shù)原型說明,應(yīng)該放在函數(shù)調(diào)用之前,且其后不應(yīng)該接函數(shù)體cgar i ;/ 字符型應(yīng)該是 unsigned charfor(i=0; i=255;”+);/ ” 應(yīng)改成 i+/ 主函數(shù)沒有結(jié)束,缺” T5. 定義變量a, b, c,其中a為內(nèi)部RAM的可位尋址區(qū)的字

40、符變量,b為外部數(shù) 據(jù) 存儲區(qū)浮點(diǎn)型變量, c 為指向 int 型 xdata 區(qū)的指針。答: char bdata a;float xdata b;int xdata *c;6. 編程將8051的內(nèi)部數(shù)據(jù)存儲器20H單元和35H單元的數(shù)據(jù)相乘,結(jié)果存到外 部數(shù)據(jù)存儲器中 (任意位置 )。解:方法一:用嵌入式匯編語言實(shí)現(xiàn)#includevoid main() #pragma asmMOV A,20HMOV B,35HMUL ABMOV DPTR,#1234HMOVX DPTR,AINC DPTRMOV A,BMOVX DPTR,A#pragma endasm方法二:單用C語言編程實(shí)現(xiàn)#incl

41、ude reg51. h#include math. hint movdata(char);void main ()unsigned int xdata x; unsigned char *ptr,a, b; ptr 二 0x25;a=*ptr; ptr=0x30;b=*ptr;x 二 a*b;7. 8051的片內(nèi)數(shù)據(jù)存儲器25H單元中存放有一個(gè)0? 10的整數(shù),編程求其平方根(精確到5位有效數(shù)字),將平方根放到30H單元為首址的內(nèi)存中。解:方法一:用 C 語言與匯編語言混合編程實(shí)現(xiàn)用C語言編寫的主函數(shù)MAIN. C#include reg51? h#include math. hchar g

42、etdata(char);void main ()char a=0x25, c;float f;c=getdata(a);f=sqrt(c);;用匯編語言編寫的取數(shù)據(jù)子函數(shù),只有一個(gè)地址參數(shù)在R7中,返回值為指定地址單元中的內(nèi)容,用R7返回主函數(shù)。PUBLIC _GETDATADE SEGMENT CODERSEG DE_GETDATA: MOV A, R7 ; 取地址參數(shù)MOVRO, AMOVA, R0MOVR7.A;返回地址單元中的內(nèi)EXIT:RET容方法二:單用TC語言編程實(shí)現(xiàn)/MAIN. C#inelude reg51. h #inelude math. h int movdata(c

43、har); void main ()char n;char *ptr; float *ptr2;float f;ptr 二 0x25;n=*ptr;f=sqrt( n);ptr2=0x30;*ptr2 二 f;8. 將外部RAM 10H? 15H單元的內(nèi)容傳送到內(nèi)部 RAM 10H 15H單元。解:方法一:采用C語言與匯編語言混合編程用 C語言編寫的主函數(shù) MAIN. C #include reg51. h char movdata(char, char);void mai n()char a=0xl0, b=0x06;movdata (a, b);用匯編語言編寫的移動數(shù)據(jù)子函數(shù) MOVDAT

44、A其中第一個(gè)參數(shù)在R7中為首地址, 第二個(gè)參數(shù)在R5中為字節(jié)數(shù)PUBLIC _M0VDATADE SEGMENT CODERSEG DE_MOVDATA:MOV A,;取參MOVRO, ALOOPMOVXA, R0MOVR0, ADJNZR5,EXITRETLOOPEND方法二:單用C語言編程實(shí)現(xiàn)/MAIN. C #inelude void main ()char n=6;char *ptrl 二 0x10; char xdata *ptr2; ptr2=0x20; while(n 一一 ) *ptr2+=*ptr1+;reg51? h int movdata(char);9. 內(nèi)部RAM 2

45、0H. 21H和22H、23H單元分別存放著兩個(gè)無符號的16位數(shù),將其 中的大數(shù)置于24H和25H單元。解:方法 -?:#include reg51? hvoid main()unsigned int *ptr; unsigned int x, y, z; ptr=0x20;x=*ptr; ptr=0x22;y=*ptr; z/ 設(shè)置一個(gè)內(nèi)部 RAM 指針/ 指向 0x20 單元/ 取第一個(gè)數(shù)/ 指向 0x22 單元取第二個(gè)數(shù)(pxtr=0yx)2?4x;:y;將兩數(shù)中的較大者賦給 z/ 指向地址為 0x24 的目標(biāo)單元*ptr 二z;/ 將大數(shù)存入目標(biāo)單元 方法二#include reg51

46、? h#include absacc? h void main ()unsigned int x, y, z;x=DBYTE0X20F256+DBYTE0X21;y=DBYTE0X22F256+DBYTE0X23;z= (xy)?x:y;/ 將兩數(shù)中的較大者賦給 zDBYTE0X24=z/256;DBYTE0X25=z%256;方法三:#include reg51. hunsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main ()z=(xy)?x:y;第 5 章單片機(jī)的中斷系統(tǒng)

47、 習(xí)題1. 什么是中斷、中斷源、中斷優(yōu)先級和中斷嵌套? 答:中斷是指單片機(jī)內(nèi)部有一個(gè)中斷管理系統(tǒng),它對內(nèi)部的定時(shí)器事件、串行 通 信的發(fā)送和接收及外部事件 ( 如鍵盤按鍵動作 ) 等進(jìn)行自動的檢測判斷。當(dāng) CPU 正在處理某件事情 ( 例如正在執(zhí)行主程序 ) 的吋候,外部或內(nèi)部發(fā)生的某一事 件 ( 如某個(gè)引腳上電平的變化,一個(gè)脈沖沿的發(fā)生或計(jì)數(shù)器的計(jì)數(shù)溢出等 ) 請求 CPU迅速處理,于是,中斷管理系統(tǒng)會置位相應(yīng)標(biāo)志通知CPU暫時(shí)中止當(dāng)前的工作,迅速轉(zhuǎn)去處理所發(fā)生的事件。處理完該事件后,再回到原來被中止的地 方, 繼續(xù)原來的工作,這樣的過程稱為中斷。引發(fā)中斷的事件稱為中斷源。 將中斷事件按輕重

48、緩急分若干級別叫中斷優(yōu)先級。允許中斷優(yōu)先級高的中斷源中斷正在執(zhí)行的低優(yōu)先級的中斷服務(wù)程序叫中斷嵌 套。2. 什么叫中斷源?MCS-51有哪些中斷源?各有什么特點(diǎn)?它們的中斷向量地址分別是多少?答:中斷源即引發(fā)中斷的事件。MCS-51單片機(jī)有MCS-51中斷的中斷響應(yīng)條件是什么?答:中斷源有中斷請求; 此中斷源允許位為1,即中斷源可以向CPU發(fā)中斷請求;(3) CPU開總中斷,即EA=1;(4) 無同級或者更高級中斷正在服務(wù) MCS-51的中斷響應(yīng)過程是怎樣的?答: (1) 將相應(yīng)的中斷優(yōu)先級狀態(tài)觸發(fā)器置 1, 以阻斷后來的同級和低級中斷請 求;(2) 由硬件清除相應(yīng)的中斷請求標(biāo)志,串行口的發(fā)送

49、和接收中斷除外; 執(zhí)行一條硬件LCALL指令,即把程序計(jì)數(shù)器PC的內(nèi)容壓入堆棧保存, 再將相應(yīng)的中斷服務(wù)程序的入口地址送入PC; 編寫出外部中斷 1 為下跳沿觸發(fā)的中斷初始化程序。解:void Intl_init () IT1=1;EA=1;EX1=1;/IE=0x84;/ IE|=0x84; 有一外部中斷源,接入INTO端,當(dāng)其中有中斷請求時(shí),要求 CPU把一個(gè)從內(nèi)個(gè)中斷源,它們是外部中斷0,定時(shí)器T0,外部中斷1,定吋 器 T1, 串行口。外部中斷源是由引腳的觸發(fā)信號引起的中斷,定時(shí)器中斷源是由于定時(shí)器計(jì) 數(shù)器的溢出引發(fā)的中斷,串行口是由于串行通信的發(fā)送或接收引發(fā)的中斷。外部中斷0,定時(shí)器

50、T0,外部中斷1,定時(shí)器T1,串行口五個(gè)中斷源的中斷 向量 地址依次為: 0003H, 000BH, 0013H, 001BH, 0023H。部RAM 30H單元開始的50個(gè)字節(jié)的數(shù)據(jù)塊傳送到外部 RAM從1000H開始的連續(xù) 存 儲區(qū)。請編寫對應(yīng)的程序。解:#includevoid main() IT0=l ;EA=1;EXO=1;while(1);void intxO() interrupt 0 using 1char * ptrl=0x30;char xdata * ptr2=0xl000:for (i=0;i50;i+) *ptr2+=*ptrl+;7. 設(shè)fosc = 12MHz,利

51、用定時(shí)器,TO(工作在方式2)在Pl. 1引腳上獲取輸出周 期 為 0.4ms 的方波信號,定時(shí)器溢出時(shí)采用中斷方式處理,請編寫, T0 的初始 化 程序及中斷服務(wù)程序。解:fosc = 12MHz,則機(jī)器周期=lus ;當(dāng)TO工作在方式2時(shí),其最大定時(shí)吋間 為 256us, 要輸出周期為 0. 4mS 即 400us 的方波信號,則其高、低電平應(yīng)各為 200us, 顯然當(dāng)定時(shí)器 T0 按方式 2 工作時(shí),只需計(jì)數(shù)達(dá)到 200 次即可,因此其時(shí) 間常數(shù) 初值為 256-200=56o 在 T0 的中斷服務(wù)程序中,只需將 Pl. 1 引腳求反即 可。#includesbitPl_l=PlAl;void timerO()interrupt 1 using 1 P1_1=!

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論