單片機(jī)應(yīng)用技術(shù)c語言版第3版王靜霞習(xí)題答案.doc
《單片機(jī)應(yīng)用技術(shù)c語言版第3版王靜霞習(xí)題答案.doc》由會員分享,可在線閱讀,更多相關(guān)《單片機(jī)應(yīng)用技術(shù)c語言版第3版王靜霞習(xí)題答案.doc(20頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、@ 習(xí) 題 1 1.1 單項(xiàng)選擇題 (1) A (2)C (3)C 1.2 填空題 (1)硬件系統(tǒng)、軟件系統(tǒng) (2)時鐘電路、復(fù)位電路 (3)XTAL1、XTAL2、RESET、EA (4)晶振 1.3 問答題 什么是單片機(jī)?它由哪幾部分組成?什么是單片機(jī)應(yīng)用系統(tǒng)? 答:單片微型計算機(jī)(Single Chip Microcomputer)簡稱單片機(jī),是指集成在一個芯片上的微型計算機(jī),它的各種功能部件,包括CPU(Central Processing Unit)、存儲器(memory)、基本輸入/輸出(Input/Output,簡稱I/O)接口電路、定時/計
2、數(shù)器和中斷系統(tǒng)等,都制作在一塊集成芯片上,構(gòu)成一個完整的微型計算機(jī)。
單片機(jī)應(yīng)用系統(tǒng)是以單片機(jī)為核心,配以輸入、輸出、顯示等外圍接口電路和控制程序,能實(shí)現(xiàn)一種或多種功能的實(shí)用系統(tǒng)。
1.4 上機(jī)操作題
(1)
參考程序:
#include
3、 for(k=0;k //包含頭文件reg51.h,定義了51單片機(jī)的專用寄存器 //函數(shù)名:delay //函數(shù)功
4、能:實(shí)現(xiàn)軟件延時 //形式參數(shù):無符號整型變量i,控制空循環(huán)的循環(huán)次數(shù) //返回值:無 void delay(unsigned int i) //延時函數(shù) { unsigned int k; for(k=0;k
5、 //調(diào)用延時函數(shù),實(shí)際參數(shù)為20000 } } @ 習(xí) 題 2 2.1 單項(xiàng)選擇題 (1)C (2)A (3)A (4)A (5)A (6)D (7)C (8)A (9)A (10)C 2.2 填空題 (1)外部程序存儲器、外部數(shù)據(jù)存儲器、內(nèi)部程序存儲器、內(nèi)部數(shù)據(jù)存儲器 (2)程序存儲器 (3)工作寄存器組、位尋址區(qū)、用戶RAM (4)1us、2us (5)按鍵復(fù)位、上電復(fù)位 (6)2、高 2.3 回答題 (1)P3口的第二功能是什么? 答: P3口各引腳的第二功能如下表。 第一功能 第二功能 第二功能信號名稱
6、 P3.0 RXD 串行數(shù)據(jù)接收 P3.1 TXD 串行數(shù)據(jù)發(fā)送 P3.2 外部中斷0申請 P3.3 外部中斷1申請 P3.4 T0 定時/計數(shù)器0的外部輸入 P3.5 T1 定時/計數(shù)器1的外部輸入 P3.6 外部RAM或外部I/O寫選通 P3.7 外部RAM或外部I/O讀選通 (2)畫出單片機(jī)時鐘電路,并指出石英晶體和電容的取值范圍。 答:單片機(jī)時鐘電路單片機(jī)時鐘電路如下圖。 一般地,電容C1和C2取30 pF左右;晶體振蕩器,簡稱晶振,頻率范圍是1.2~12 MHz。晶體振蕩頻率越高,系統(tǒng)的時鐘頻率也越高,單片機(jī)的運(yùn)行速
7、度也就越快。在通常情況下,使用振蕩頻率為6 MHz或12 MHz的晶振。如果系統(tǒng)中使用了單片機(jī)的串行口通信,則一般采用振蕩頻率為11.0592 MHz的晶振。 (3)什么是機(jī)器周期?機(jī)器周期和晶振頻率有何關(guān)系?當(dāng)晶振頻率為6MHz時,機(jī)器周期是多少? 答: 51單片機(jī)采用定時控制方式,有固定的機(jī)器周期。規(guī)定一個機(jī)器周期的寬度為6個狀態(tài),即12個振蕩脈沖周期,因此機(jī)器周期就是振蕩脈沖的十二分頻。 當(dāng)晶振頻率為6MHz時,機(jī)器周期是2us。 (4)51單片機(jī)常用的復(fù)位方法有幾種?畫電路圖并說明其工作原理。 答:2種,上電復(fù)位和按鍵復(fù)位。單片機(jī)常見的復(fù)位電路下圖所示。 (a)為上電
8、復(fù)位電路。它利用電容充電來實(shí)現(xiàn)復(fù)位,在接電瞬間,RST端的電位與VCC相同,隨著充電電流的減少,RST的電位逐漸下降。只要保證RST為高電平的時間大于兩個機(jī)器周期,便能正常復(fù)位。 (b)為按鍵復(fù)位電路。該電路除具有上電復(fù)位功能外,還可以按圖2.5(b)中的RESET鍵實(shí)現(xiàn)復(fù)位,此時電源VCC經(jīng)兩個電阻分壓,在RST端產(chǎn)生一個復(fù)位高電平。圖1.23中的信號燈控制電路就采用按鍵復(fù)位電路。 (5)51單片機(jī)片內(nèi)RAM的組成是如何劃分的?各有什么功能? 答:8051的內(nèi)部RAM共有256個單元,通常把這256個單元按其功能劃分為兩部分:低128單元(單元地址0x00~0x7F)和高128單元(單
9、元地址0x80~0xFF)。 片內(nèi)RAM的低128個單元用于存放程序執(zhí)行過程中的各種變量和臨時數(shù)據(jù),稱為DATA區(qū)。內(nèi)部RAM的高128單元地址為0x80~0xFF,是供給專用寄存器SFR(Special Function Register,也稱為特殊功能寄存器)使用的。 (6)51單片機(jī)有多少個特殊功能寄存器?它們分布在什么地址范圍? 答:51單片機(jī)有21個可尋址的專用寄存器,它們不連續(xù)地分布在片內(nèi)RAM的高128單元中,盡管其中還有許多空閑地址,但用戶不能使用。另外還有一個不可尋址的專用寄存器,即程序計數(shù)器PC,它不占據(jù)RAM單元,在物理上是獨(dú)立的。 (7)簡述程序狀態(tài)寄存器PSW
10、各位的含義,單片機(jī)如何確定和改變當(dāng)前的工作寄存器組。 答:程序狀態(tài)字PSW是一個8位寄存器,用于存放程序運(yùn)行中的各種狀態(tài)信息。PSW的各位定義如下表所示。 位 地 址 0xD7 0xD6 0xD5 0xD4 0xD3 0xD2 0xD1 0xD0 位 名 稱 CY AC F0 RS1 RS0 OV F1 P CY(PSW.7):進(jìn)位標(biāo)志位。存放算術(shù)運(yùn)算的進(jìn)位標(biāo)志。 AC(PSW.6):輔助進(jìn)位標(biāo)志位。存放算術(shù)運(yùn)算中低4位向高4位進(jìn)位或借位。 F0(PSW.5):用戶標(biāo)志位。供用戶定義的標(biāo)志位,需要利用軟件方法置位或復(fù)位。 RS1和RS0(P
11、SW.4,PSW.3):工作寄存器組選擇位。上電或復(fù)位后,RS1 RS0=00。 OV(PSW.2):溢出標(biāo)志位。存放帶符號數(shù)加減運(yùn)算的溢出位。 F1(PSW.1):保留未使用。 P(PSW.0):奇偶標(biāo)志位。存放累加器ACC數(shù)據(jù)的二進(jìn)制形式中1的個數(shù)的奇偶性。一般用于異步串行通信中的奇偶校驗(yàn)。 (8)C51編譯器支持的存儲器類型有哪些? 答:單片機(jī)的存儲器結(jié)構(gòu)包括4個物理存儲空間,C51編譯器對這4個物理存儲空間都能支持。常見的C51編譯器支持的存儲器類型如下表所示。 存儲器類型 描 述 data 直接訪問內(nèi)部數(shù)據(jù)存儲器,允許最快訪問(128 B) bdata 可
12、位尋址內(nèi)部數(shù)據(jù)存儲器,允許位與字節(jié)混合訪問(16 B) idata 間接訪問內(nèi)部數(shù)據(jù)存儲器,允許訪問整個內(nèi)部地址空間(256 B) pdata “分頁”外部數(shù)據(jù)存儲器(256 B) xdata 外部數(shù)據(jù)存儲器(64 KB) code 程序存儲器(64 KB) (9)當(dāng)單片機(jī)外部擴(kuò)展RAM和ROM時,P0口和P2口各起什么作用? 答:P0口可以分時復(fù)用作為8位數(shù)據(jù)總線和低8位地址線,P2口作為高8位地址線。 (10)在單片機(jī)的C語言程序設(shè)計中,如何使用SFR和可尋址位? 答:采用sfr和sbit來定義專用寄存器和位。 2.4 上機(jī)操作題 (1)修改程序ex2_1.c,
13、使得蜂鳴器發(fā)出有變化的報警聲。
提示:修改延時參數(shù),聲音就會有改變。
(2)利用單片機(jī)控制蜂鳴器和發(fā)光二極管,設(shè)計一個聲光報警系統(tǒng)。
提示:增加一個LED發(fā)光二極管,采用一個I/O口來控制,當(dāng)報警時,發(fā)出聲音的同時,燈也閃動。
(3)利用單片機(jī)控制按鍵和發(fā)光二極管,設(shè)計一個單鍵控制單燈亮滅的系統(tǒng)。
參考電路如下圖:
參考程序如下:
//功能:單鍵控制單燈程序
#include
14、主函數(shù) { bit led; //定義位變量led P3_0=1; //P3.0作為輸入口,置1 led=P3_0; //讀P3.0 if(led==1) P1_0=1; //判斷按鍵是否按下,沒有按下,燈熄滅 if()led==0 P1_0=0; //按鍵按下,燈點(diǎn)亮 } (4)利用單片機(jī)控制4個按鍵和4個發(fā)光二極管,設(shè)計一個4人搶答器,要求當(dāng)有某一參賽者首先按下?lián)尨痖_關(guān)時,相應(yīng)的LED燈亮,此時搶答器不再接受其他輸入信號,需按復(fù)位按鍵才能重新開始搶答。 參考電路如下圖。 參考程序如下。 //功能:實(shí)用4路搶答器程
15、序
#include
16、g=1; } else if(!P3_1) { P1=0xfd; flag=1; } else if(!P3_2) { P1=0xfb; flag=1; } else if(!P3_3) { P1=0xf7; flag=1; } while(flag); } } @ 習(xí) 題 3 3.1 單項(xiàng)選擇題 (
17、1)C (2)A (3)A (4)D (5)D (6)D (7)A (8)B (9)C (10)A (11)void delay (unsigned int i)、delay、delay 3.2 填空題 (1)main (2)sbit FLAG=P3^1; (3)sfr (4)順序、選擇和循環(huán) (5)表達(dá)式和分號 (6)if、switch (7)do-while語句、while語句 (8)無限次 (9)10000 (10)unsigned char (11)指定該變量在51單片機(jī)硬件系統(tǒng)中所使用的存儲區(qū)域,并在編譯時準(zhǔn)確的定位。 (12)’\0’
18、 3.3 上機(jī)操作題 (1)感應(yīng)燈控制系統(tǒng)設(shè)計。實(shí)現(xiàn)當(dāng)照明燈感應(yīng)到有人接近時自動開燈,當(dāng)人離開后自動關(guān)燈的功能。 提示:采用熱釋電紅外傳感器模塊和發(fā)光二極管模擬電燈 (2)自動滑動門開關(guān)控制系統(tǒng)設(shè)計。實(shí)現(xiàn)當(dāng)滑動玻璃門感應(yīng)到有人接近時自動開門,當(dāng)人離開后自動關(guān)門的功能。 提示:采用熱釋電紅外傳感器模塊和電機(jī)模擬自動開關(guān)門 @ 習(xí)題 4 4.1 單項(xiàng)選擇題 (1)C (2)A (3)C (4)B (5)B (6)D (7)B (8)C (9)D (10)D (11)C 4.2 填空題 (1)led[k] delay(); (
19、2)’\0’ (3)程序存儲器 4.3 在任務(wù)10的圖4.1中,如果直接將共陽極數(shù)碼管換成共陰極數(shù)碼管,能否正常顯示?為什么?應(yīng)采取什么措施? 答: 不能正常顯示。因?yàn)楣碴枠O數(shù)碼管和共陰極數(shù)碼管的顯示碼不同,二者是反相關(guān)系。修改程序,或者將顯示碼數(shù)組disp中的顯示碼換成共陰極顯示碼,或者在程序中增加取反操作即可。 4.4 七段LED靜態(tài)顯示和動態(tài)顯示在硬件連接上分別具有什么特點(diǎn),實(shí)際設(shè)計時應(yīng)如何選擇使用? 答: 靜態(tài)顯示是指使用數(shù)碼管顯示字符時,數(shù)碼管的公共端恒定接地(共陰極)或+5 V電源(共陽極)。將每個數(shù)碼管的8個段控制引腳分別與單片機(jī)的一個8位I/O端口相連。只要I/
20、O端口有顯示字型碼輸出,數(shù)碼管就顯示給定字符,并保持不變,直到I/O端口輸出新的段碼。數(shù)碼管動態(tài)顯示電路通常是將所有數(shù)碼管的8個顯示段分別并聯(lián)起來,僅用一個并行I/O端口控制,稱為“段選端”。各位數(shù)碼管的公共端,稱為“位選端”,由另一個I/O端口控制。 實(shí)際應(yīng)用時,當(dāng)顯示位數(shù)少于2位時,可以采用靜態(tài)顯示方式;當(dāng)顯示位數(shù)較多時,建議采用動態(tài)顯示方式。 4.5 LED大屏幕顯示一次能點(diǎn)亮多少行?顯示的原理是怎樣的? 答: LED大屏幕顯示一次能點(diǎn)亮1行,采用逐行點(diǎn)亮的方式。 顯示原理:先給第1行送高電平(行高電平有效),同時給8列送該行顯示碼(列低電平有效);然后給第2行送高電平,同時
21、給8列送顯示碼,……最后給第8行送高電平,同時給8列顯示碼。每行點(diǎn)亮延時時間為約1 ms,第8行結(jié)束后再從第1行開始循環(huán)顯示。利用視覺駐留現(xiàn)象,人們看到的就是一個穩(wěn)定的字符。 4.6 機(jī)械式按鍵組成的鍵盤,應(yīng)如何消除按鍵抖動? 答: 按鍵的機(jī)械抖動可采用硬件電路來消除,也可以采用軟件方法進(jìn)行去抖。軟件去抖編程思路:在檢測到有鍵按下時,先執(zhí)行10 ms左右的延時程序,然后再重新檢測該鍵是否仍然按下,以確認(rèn)該鍵按下不是因抖動引起的。同理,在檢測到該鍵釋放時,也采用先延時再判斷的方法消除抖動的影響。 4.7 獨(dú)立式按鍵和矩陣式按鍵分別具有什么特點(diǎn)?適用于什么場合? 答: 在單片機(jī)應(yīng)用
22、系統(tǒng)中,如果系統(tǒng)需要按鍵數(shù)量較少,一般采用獨(dú)立式按鍵接口,每個按鍵單獨(dú)占用一根I/O端口線,按鍵的工作不會影響其他I/O端口線的狀態(tài),獨(dú)立式按鍵的電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O端口線,因此,在按鍵較多時,I/O端口線浪費(fèi)較大,不宜采用。 為了節(jié)約單片機(jī)硬件接口資源,當(dāng)系統(tǒng)需要按鍵數(shù)量較多時,一般采用矩陣鍵盤接口方式。由4根行線和4根列線組成,例如:P0.0~P0.3控制行線,P2.0~P2.3控制列線,按鍵位于行、列線的交叉點(diǎn)上,且行線通過上拉電阻接到+5 V電源上,構(gòu)成了一個44(16個按鍵)的矩陣式鍵盤。 習(xí) 題 5 5.1 單項(xiàng)選擇題 (1)
23、C (2)A (3)D (4)A (5)A (6)B (7)A (8)A (9)C (10)A (11)C (12)C (13)C (14)D 5.2 填空題 (1)T0、T1、方式寄存器TMOD和控制寄存器TCON (2)GATE=0 (3)0x50 (4)設(shè)置定時器的工作方式 (5)控制定時器的啟動、停止、標(biāo)識定時器的溢出和中斷情況 (6)中斷標(biāo)志寄存器TCON、串行口控制寄存器SCON、中斷允許控制寄存器IE和中斷優(yōu)先級控制寄存器IP (7)中斷標(biāo)志寄存器TCON和串行口控制寄存器SCON、中斷允許控制寄存器IE和中斷優(yōu)先級控制寄存器
24、IP (8)電平觸發(fā)方式 (9)軟件方法、硬件方法、硬軟結(jié)合 (10)0 5.3 問答題 (1)51單片機(jī)定時/計數(shù)器的定時功能和計數(shù)功能有什么不同?分別應(yīng)用在什么場合? 答: T0或T1用做計數(shù)器時,分別對從芯片引腳T0(P3.4)或T1(P3.5)上輸入的脈沖進(jìn)行計數(shù),外部脈沖的下降沿將觸發(fā)計數(shù),每輸入一個脈沖,加法計數(shù)器加1。計數(shù)器對外部輸入信號的占空比沒有特別的限制,但必須保證輸入信號的高電平與低電平的持續(xù)時間都在一個機(jī)器周期以上。一般用于需要計數(shù)的場合,對時間沒有要求。 用做定時器時,對內(nèi)部機(jī)器周期脈沖進(jìn)行計數(shù),由于機(jī)器周期是固定值,故計數(shù)值確定時,定時時間也隨之
25、確定。如果51單片機(jī)系統(tǒng)采用12MHz晶振,則計數(shù)周期為:T機(jī)器周期=1/(12106 /12)=1ms,這是最短的定時周期。適當(dāng)選擇定時器的初值可獲取各種定時時間。一般用于對時間有要求的場合。 (2)軟件定時與硬件定時的原理有何異同? 答: 軟件定時是靠CPU運(yùn)行空操作實(shí)現(xiàn)的,CPU在定時時不能進(jìn)行其它操作,白白占用CPU時間。硬件定時是指采用單片機(jī)內(nèi)部定時器實(shí)現(xiàn)定時,當(dāng)定時器進(jìn)行計數(shù)操作時,CPU可以進(jìn)行其它操作。 (3)51單片機(jī)的定時/計數(shù)器是增1計數(shù)器還是減1計數(shù)器?增1和減1計數(shù)器在計數(shù)和計算計數(shù)初值時有什么不同? 答:51單片機(jī)的定時/計數(shù)器是增1計數(shù)器。 增1計數(shù)器
26、是在初值基礎(chǔ)上加1計數(shù),直到翻轉(zhuǎn);減1計數(shù)器是在初值基礎(chǔ)上減1計數(shù),直到翻轉(zhuǎn)。計算初值時,增1計數(shù)的初值需要用最大計數(shù)值(模值)減去計數(shù)值;減1計數(shù)的初值就是計數(shù)值。 (4)當(dāng)定時/計數(shù)器在工作方式1下,晶振頻率為6 MHz,請計算最短定時時間和最長定時時間各是多少? 答:工作方式1的計數(shù)模值是65536,機(jī)器周期2us,所以最短定時時間為2us,最長定時時間為:2us*65536=130ms。 (5)51單片機(jī)定時/計數(shù)器四種工作方式的特點(diǎn)有哪些?如何進(jìn)行選擇和設(shè)定? 答:工作方式0是13位定時計數(shù)器,工作方式1是16位定時計數(shù)器,工作方式2是初值自動重載的8位定時計數(shù)器,工作方式3
27、下只有T0可以設(shè)置為工作方式3,T1設(shè)置為工作方式3后不工作。 可根據(jù)應(yīng)用場合和定時時間來確定工作方式,在TMOD寄存器中設(shè)定。 (6)什么叫中斷?中斷有什么特點(diǎn)? 答: 中斷是指通過硬件來改變CPU的運(yùn)行方向。計算機(jī)在執(zhí)行程序的過程中,外部設(shè)備向CPU發(fā)出中斷請求信號,要求CPU暫時中斷當(dāng)前程序的執(zhí)行而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,待處理程序執(zhí)行完畢后,再繼續(xù)執(zhí)行原來被中斷的程序。這種程序在執(zhí)行過程中由于外界的原因而被中間打斷的情況稱為“中斷”。 中斷特點(diǎn):同步工作、實(shí)時處理、異常處理等。 (7)51單片機(jī)有哪幾個中斷源?如何設(shè)定它們的優(yōu)先級? 答: 中斷源有5個,分別為外部中斷0
28、請求、外部中斷1請求、T0溢出中斷請求TF0、T1溢出中斷請求TF1和串行口中斷請求RI或TI。 51單片機(jī)有兩個中斷優(yōu)先級:高優(yōu)先級和低優(yōu)先級。 每個中斷源都可以通過設(shè)置中斷優(yōu)先級寄存器IP確定為高優(yōu)先級中斷或低優(yōu)先級中斷,實(shí)現(xiàn)二級嵌套。同一優(yōu)先級別的中斷源可能不止一個,因此,也需要進(jìn)行優(yōu)先權(quán)排隊。同一優(yōu)先級別的中斷源采用自然優(yōu)先級。中斷優(yōu)先級寄存器IP,用于鎖存各中斷源優(yōu)先級控制位。IP中的每一位均可由軟件來置1或清零,1表示高優(yōu)先級,0表示低優(yōu)先級。 (8)外部中斷有哪兩種觸發(fā)方式?如何選擇和設(shè)定? 答: 外部中斷有電平觸發(fā)方式和下降沿觸發(fā)方式。由TCON中的IT位設(shè)定,例如:
29、 當(dāng)IT1 = 0時,外部中斷1控制為電平觸發(fā)方式;當(dāng)IT1 = 1時,外部中斷1控制為邊沿(下降沿)觸發(fā)方式。 (9)中斷函數(shù)的定義形式是怎樣的? 答: C51編譯器支持在C源程序中直接以函數(shù)形式編寫中斷服務(wù)程序。中斷函數(shù)的定義形式如下: void 函數(shù)名() interrupt n 其中n為中斷類型號,C51編譯器允許0~31個中斷,n的取值范圍為0~31。 5.4 操作題 (1)設(shè)計時間間隔為1 s的流水燈控制程序。 參考程序如下: //功能:間隔顯示時間為1秒的流水燈程序 #include "REG51.H" //包含頭文件REG51.H
30、,定義了MCS-51單片機(jī)的特殊功能寄存器 //函數(shù)名:delay1s //函數(shù)功能:用T1工作在方式1下的1秒延時函數(shù),采用查詢方式實(shí)現(xiàn) //形式參數(shù):無 //返回值:無 void delay1s() { unsigned char i; for(i=0;i<0x14;i++){ //設(shè)置20次循環(huán)次數(shù) TH1=0x3c; //設(shè)置定時器初值為3CB0H TL1=0xb0; TR1=1; //啟動T1 while(!TF1); //查詢計數(shù)是否溢出,即定時50
31、ms時間到,TF1=1 TF1=0; //50ms定時時間到,將T1溢出標(biāo)志位TF1清零 } } void main() //主函數(shù) { unsigned char i,w; TMOD=0x10; //設(shè)置T1為工作方式1 while(1){ w=0x01; //顯示碼初值為01H for(i=0;i<8;i++){ P1=~w; //w取反后送P1口,點(diǎn)亮相應(yīng)LED燈 w<<=1;
32、 //點(diǎn)亮燈的位置移動 delay1s(); //調(diào)用1秒延時函數(shù) } } } (2)用單片機(jī)控制8個LED發(fā)光二極管,要求8個發(fā)光二極管按照BCD碼格式循環(huán)顯示00~59,時間間隔為1 s。 提示: BCD(Binary Coded Decimal)碼是用二進(jìn)制數(shù)形式表示十進(jìn)制數(shù),例如十進(jìn)制數(shù)45,其BCD碼形式為0x45。BCD碼只是一種表示形式,與其數(shù)值沒有關(guān)系。 BCD碼用4位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù),這4位二進(jìn)制數(shù)的權(quán)為8421,所以BCD碼又稱為8421碼。用4位二進(jìn)制數(shù)表示一個十進(jìn)制數(shù),例如十進(jìn)制數(shù)56、87和1
33、43的BCD碼表示形式如下:
0101 0110 (56)
1000 0111 (87)
0001 0100 0011 (143)
答:
參考程序如下:
//功能:采用BCD碼格式顯示的0~59簡易秒表程序
#include
34、 t=(((i/10)<<4)|(i%10));// 將i轉(zhuǎn)換為BCD碼
P1=~t; // 計數(shù)值取反后送P1口顯示
delay1s(); // 調(diào)用1秒延時函數(shù)
}
}
}
(3)可控霓虹燈設(shè)計。系統(tǒng)包括8個發(fā)光二極管,連接在P3.2引腳的一個按鍵,通過按鍵改變霓虹燈的顯示方式。要求正常情況下8個霓虹燈依次順序點(diǎn)亮,循環(huán)顯示,時間間隔為1 s。按鍵按下后8個霓虹燈同時亮滅一次,時間間隔為0.5 s。(按鍵動作采用外部中斷0實(shí)現(xiàn))。
答:
參考程序如下:
//功能:可控信號燈程序
#include 35、g51.h>
//函數(shù)名:delay0_5s
//函數(shù)功能:用T0的方式1編制0.5秒延時程序,假定系統(tǒng)采用12MHz晶振,定
// 時器1、工作方式1定時50ms,再循環(huán)10次即可定時到0.5秒
//形式參數(shù):無
//返回值:無
void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++) // 設(shè)置10次循環(huán)次數(shù)
{
TH0=0x3c; // 設(shè)置定時器初值
TL0=0xb0;
TR0=1; // 啟動T0
36、 while(!TF0); // 查詢計數(shù)是否溢出,即定時50ms時間到,TF0=0
TF0=0; // 50ms定時時間到,將定時器溢出標(biāo)志位TF0清零
}
}
//函數(shù)名:delay_t
//函數(shù)功能:實(shí)現(xiàn)0.5秒~128秒延時
//形式參數(shù):unsigned char t;
// 延時時間為0.5秒t
//返回值:無
void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i 37、函數(shù)名:int_0
//函數(shù)功能:外部中斷0中斷函數(shù),當(dāng)CPU響應(yīng)外部中斷0的中斷請求時,自動執(zhí)行該
// 函數(shù),實(shí)現(xiàn)八個信號燈閃爍
//形式參數(shù):無
//返回值:無
void int_0() interrupt 0 //外部中斷0的中斷號為0
{
P1=0x00; //熄滅八個信號燈
delay0_5s(); //調(diào)用0.5秒延時函數(shù)
P1=0xff; //點(diǎn)亮八個信號燈
delay0_5s(); //調(diào)用0.5秒延時函數(shù)
}
void main() //主函數(shù)
{
38、 unsigned char i,w;
EA=1; // 打開中斷總允許位
EX0=1; // 打開外部中斷0允許位
IT0=1; // 設(shè)置外部中斷為邊沿(下降沿)觸發(fā)方式
TMOD=0x01; // 設(shè)置T0為工作方式1
while(1){
w=0x01; // 顯示碼初值為01H
for(i=0;i<8;i++){
P1=~w; // w取反后送P1口,點(diǎn)亮相應(yīng)LED燈
39、w<<=1; // 點(diǎn)亮燈的位置移動
delay_t(2); // 調(diào)用延時函數(shù)delay_t(),實(shí)際參數(shù)為2,延時1秒
}
}
}
習(xí) 題 6
6.1 單項(xiàng)選擇題
(1)A (2)B (3)D (4)C (5)B (6)C (7)B (8)C
(9)C (10)A (11)C (12)D (13)A
6.2 問答題
(1)什么是串行異步通信?有哪幾種幀格式?
答:
在異步通信中,數(shù)據(jù)通常是以字符為單位組成字符幀傳送的。字符幀由發(fā)送 40、端一幀一幀地發(fā)送,每一幀數(shù)據(jù)是低位在前,高位在后,通過傳輸線由接收端一幀一幀地接收。發(fā)送端和接收端分別使用各自獨(dú)立的時鐘來控制數(shù)據(jù)的發(fā)送和接收,這兩個時鐘彼此獨(dú)立,互不同步。
在串行通信中,兩相鄰字符幀之間可以沒有空閑位,也可以有若干空閑位,這由用戶來決定。
(2)定時器T1做串行口波特率發(fā)生器時,為什么采用工作方式2?
答:
實(shí)際上,當(dāng)定時器T1做波特率發(fā)生器使用時,通常是工作在定時器的模式2下,即作為一個自動重裝載的8位定時器,TL1做計數(shù)用,自動重裝載的值在TH1內(nèi)。
7.3 編程題
(1)利用串行口設(shè)計4位靜態(tài)LED顯示,畫出電路圖并編寫程序,要求4位LED每隔1 s交替 41、顯示“1234”和“5678”。
參考電路在教材第207頁圖6.16的基礎(chǔ)之上再添加兩片74LS164和兩個數(shù)碼管即可。
參考程序如下:
#include "reg51.h" //包含頭文件reg51.h,定義51單片機(jī)的專用寄存器
unsigned char da[]={0xF9,0xA4,0xB0,0x99}; //定義1~4的共陽極字型顯示碼
unsigned char da1[]={0x92,0x82,0x0F8,0x80}; //定義5~8的共陽極字型
void delay1s()
{
unsigned char i;
for(i=0;i<0x2 42、0;i++) // 設(shè)置20次循環(huán)次數(shù)
{
TH0=0x3c; // 設(shè)置定時器初值
TL0=0xb0;
TR0=1; // 啟動T0
while(!TF0); // 查詢計數(shù)是否溢出,即定時50ms時間到,TF0=0
TF0=0; // 50ms定時時間到,將定時器溢出標(biāo)志位TF0清零
}
}
main()
{
unsigned char i;
P1=0xff; //P1.0置1,允許串行移位
SCON=0x00; 43、 //設(shè)串行口方式0
TMOD=0x01; // 設(shè)置T0為工作方式1
while(1){
for (i=0;i<4;i++)
{
SBUF=da[i]; //送顯示數(shù)據(jù)1234
TI=0;
while(!TI); //等待發(fā)送完畢
}
delay1s();
for (i=0;i<4;i++)
{
SBUF=da1[i]; //送顯示數(shù)據(jù)5678
TI=0;
whi 44、le(!TI); //等待發(fā)送完畢
}
}
}
(2)編程實(shí)現(xiàn)甲乙兩個單片機(jī)進(jìn)行點(diǎn)對點(diǎn)通信,甲機(jī)每隔1 s發(fā)送一次“A”字符,乙機(jī)接收到以后,在LCD上能夠顯示出來。
參考電路圖略。
參考程序如下:
甲機(jī)發(fā)送程序:
//功能:甲機(jī)發(fā)送數(shù)據(jù)程序,采用查詢方式實(shí)現(xiàn)
#include 45、 //波特率為2400bps
TH1=0xf4;
TR1=1;
while(1)
{
SCON=0x40; //定義串行口工作于方式1
SBUF=0x41; // 發(fā)送A
while(TI==0); // 查詢等待發(fā)送是否完成
TI=0; // 發(fā)送完成,TI由軟件清0
delay1s(); //1秒延時函數(shù)參見7.3(1)題
}
}
乙機(jī)接收程序略。
(3)編寫一個實(shí)用的串行通信測試軟件,其功能為:將PC機(jī)鍵盤的輸入數(shù)據(jù)發(fā)送給單片機(jī),單片機(jī)收到PC機(jī)發(fā) 46、來的數(shù)據(jù)后,回送同一數(shù)據(jù)給PC機(jī),并在屏幕上顯示出來。只要屏幕上顯示的字符與所鍵入的字符相同,說明二者之間的通信正常。
通信協(xié)議: 第1字節(jié),最高位(MSB)為1,為第1字節(jié)標(biāo)志;第2字節(jié),MSB為0,為非第1字節(jié)標(biāo)志,依次類推,最后1字節(jié)為前幾字節(jié)后7位的異或校驗(yàn)和。
單片機(jī)串行口工作在方式1,晶振為11.0592 MHz,波特率為4800 bps。
通信程序略。
習(xí) 題 7
7.1 單項(xiàng)選擇題
(1)D (2)A (3)C (4)D (5)A
7.2 填空題
(1)模擬,數(shù)字,數(shù)字,模擬
(2)分辨率、建立時間
7.3 問答題
(1)判斷A/D 47、轉(zhuǎn)換是否結(jié)束,一般可采用幾種方式?每種方式有何特點(diǎn)?
答:
查詢方式,CPU通過查詢轉(zhuǎn)換結(jié)束標(biāo)志位確認(rèn)轉(zhuǎn)換結(jié)束后,再執(zhí)行后面的操作,占用CPU時間;
中斷方式,轉(zhuǎn)換結(jié)束后向CPU申請中斷,CPU在中斷服務(wù)函數(shù)中讀取轉(zhuǎn)換值,不占用CPU時間;
延時方式,如果知道A/D轉(zhuǎn)換時間,可以在轉(zhuǎn)換開始后直接延時超過該時間的時間,占用CPU時間。
7.4 應(yīng)用題
(1)設(shè)計一個鋸齒波發(fā)生器系統(tǒng)。
提示:程序ex7_3.c中修改數(shù)組sin據(jù)即可。
(2)EEPROM芯片AT24C02采用的也是I2C總線接口,請設(shè)計51單片機(jī)擴(kuò)展EEPROM的軟硬件系統(tǒng)。
提示:請查閱AT24C02資料,參考 48、電路(AT24C01)
//功能:EEPROM讀寫程序,從AT24C01的4個連續(xù)存儲單元中讀出4個字節(jié)的數(shù)據(jù),然后將4
// 個新的數(shù)值寫入AT24C01的對應(yīng)4個存儲單元中,再重新讀出。
#include 49、 0xa1 //器件地址選擇及讀數(shù)據(jù)地址0xa1
sbit SDA= P3^4; //串行數(shù)據(jù)輸入/輸出位定義
sbit SCL= P3^3; //串行時鐘位定義
bit ack_bit; //應(yīng)答標(biāo)志
/******************************函數(shù)聲明************************************/
void mDelay(unsigned char ms); //延時函數(shù)聲明
void Start(void); //開始函數(shù)
void Stop(void); 50、 //停止函數(shù)
void Ack(void); //應(yīng)答函數(shù)
void NoAck(void); //反向應(yīng)答函數(shù)
void Shout(unsigned char Data); //串行輸出數(shù)據(jù)函數(shù)
unsigned char Shin(void); //串行輸入數(shù)據(jù)函數(shù)
void WrByte(unsigned char Data[],unsigned char Address,unsigned char Num);
//寫字節(jié)函數(shù)
void RdRadom(unsigned char Data[],unsigned char Address 51、,unsigned char Num);
//隨機(jī)地址讀函數(shù)
/******************************主函數(shù)************************************/
void main()
{
unsigned char R1data[4]= {0,0,0,0}; //初始化讀數(shù)據(jù)數(shù)組1為全0
unsigned char R2data[4]= {0,0,0,0}; //初始化讀數(shù)據(jù)數(shù)組2為全0
unsigned char Wdata[4]={1,2,3,4}; //初始化寫數(shù)據(jù)數(shù)組
RdRadom(R1data,4,4); 52、 //讀AT24C01中的4個字節(jié)數(shù)據(jù)到讀數(shù)據(jù)數(shù)組1
WrByte(Wdata,4,4); //將初始化后的數(shù)值寫入AT24C01
mDelay(20);
RdRadom(R2data,4,4); //重新讀出寫入的數(shù)據(jù)到讀數(shù)據(jù)數(shù)組2
}
/******************************寫字節(jié)************************************/
//函數(shù)名:WrByte
//函數(shù)功能:向AT24C**器件的指定地址按字節(jié)連續(xù)寫入數(shù)據(jù)
//形式參數(shù):待寫入的數(shù)據(jù)Data[],起始地址Address,待寫入的字節(jié)數(shù)Num
53、//返回值:返回為0表示操作成功,否則操作有誤
void WrByte(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i 54、+i); //發(fā)送地址
Ack(); //接收ACK應(yīng)答
Shout(*(PData+i)); //發(fā)送待寫入的數(shù)據(jù)
Ack(); //接收ACK應(yīng)答
Stop(); //發(fā)送停止信號
mDelay(20); //等待內(nèi)定時寫入周期結(jié)束
}
/*****************************隨機(jī)地址讀***********************************/
//函數(shù)名:RdRadom
//函數(shù)功能:從AT24C**器件的指定地址按字節(jié)讀入數(shù)據(jù)
//形式參數(shù):起始地址Address,待讀入的字節(jié)數(shù) 55、Num
//返回值:讀出的字節(jié)放入data[],如果操作成功返回為0,否則操作有誤
void RdRadom(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i 56、
Start(); //開始
shout(AddRd); //發(fā)送讀操作器件地址AddRd
Ack();
*(PData+i)=shin(); //調(diào)用讀數(shù)據(jù)函數(shù)
SCL=0;
NoAck(); //反向應(yīng)答
Stop(); //停止
}
}
/*****************************開始函數(shù)***********************************/
//函數(shù)名: Start
//函數(shù)功能:發(fā)送START狀態(tài),定義為當(dāng)SCL為高時SDA從高到低
//形式參數(shù):無
//返回值:返回時SCL,SDA為低
57、
void Start(void)
{
SDA=1; //升高SDA
SCL=1; //升高SCL
_nop_();_nop_();_nop_();_nop_(); //保持?jǐn)?shù)據(jù)建立延遲及周期延遲
SDA=0; //降低SDA
_nop_();_nop_();_nop_();_nop_(); //保持SDA為低,保持時間hold delay
SCL=0; //降低SCL
}
/********************************停止函數(shù)***************************** 58、****/
//函數(shù)名:Stop
//函數(shù)功能:發(fā)送STOP狀態(tài),定義為當(dāng)SCL為高時SDA從低變高
//形式參數(shù):無
//返回值:返回時SCL,SDA為高
void Stop(void)
{
SDA=0;
_nop_();_nop_(); //保持SCL為低及數(shù)據(jù)穩(wěn)定
SCL=1;
_nop_();_nop_();_nop_();_nop_(); //保持建立延遲
SDA=1;
_nop_();_nop_();_nop_();_nop_();
}
/*******************************串行輸出數(shù)據(jù)*************** 59、**************/
//函數(shù)名:Shout
//函數(shù)功能:串行發(fā)送一個字節(jié)(包括地址和數(shù)據(jù))給AT24C**器件,高位在前
//形式參數(shù):待發(fā)送的字節(jié)Data,調(diào)用前SCL,SDA為低,返回時SCL為低。
//返回值:無
void Shout(unsigned char Data)
{
unsigned char BitCounter=8; //設(shè)置位計數(shù)器
unsigned char temp; //中間變量控制
do
{
temp=Data;
SCL=0; //時鐘為低電平
_nop_();_nop_();_nop_() 60、;_nop_();//保持SCL為低
if((temp&0x80)==0x80) SDA=1; //輸出一位,如果最高位是1,則輸出1到SDA
else SDA=0; //如果最高位是0,則輸出0到SDA
SCL=1; //時鐘為高電平
temp=Data<<1; //左移一位(高位在前)
Data=temp;
BitCounter--;
}while(BitCounter); //傳送下一位
SCL=0;
}
/*******************************串行輸入數(shù)據(jù)*************************** 61、***/
//函數(shù)名:Shin
//函數(shù)功能:從AT24C**串行讀入一個字節(jié)數(shù)據(jù),高位在前
//形式參數(shù):調(diào)用前SCL為低
//返回值:返回讀入的字節(jié),返回時SCL為低
unsigned char Shin(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8; //設(shè)置位計數(shù)器
SDA=1; //使SDA為高,準(zhǔn)備讀
do{
SCL=0; //降低時鐘
_nop_();_nop_();_nop_();_nop_();//保持SC 62、L為低且使數(shù)據(jù)穩(wěn)定
SCL=1; //升高時鐘
_nop_();_nop_();_nop_();_nop_();//保持SCL為高
if(SDA) temp=temp|0x01; //輸入一位,如果SDA=1則temp的最低位置1
else temp=temp&0xfe; //否則temp的最低位清0
if(BitCounter-1)
{
temp1=temp<<1; //左移一位(高位在前)
temp=temp1;
}
BitCounter--;
}while(BitCounter); //傳送下一位
return(temp); 63、 //返回讀入的數(shù)據(jù)
}
//********************************應(yīng)答**************************************/
//函數(shù)名:Ack
//函數(shù)功能:檢測來自AT24C**器件的ACK應(yīng)答
//形式參數(shù):無
//返回值:返回ack_bit,為0表示操作成功,否則操作有誤
bit Ack(void)
{
bit ack_bit;
SDA=1; //置SDA為高,準(zhǔn)備接收ACK應(yīng)答
_nop_();_nop_();_nop_();_nop_();
SCL=1; //第9個時鐘脈沖 64、
_nop_();_nop_();_nop_();_nop_();
ack_bit = SDA; //讀入應(yīng)答
SCL=0;
return(ack_bit); //返回應(yīng)答標(biāo)志ack_bit
}
/*******************************反向應(yīng)答*************************************/
//函數(shù)名:NoAck
//函數(shù)功能:向AT24C**器件發(fā)送NAK反向應(yīng)答,隨時鐘輸出一個高電平的負(fù)應(yīng)答位,調(diào)用前
// SCL為低,返回時SCL為低,SDA為高
//形式參數(shù): 無
//返回值 65、: 無
void NoAck(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
/**********************************延時************************************/
//函數(shù)名:mDelay
//函數(shù)功能:延時函數(shù)
//函數(shù)形式參數(shù):ms用來控制循環(huán)次數(shù),從而控制延時時間長短
//函數(shù)返回值: 無
void mDelay(unsigned char ms)
{
unsigned int i;
while(ms--)
{
for(i=0;i<125;i++);
}
}
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版小學(xué)數(shù)學(xué)五年級下冊圖形的運(yùn)動(三)-1課件
- 供應(yīng)鏈管理方法
- 2019最新青島版數(shù)學(xué)一年級上冊第三單元《走進(jìn)花果山-10以內(nèi)的加減法》(信息窗6)課件
- 第四章勞動中的心理、生理狀態(tài)對安全的影響
- 201x九年級物理上冊-雙休作業(yè)八(新版)教科版課件
- 課件:項(xiàng)目一-電子商務(wù)物流系統(tǒng)規(guī)劃
- 【人教版】2012-2013學(xué)年九年級(全一冊)數(shù)學(xué)小復(fù)習(xí):第27章相似復(fù)習(xí)課件
- 消化腺(全英文)課件
- 小學(xué)語文資源五年級上冊課件《落花生》課件第一課時
- 納米材料的基本效應(yīng)課件
- 分析化學(xué)概論-課件
- 沉浸式光影解決方案課件
- 第六講加固Windows操作系統(tǒng)安全ppt課件
- 民主選舉投出理性一票ppt課件
- 高二數(shù)學(xué)選修正態(tài)分布推薦實(shí)用全套PPT