單片機原理及應用江世明課后參考答案_第1頁
單片機原理及應用江世明課后參考答案_第2頁
單片機原理及應用江世明課后參考答案_第3頁
單片機原理及應用江世明課后參考答案_第4頁
單片機原理及應用江世明課后參考答案_第5頁
已閱讀5頁,還剩51頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第1章單片機基礎思考與練習答案一、填空題1.在一塊芯片上集成了CPU、I/O端口、存儲器等部件,使得該芯片具有計算機的功能,可以應用于工業現場的檢測、過程控制中,因此,單片機又稱為嵌入式控制器。2.單片機在我國具有廣泛的應用,目前主要應用的單片機系列為51、PIC、AVR。3.存儲器分程序存儲器、數據存儲器兩種,在物理空間上,單片機的存儲器分成四個空間,在邏輯上分成片內數據存儲器、片外數據存儲器、片內外統一編址的程序存儲器三個空間。4.讀引腳時,一定要先對引腳置1。5.P0口作通用的I/O口使用時一定要接上拉電阻,P3口除了作通用的I/O口使用外還具有第二功能。6.時鐘頻率為12MHZ,單片機一個機器周期為1us,需要12個時鐘振蕩周期。7.位地址為30H,88H的位,該位所在字節的字節地址分另為26H、TCON。8.片內字節地址為2AH單元最低位的位地址是50H。9.AT89S51單片機有16條地址線,因此其尋址的范圍為64KB。10.單片機有空閑和掉電兩種空閑方式。二、選擇題1.單片機的核心部件稱為(C)。A.RAM B.ROM C.CPU D.I/O2.下列存儲器中,掉電后存儲器中的數據會丟失的是(B)。A.ROMB.SRAMC.EPROMD.FLASHMEMORY3.AT89S51擴展外部存儲器時,和外圍存儲器交換數據是通過單片機的(A)口傳輸的。A.P0口B.P1口C.P2口D.P3口4.若使用擴展外部程序存儲器,單片機的EA(B)。A.接高電平B.接低電平C.懸空5.AT89S51單片機的內部程序存儲器容量是(B)。A.256BB.4KBC.8KBD.64KB三、簡答題1.簡述單片機。答案要點:結構上要有CPU、I/O端口、存儲器等主要組成部分。繪制結構圖(三總線結構)簡要介紹存儲器、I/O端口結構。單片機應用領域。單片機發展趨勢。簡述51系列單片機存儲器。答案要點:繪制單片機存儲器結構圖,并做簡要介紹。介紹單片機程序程序器、數據存儲器、特殊功能寄存器的功能。簡述單片機I/O端口。答案要點:繪制I/O端口結構。說明I/O端口讀寫原理。STC89C51單片機的EA、ALE、PSEN信號各自的功能是什么?答案要點:1、EA:為程序存儲器的內外部選通線。當EA=1時,先選通片內程序存儲器,當片內程序存儲器存放的指令讀完后再讀外部存儲器;當EA=0時,選擇外部程序存儲器程序。2、ALE:ALE為地址鎖存信號。在單片機正常運行時,ALE發出頻率為時鐘頻率fosc的1/6的脈沖。3、PSEN:訪問外部程序存儲控制信號。5.什么是時鐘周期、機器周期、指令周期?當晶振頻率為6MHz時,機器周期是多少?答案要點:時鐘周期:1/f(f為晶振頻率)。機器周期:完成一個基本操作所需時間(分六個狀態,12個時鐘周期)。當f=6MHz時,T機=(1/f)*12=(1/6)*12=2μs。6.程序狀態寄存器PSW的作用是什么?常用狀態標志有哪幾位?其作用是什么?答案要點:程序狀態字寄存器PSW是一個8位寄存器,是程序運行狀態標志位序PSW.7PSW.6PSW.5PSW.4PSW.3PSW.2PSW.1PSW.0位標志CYACF0RS1RS0OV-PCY:進位標志位。在進行加減運算時,如果操作結果最高位有進位或借位,CY置1,否則清0;在進行位操作時,CY作為位操作累加器。AC:輔助進位標志位。在進行加、減運算時,當低4位向高4位進位或借位時,AC置位,否則被清零。AC輔助進位也常用于十進制調整。F0:用戶標志位。供用戶設置的標志位。RS1和RS:寄存器組選擇位。用于選擇指令當前工作的寄存器組。OV:溢出標志。F1:用戶標志位。由用戶置位和復位。P:奇偶校驗位。該位始終跟蹤累加器A的奇偶性,A中有奇數個1則P=1,否則P=0。位地址7CH與字節地址7CH有何區別?位地址7CH具體在內存中的什么位置?答案要點:位地址7CH位于內部數據存儲器2FH單元的第5位,代表的是某一位,7CH地址代表的是一個字節,他們有本質的區別。8.繪制單片機的晶振電路和復位電路,并指出復位后各SFR的狀態。答案要點:單片機晶振電路單片機復位電路單片機SFR復位后狀態寄存器復位狀態寄存器復位狀態寄存器復位狀態PC0000HTMOD00HIP×××00000BAcc00HTCON00HIE0××00000BPSW00HTHO00HSBUF××××××××BB00HTLO00HPCON0×××0000BSP07HTH100HAUXR××××0××0BDPTR0000HTL100HAUXR1×××××××0BPO~P3FFHSCON00HWDTRST××××××××BDP0H00HDP1H00HDP0L00HDP1L00H思考與練習一、填空題1.在我國,單片機開發軟件主要用Wave和Keil。2.Proteus電子設計軟件是英國Labcenter

electronics公司開發的,目前唯一能仿真CPU的電子設計軟件。在Proteus設計環境能完成電路設計、PCB板設計、系統仿真等電路的設計和指標分析。3.Proteus提供了豐富的元器件資源,電路設計時找元器件的操作步驟是:點對象選擇按紐P,在彈出的對話框中,輸入元器件的英文名稱,再選擇所需元器件。4.在Proteus設計環境,對于單片機應用系統,仿真的步驟是:先進行電路設計、再進行程序設計、加載程序、系統仿真。5.Proteus有交互仿真和高級圖表仿真兩種仿真。二、應用題1.簡述Wave軟件開發單片機過程。參考答案:打開Wave軟件→新建文件→程序編譯→模擬調試簡述作Keil軟件開發單片機過程。參考答案:打開Keil→新建項目(并選擇好單片機)→建立工程文件→程序設計→程序加載→程序編譯→模擬調試簡述Proteus電子電路設計過程。參考答案:打開Proteus→新建文件→電路設計→程序設計→程序加載→系統仿真。思考與練習答案一、填空題1.匯編指令格式是:[標號:]操作碼助記符[目的操作數,][源操作數][;注釋]。2.STC89C51單片機有七種尋址方式,它們分別是立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址、位尋址。3.指令MOVA,#30H,屬于立即尋址方式。4.指令MOVA,30H,屬于直接尋址方式。5.指令MOVC,30H,屬于位尋址方式。6.指令MOVX@DPTR,A,屬于寄存器間接尋址方式。7.指令JNZ75H,屬于相對尋址方式。8.指令MOVCA,@A+DPTR,屬于變址尋址方式。9.指令MOVA,R1,屬于寄存器尋址方式。10.指令中Rn指的是R0→R7。二、選擇題1.在程序設計過程中,若要建立一個數據表格,使用的偽指令為(B)。A.DW B.DB C.DS D.XDATA2.MCS-51指令系統的指令格式中,必不可少的部分為(B)。A.標號 B.操作碼 C.操作數 D.注釋3.下列指令執行后,影響標志位的指令為(B)。A.RL B.RLC C.DECA D.AJMP4.設當前PC的值為0900H,則執行無條件轉移指令AJMP03FFH指令后,程序轉移的目的地址為(D)。A.01FFH B.02FFH C.03FFH D.0BFFH三、應用題1.編程實現滿足下面要求的數據傳送。(1)R0的內容送到R1中。答案要點:MOVA,R0MOVR1,A外部RAM的20H單元內容送內部RAM的20H單元。答案要點:MOVR0,#20HMOVXA,@R0MOV@R0,A外部RAM的2000H單元內容送外部RAM的3000H單元。答案要點:MOVDPTR,#2000HMOVXA,@DPTRMOVDPTR#3000HMOVX@DPTR,AROM的2000H單元內容送到R0。答案要點:MOVA,#00HMOVDPTR,#2000HMOVC@A+DPTRMOVR0,A外部2000H單元與1000H單元的內容互換。答案要點:MOVDPTR,#2000HMOVXA,@DPTRMOV20H,AMOVDPTR,#1000HMOVXA,@DPTRXCHA,20HMOVX@DPTR,AMOVA,20HMOVDPTR,#2000HMOVX@DPTR,A2.試比較下列每組兩條指令的區別。(1)MOVA,#20H與MOVA,24H答案要點:MOVA,#20H表示將立即數20H送A。MOVA,24H表示將直接地址24H中的內容送A。MOVA,R0與MOVA,@R0答案要點:MOVA,R0表示將寄存器R0的內容送A。MOVA,@R0表示將以R0的內容為地址的單元中的數據送A。MOVA,@R0與MOVXA,@R0答案要點:MOVA,@R0表示將以R0的內容為地址的內部RAM單元中的數據送A。MOVXA,@R0表外部以R0的內容為地址的單元中的數據送A。MOVXA,@R1與MOVXA,@DPTR答案要點:MOVXA,@R1表外部以R1的內容為地址的外部數據存儲單元中的數據送A,尋址范圍為0-255B。MOVXA,@DPTR表外部以DPTR的內容為地址的單元中的數據送A,尋址范圍為64KB。思考與練習一、填空題1.匯編程序有順序結構、分支結構、循環結構3種基本結構。2.分支結構分為單分支、雙分支和多分支。3.通常情況下,循環結構分為循環初始化、循環體和循環結束3個部分。4.查表用的關鍵語句是:MOVCA,@A+DPTR。5.JMP@A+DPTR用于多分支結構的程序設計。6.在C51程序中,一般來說,參數傳遞有值和地址傳遞_兩種形式。7.C語言3個循環語句分別是while語句、do-while語句和for語句。8.若要將十六進制數據ED送入P1口,用匯編語言指令表示為MOVP1,#0EDH,用C語言表示為_P1=0xED。9.分別寫出外部中斷0和定時中斷1的C語言函數名interrupt0、interrupt310.要把編好的C51程序生成可執行文件,要經過編譯和下載兩個步驟。二、選擇題1.在Keil里開發80C51程序的第一步是什么?(D)A.調試與仿真B.產生可執行文件C.組建程序D.打開或新建項目文件2.在Keil里要導入C源程序,應如何操作?(B)A.運行File/New命令B.雙擊“SourceGroup1”C.運行Project/New命令D.左擊“SourceGroup1”3.用來設置輸出HEXFile這個命令的標簽頁為下面哪項?(B)A.Debug標簽頁B.Output標簽頁C.Target標簽頁D.Device標簽頁三、簡答題1.C51編程與標準C語言編程有什么主要區別?C51是標準C的擴展,使用專用的編輯器,如keil與franklin等;C51特有的有以下幾點不同:Sfr、bit型變量bdata、code、xdata、pdata、idata存儲類型Interrupt中斷函數最主要的是C51主要面向的是硬件,程序的編寫思路與標準C不同。2.C51單片機的數據類型?答:KeilC51支持的基本數據類型如下表所示。針對51單片機的硬件特點,C51在標準C的基礎上,擴展了4個數據類型(擴展的4種數據類型,不能使用指針來對它們存取)。表KeilC51支持的數據類型數據類型位數字節數值域signedchar81-128~+127,有符號字符變量unsignedchar810~255,無符號字符變量signedint162-32768~+32767,有符號整型數unsignedint1620~65535,無符號整型數signedlong324-2147483648~+2147483647,有符號長整型數unsignedlong3240~+4294967295,無符號長整型數float324±3.302823E+38,浮點數(精確到7位)double648±1.175494E-308,浮點數(精確到15位)*241~3對象指針bit10或1sfr810~255sfr161620~65535sbit1可進行位尋址的特殊功能寄存器的某位的絕對地址C51的擴展4種數據類型:bit:位類型。可以定義一個位變量,位變量值為0或1,不能定義位指針和位數組。sbit:可尋址位。可以定義單片機內部RAM中的可尋址位或特殊功能寄存器中的可尋址位。例如:sfrPSW=0xd0;//定義PSW寄存器地址為0xd0sbitPSW^2=0xd2;//定義OV位為PSW.2sfr:特殊功能寄存器。可以定義單片機內部的所有8位特殊功能寄存器。該類數據占用一個內存單元,取值范圍為0~255。如sfrP1=0x90。sfr16:16位特殊功能寄存器。可以定義單片機內部16位特殊功能寄存器。該類數據占用兩個內存單元,取值范圍為0~65535。例如:“sfr16DPTR=0x82”語句定義了片內16位數據指針寄存器DPTR,其低8位字節地址為82H,高8位字節地址為83H。簡述C51存儲類型與51單片機存儲空間的對應關系。存儲區描述DATA片內RAM的低128字節,可在一個周期內直接尋址BDATA片內RAM的位尋址區,16字節IDATA片內RAM的256字節,必須采用間接尋址XDATA外部數據存儲區,使用DPTR間接尋址PDATA外部存儲區的256個字節,通過P0口的地址對其尋址。使用MOVX@Ri,需要倆個指令周期CODE程序存儲區,使用DPTR尋址4.C51中51單片機的特殊功能寄存器如何定義?試舉例說明。(1)使用關鍵字定義sfrsfr特殊功能寄存器名字=特殊功能寄存器地址;如:sfrSCON=0x98; /*串口控制寄存器地址98H*/sfrTMOD=0X89; /*定時器/計數器方式控制寄存器地址89H*/(2)通過頭文件訪問SFR為了用戶處理方便,C51編譯器把MCS-51單片機的常用的特殊功能寄存器和特殊位進行了定義,放在一個“reg51.h”或“reg52.h”的頭文件中。當用戶要使用時,只需要在使用之前用一條預處理命令“#include<reg51.h>”把這個頭文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名稱了。(3)SFR中位定義使用關鍵字“sbit”可以訪問位尋址對象。與SFR定義一樣,用關鍵字“sbit”定義某些特殊位,這種地址分配有三種方法:第一種方法:sbit位名=特殊功能寄存器名^位置;sbitled=P1^0;當特殊功能寄存器的地址為字節(8位)時,可使用這種方法。特殊功能寄存器名必須是已定義的SFR的名字。“^”后的“位置”語句定義了基地址上的特殊位的位置。該位置必須是0~7的數。第二種方法:sbit位名=字節地址^位置;這種方法是以一個整常數為基地址,該值必須在0x80~0xFF之間,并能被8整除,確定位置的方法同上。第三種方法:sbit位名=位地址;這種方法將位的絕對地址賦給變量,地址必須在0x80~0xFF之間。四、應用題1、試編寫一段程序,將片內RAM的20H,21H,22H連續3個單元的內容依次存入2FH,2EH和2DH單元。參考答案:ORG0000HMOVR0,#20HMOVR1,#2FHMOVR2,#3LP:MOVA,@R0MOV@R1,AINCR0DECR1DJNZR2,LPEND2、試編寫程序完成將片外數據存儲地址為1000H~1030H的數據塊全部搬到片內RAM的30H~60H中并原數據塊區全部清零。參考答案:ORG0000HMOVR0,#31MOVR1,#30HMOVDPTR,#1000HLP:MOVXA,@DPTRMOV@R1,ACLRAMOVX@DPTR,AINCR1INCDPTRDJNZR0,LPEND3、設有100個有符號數,連續存放在2000H為首的地址存儲中,試編程統計其中正數,負數,零的個數。參考答案:ORG0000HMOVR0,#100MOVR1,#0MOVR2,#0MOVR3,#0MOVDPTR,#2000HLP:MOVXA,@DPTRCJNEA,#0,LP1INCR1LJMPLP3LP1:JBACC.7,LP2INCR2LJMPLP3LP2:INCR3LP3:INCDPTRDJNZR0,LPEND4.試編寫一段程序,將片內30H-32H和33H-35H中的兩個3字節壓縮BCD碼十進制數相加,將結果以單字節BCD碼形式寫到外部RAM的1000H-1005H單元。參考答案ORG0000HMOVR0,#30HMOVR1,#33HMOVR2,#3MOVDPTR,#1000HLP:MOVA,@R0ANLA,#0FHMOVR3,AMOVA@R1ANLA,#0FHADDA,R3DAAMOVX@DPTR,AINCDPTRMOVA,@R0SWAPAANLA,#0FHMOVR3,AMOVA,@R1SWAPAANLA,#0FHADDA,R3DAAMOVX@DPTR,AINCR0INCR1INCDPTRDJNZR2,LPEND5.試編寫一段程序,把0500H-0506H單元中的壓縮BCD碼轉換成ASCII碼,存放在0500H為首地址的存儲單元中。參考答案ORG0000HMOVDPTR,#0500HMOVR0,#30HMOVR1,#7LP:MOVXA,@DPTRANLA,#0FHADDA,#30HMOV@R0,AINCR0MOVXA,@DPTRSWAPAANLA,#0FHADDA,#30HMOV@R0,AINCR0INCDPTRDJNZR1,LPMOVDPTR,#0500HMOVR0,#30HMOVR2,#14LP1:MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR2,LP1END6.用C51試編一段數據塊搬遷程序。將外部RAM2000H—202FH單元中的內容,按由小到大的順序移入內部RAM20H—4FH單元中。參考答案:ORG0000HLJMPSTARTORG0100HSTART:MOVDPTR,#2000HMOVR0,#20HMOVR2,#30HLP1:MOVXA,@DPTRMOV@R0,ADJNZR2,LP1MOV40H,#20H;比較數的首地址。MOV41H,#2FH;比較的次數(比較的數減1是比較的次數)。LP2:LCALLMININC40HDEC41HCJNE41H,#01H,LP2;待比較的數只有一個時就停止比較。LJMPSTARTMIN:MOVR1,40HMOVR0,40HMOVR3,41HLP5:MOVA,@R0MOV50H,AINCR1MOVA,@R1CJNEA,50H,LP3;兩數不相等則轉移。LJMPLP4LP3:JCLP4;50H中的內容大于A中的內容轉移。XCHA,50HMOV@R1,AMOV@R0,50HLP4:DJNZR3,LP5RETENDP1口接發光二極管(低電平發光),用C51編寫實現任意花樣燈控制程序。參考答案如下:本程序設計實現五種花樣燈控制,依次為P1.0~P1.7順序點亮;P1.7~P1.0依次熄滅;P1.0~P1.7間隔點亮;高低四位交替點亮。全部LED燈交替閃爍。#include"reg51.h"#include<intrins.h>#defineucharunsignedchar //宏定義#defineuintunsignedint //宏定義uchara[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //建立數組ucharb[8]={0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00}; //建立數組voiddelay(uinttemp);voidorderly1();voidorderly2();voidorderly3();voidorderly4();voidorderly5();main(){ P1=0Xff; while(1) { orderly1(); //順序點亮 orderly2(); //依次熄滅 orderly3(); //間隔點亮 orderly4(); //高低四位交替點亮 orderly5(); //閃爍 }}voiddelay(uinttemp) //延時程序{ uintx,y; for(x=0;x<temp;x++)for(y=124;y>0;y--); }voidorderly1() { inti; for(i=0;i<8;i++) //順序點亮 { P1=b[i]; delay(500); } }voidorderly2() { inti; for(i=7;i>0;i--) //依次熄滅 { P1=b[i]; delay(500); } }voidorderly3() { inti; for(i=0;i<8;i+=2) //間隔點亮 { P1=a[i]; delay(500); } }voidorderly4() { inti; for(i=0;i<3;i++) //交替閃爍 { P1=0xf0; delay(500); P1=0x0f; delay(500); } }voidorderly5() { inti; for(i=0;i<5;i++) //全點亮 { P1=0xff; delay(500); P1=0x00; delay(500); } }思考與練習參考答案選擇題1.T0工作在方式3,用定時器T1產生串口通訊的波特率,則T1工作在(C)方式下。A.方式0B.方式1C.方式2D.方式32.設計一個時間長度為100ms的定時時間,則定時/計數器選(B)最好。A.方式0B.方式1C.方式2D.方式33.若定時器T1受到外部輸入引腳電平(高電平起作用)的影響,則要啟動定時器T1運行軟件,必須滿足(D)。A.GATE=0,TR1=0B.GATE=0,TR1=1C.GATE=1,TR1=0D.GATE=1,TR1=14.AT89S51單片機,通過對下列(C)設置,實現中斷優先級的設置。A.TCONB.SCONC.IPD.IE5.同一優先級中斷源同時申請中斷時,CPU優先響應的中斷源為(A)。A.定時器0溢出中斷B.定時器1溢出中斷C.外部中斷1D.串行口中斷6.外部中斷1的中斷入口地址為(C)。A.0003HB.000BHC.0013HD.0023H7.下列中斷標志位,在CPU響應中斷之后,硬件會自動清除的是(A)。A.IE0B.RIC.TI8.單片機串口做移位薦儲器使用時,SM1SM0應設置為(A)。A.00B.01C.10D.119.IBM-PC采用的是(D)標準信號,MCS-51單片機采用的是(D)電平信號。A.RS-232CRS-232CB.TTLTTLC.TTLRS-232CD.RS-232CTTL10.雙機通信,雙機的波特率必須(D),且發送腳和接收腳的連接必須(D)。A.相等平行B.不等交叉C.不等平行 D.相等交叉二、填空題1.若要使定時器/計數器的計數不受外部輸入引腳電平的影響,則應將GATA控制位設定為0。2.若定時器T1工作在方式1下,要求定時1ms(設晶振頻率為12MHz),則計數初值應設置為7192。3.單片機的定時器/計數器的計數頻率是晶振頻率的1/12,當晶振頻率為6MHz時,最高的計數頻率為0.5MHZ。4.單片機提供有5個中斷源,2個中斷優先級,實現2級中斷嵌套。5.單片機在響應中斷后,CPU是通過堆棧_來保護斷點和保護現場的。6.外部中斷有兩種觸發方式,它們分別是底電平觸發和脈沖觸發。7.在設計中斷服務程序的時候,先要設置中斷,退出中斷服務之前用RETI。8.最基本的通信方法有并行和_串行兩種。一次同時傳送多位數據的通信方法叫做并行通信,不是同時傳送多位信號,而是將信號一位一位的傳送,這種通信方式就稱為串行通信_。9.串行通信分為_同步串行和異步串行兩種方式。10.單片機的串行口主要由波特率產生器、中斷控制寄存器、發送數據緩沖器、接收數據緩沖器、發送控制器、接收控制器、方式控制寄存器、串行控制寄存器等部分組成。三、應用題1.定時/計數器的定時值為50ms、100ms,晶振為12MHz,分別應選擇哪種工作方式?初值應設置為多少(十六進制)?參考答案:定時/計數器的定時值為50ms、100ms,選擇方式1最好。初值計算:(216-X)*1=50000計算得X=15536,化成16進制為:3CB0H100ms通過50ms兩次循環獲得。2.51單片機中的五個中斷源中那幾個中斷源在CPU響應中斷后可自動撤除中斷請求,哪幾個不能撤除中斷請求?CPU不能撤除中斷請求的中斷電源時,用戶應采取什么措施?參考答案:51單片機中的五個中斷源中INT0、INT1、TO、T1在CPU響應中斷后可自動撤除中斷請求。TI、RI在CPU響應中斷后不能撤除中斷請求,用戶應采取軟件清0。3.51單片機串行口有哪幾種工作方式?這幾種工作方式有何不同?各用于什么場合?參考答案:51單片機串行口有方式0、方式1、方式2、方式3共四種工作方式。這幾種工作方式。SM0SM1工作方式功能波特率應用0008位格式FOSC/12同步移位寄存器01110位格式需設置雙機通信10211位格式FOSC/32或FOSC/64多機通信11311位格式需設置多機通信4.為什么定時器T1用做串行口波特率發生器時,常采用方式2?若已知系統時鐘頻率、通信波特率,如何計算器初始值?答案要點:采用方式2是因為不要重裝。已知系統時鐘頻率、通信波特率時5.80C51單片機的串行口由哪些基本功能部件組成?簡述工作過程。答案要點:AT89S51單片機內部有一個功能強大的全雙工串行口,串行口的結構如圖所示。它有兩個物理上獨立的接收、發送緩沖器SBUF,既可發送數據又可接收數據。發送緩沖器只能寫入不能讀出,接收緩沖器只能讀出不能寫入,兩個緩沖器共用一個特殊功能寄存器,地址為99H。發送數據:由累加器A送入發送SBUF,由發送控制器控制組成幀信號。在移位時鐘的作用下,數據一位一位發送到TXD(高位在前,低位在后),每發送完一幀,TI置1。接收數據:要置位SCON的REN位才允許接收。在移位時鐘的控制下將引腳數據送入移寄存器,接收完一幀數據后RI置1。6.單片機的串行口幾種幀格式?如何設置不同方式下的波特率?答案要點:方式0——D0D1D2D3D4D5D6D7——方式1——0D0D1D2D3D4D5D6D71——方式2、方式3——0D0D1D2D3D4D5D6D7D81——波特率設置(1)方式0的波特率波特率=FOSC/12。(2)方式2的波特率方式2的波特率:波特率=FOSC×2SMOD/64當SMOD=0時,波特率=FOSC/64。當SMOD=1時,波特率=FOSC/32。(3)方式1和方式3的波特率計算波特率=2SMOD/32×T1溢出率在已知波特率的情況下,計算TH1中值公式為:利用AT89S51串行口控制8位發光二極管工作,要求發光二極管每隔1s交替亮滅,試畫出電路并編寫程序。答案要點(系統仿真請見作業5.7):程序源代碼:#include<reg52.h>#include<intrins.h>unsignedchartemp=0x00;voiddelay1s(void)//延時1s的函數電路如下:{unsignedchara,b,c;for(c=167;c>0;c--)for(b=171;b>0;b--)for(a=16;a>0;a--);_nop_();}voidmain(void){ SCON=0x00; //設定串行口工作方式 PCON&=0xef; //波特率不倍增 while(1) { SBUF=temp; //發送數據 if(TI) //檢測是否有數據到來 { temp=~temp;//將temp取反以實現交替亮滅 delay1s(); TI=0; //必須將TI清零,用于下一次發送完成的檢測 } }}請用查詢方式編寫一段數據發送程序。數據塊首地址為片內30H單元,塊長度為20B,設串行口工作于方式1,波特率為9600b/s,主頻fosc為11.059MHz。答案要點:(詳見作業5.8):系統源程序:#include<reg51.h>unsignedchari;unsignedcharnum[20];voidSendOneByte(unsignedcharc)//發送數據函數{SBUF=c;while(!TI); //查詢是否發送完畢TI=0;}voidInitUART(void){TMOD=0x20; //設置定時器1工作方式SCON=0x50; //設置串行口工作方式TH1=0xFD; //設置波特率TL1=TH1;PCON=0x00; //設置波特率不加倍TR1=1; //打開定時器1}voidmain(void){InitUART(); while(1) { #pragmaasm MOVR0,#20 //控制循環次數 MOVR1,#00H MOVDPTR,#30H MOVA,#num //將數組的首地址的值賦給累加器A MOVR1,A LP:MOV@R1,DPL //將DPL中的值賦給以R1的內容為地址的單元 INCR1 //將R1的值加一 INCDPTR DJNZR0,LP //若R0的值不為0則跳到lp #pragmaendasm for(i=0;i<20;i++) { SendOneByte(num[i]);//循環20次將num的內容發送出去 } }}請用中斷方法編寫一段數據發送程序,數據塊首地址為片外RAM的TTAB,塊長度為30H嗎,設串行口工作于方式3,波特率為4800b/s,fosc=11.059MHz,采用奇校驗。答案要點:(詳見作業5.9):程序源代碼:#include<reg51.h>unsignedcharnum[48];unsignedchari,Data;voidInitUART(void){TMOD=0x20; //設置定時器1的工作方式為方式2SCON=0xd0;//設置串行口的工作方式為方式3TH1=0xFA; //設置波特率為4800TL1=TH1;PCON=0x00;//設置波特率不加倍EA=1; //開總中斷ES=1; //開串行口中斷TR1=1; //開定時器1中斷}voidmain(void){InitUART(); while(1) { #pragmaasm MOVR0,#48 //控制循環次數 MOVR1,#00H MOVDPTR,#00H MOVA,#num //將數組的首地址的值賦給累加器A MOVR1,A LP:MOVXA,@DPTR//將外部RAM的數據賦給A MOV@R1,A //將A中的值賦給以R1的內容為地址的單元 INCR1 //將R1的值加一 INCDPTR DJNZR0,LP //若R0的值不為0則跳到lp #pragmaendasm ACC=Data;//采用奇校驗 TB8=P; SBUF=num[i++];//循環48次將num的內容發送出去 while(1); }}voidUARTInterrupt(void)interrupt4{if(TI){TI=0; ACC=Data;//采用奇校驗 TB8=P; SBUF=num[i++];//循環48次將num的內容發送出去}elseRI=0; //如果是接收引起的中斷則退出中斷 if(i==48) { EA=0;//發送完后關閉總中斷 } }思考與練習填空題1.多位數碼管是采用掃描原理,實現數字的顯示。2.單片機的D0-D7對應與共陽數碼管的a、b、c、d、e、f、g、dp相連,顯示“2”的編碼是5BH,顯示“5”的編碼是6DH。3.點陣顯示原理:利用人的視覺具有停滯性,采用掃描的辦法。4.字符型LCD模塊1602初始化后的地址為80H,如果要將A顯示在第一行的03H內,其寫入地址應為80H+03H。5.12864液晶屏橫向有128個點,縱向有64個點,顯示屏分為左半屏和右半屏。列地址(Y)由0至63,頁地址由0至7,每頁由8行組成。6.每個漢字占32個字節。二、應用題1.在在Proteus中,在共陽數碼管上顯示0-F。參考答案(詳見作業6.1):#include<reg51.h>Unsignedcharcodea[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};voiddelay(unsignedinttemp); main(){ while(1) { inti; for(i=0;i<16;i++) { P0=a[i]; P2=0XFE; delay(1000); } }}voiddelay(unsignedinttemp){ intk,j; for(k=0;k<temp;k++) for(j=124;j>0;j--); }在Proteus中,設計四位一體的數碼顯示,顯示內容為“5678”。參考答案(詳見作業6.2):#include<reg51.h>voiddelay(unsignedinttemp);unsignedcharcodetable[]={0x92,0x82,0xF8,0x80};unsignedcharcodetable1[]={0xFE,0xFD,0xFB,0xF7};main(){unsignedchari; while(1) { for(i=0;i<4;i++) { P2=table1[i]; P0=table[i]; delay(10); P0=0xFF; } } }voiddelay(unsignedinttemp){ intk,j; for(k=0;k<temp;k++) for(j=124;j>0;j--); }在Proteus中,設計字符顯示電路和程序,顯示內容為“good-bye”。參考答案(詳見作業6.3):#include<reg51.h>#include<intrins.h>#defineuintunsignedint //預定義無符號整數為uint#defineucharunsignedchar //預定義無符號字符數為ucharsbitrs=P3^7; //定義端口sbitrw=P3^6;sbitep=P3^5;ucharcodedis1[]="good-bye";//顯示內容,字符數組voiddelay(ucharms) //延時子程序{ uchari; while(ms--) { for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } }}bitlcd_bz() //測試LED忙碌狀態{ bitresult; rs=0; rw=1; ep=1; _nop_();_nop_(); _nop_(); _nop_(); result=(bit)(P3&0x80); ep=0; returnresult;}voidlcd_wcmd(ucharcmd) //寫入指令數據到LED{ while(lcd_bz()); rs=0; rw=0; ep=0;_nop_();_nop_(); P1=cmd; _nop_();_nop_(); _nop_(); _nop_(); ep=1; _nop_();_nop_(); _nop_(); _nop_(); ep=0;}voidlcd_pos(ucharpos) //設置顯示位置{ lcd_wcmd(pos|0x80);}voidlcd_wdat(uchardat) //寫入字符顯示數據到LED{ while(lcd_bz()); rs=1; rw=0; ep=0; P1=dat; _nop_();_nop_(); _nop_(); _nop_(); ep=1; _nop_();_nop_(); _nop_(); _nop_(); ep=0;}voidlcd_init() //LCD初始化設定{ lcd_wcmd(0x38); // delay(1); lcd_wcmd(0x0c); // delay(1); lcd_wcmd(0x06); // delay(1); lcd_wcmd(0x01); delay(1); //清除LCD的顯示內容}main(){ uchari; lcd_init(); //初始化LED delay(500); lcd_pos(4); //設置顯示位置為第一行的第5個字符 i=0; while(dis1[i]!='\0') //顯示字符"good-bye" { lcd_wdat(dis1[i]); i++; } while(1);}在Proteus中,在LCD12864上顯示自己的相片,并標上自己的名字。參考答案:(詳見作業6.4):#include<reg52.h>#include<character.h>#include<intrins.h>/*****************************???**************************************/#defineucharunsignedchar#defineuintunsignedintvoidmainpage();ucharnum1;//uchardat;uintad_value=0;#defineportP0sbitrs=P2^4;sbitrw=P2^1;sbite=P2^0;sbitcs1=P2^3;sbitcs2=P2^2;sbitbeep=P1^7;sbitdat=P1^6;sbitsclk=P1^5;sbitcs=P1^4;voidLcd_Set_X(ucharx){port=0xb8|x;rs=0;rw=0;e=1;e=0;}voidLcd_Set_Y(uchary){port=0x40|y;rs=0;rw=0;e=1;e=0;}voidLcd_Set_X_Y(ucharx,uchary){if(y<64){cs1=1;cs2=0;Lcd_Set_Y(y);}else{cs1=0;cs2=1;Lcd_Set_Y(y-64);}Lcd_Set_X(x);}voidLcd_Write_Byte(uchartemp){port=temp;rs=1;rw=0;e=1;e=0;}voidLcd_Character_16X16(bitbit_flag,ucharx,uchary,ucharcode*point){uchari,j,temp;temp=y;if(bit_flag){for(i=0;i<2;i++){x+=i; y=temp;for(j=0;j<16;j++){Lcd_Set_X_Y(x,y);y++;Lcd_Write_Byte(point[i*16+j]);}}}else{for(i=0;i<2;i++){x+=i;y=temp;for(j=0;j<16;j++){Lcd_Set_X_Y(x,y);y++;Lcd_Write_Byte(~point[i*16+j]);}}}}voidfirstpage(void){uchari; for(i=0;i<8;i++) Lcd_Character_16X16(1,4,i*16,school[i]); for(i=0;i<8;i++) Lcd_Character_16X16(1,4,i*16,school[i]); for(i=0;i<8;i++) Lcd_Character_16X16(1,0,i*16,school[i]); for(i=0;i<8;i++) Lcd_Character_16X16(1,0,i*16,school[i]); TMOD=0X01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1) { if(num1==50){ num1=0; EA=0; ET0=0; TR0=0; break; } }}voidT0_time()interrupt1{ TH0=(65536-45872)/256; TL0=(65536-45872)%256; num1++;}main(){ while(1) firstpage();}思考與練習填空題1.獨立鍵盤采用一線一鍵,因此當鍵比較多時就不適用采取這種結構。2.獨立鍵盤從結構上分成普通獨立鍵盤和帶中斷的獨立鍵盤兩種。3.行列式鍵盤用于鍵較多,單片機口線相對較少的單片機應用系統。4.行列式鍵盤從結構上分成行列式鍵盤和帶中斷的行列鍵盤兩種。5.無論行列式還是獨式鍵盤均采用延時去抖動的辦法,消除干擾。應用題設計單片機應用系統,要求開機顯示“5”,數字在0-9之間變化,每按一次增按鍵,數字加一,每按一次減按鍵,數字減一。設計電路、程序,并在通過proteus中進行仿真。參考答案#include<reg52.h>sbits0=P3^4;//ADDsbits1=P3^5;//DECsbitseg=P2^0;charcodetable[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共陽極數碼管有小數點的段碼表chara=5,b=5;unsignedcharflog0,flog1; voiddelay10ms();voidKeyscan();voidmain(){ seg=0; P0=0x12;//開機顯示五 while(1) { Keyscan(); }}voidKeyscan(){ if(s0==0) { delay10ms(); //延時消抖 if(s0==0) { flog0=1; //標志位置一,為后面進行減操作做準備 if(flog1==1) { flog1=0; //標志位清零 a=b; //將上一次減一操作后的段碼表下標賦給a,防止數字減完后再進行加操作后顯示的數字不連續 } a++; //數字加一 if(a==10) { a=0; //加到9后,再加則顯示0 } while(!s0); delay10ms(); while(!s0); //松手檢測 P0=table[a]; //顯示數字 } } if(s1==0) { delay10ms(); //延時消抖 if(s1==0) { flog1=1; //標志位置1,為后面加操作做準備 if(flog0==1) { flog0=0;//標志位清零 b=a; //將上一次加一操作后的段碼表下標賦給b,防止數字加完后再進行減操作后顯示的數字不連續 } b--; //數字減一 if(b==-1) { b=9; //數字減到0后,再減則顯示9 } while(!s1); delay10ms(); while(!s1); //松手檢測 P0=table[b];//顯示數字 } }}voiddelay10ms(void){unsignedchara,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}設計4*4鍵盤,鍵盤為0-9、A-F,要求設計電路,用C51編程,在proteus仿真,實現每按一個鍵,數碼管顯示鍵盤的值。參考答案:#include<reg52.h>sbitwela=P2^0;charcodetable[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//共陽極數碼管有小數點的段碼表voiddelay10ms();unsignedchara;voidkey_scan(){ P3=0x0f; if(P3!=0x0f)//有按鍵按下則進行檢測,判斷是哪個按鍵按下 { delay10ms();//延時消抖 if(P3!=0x0f) { switch(P3) //檢測是哪一行的按鍵被按下 { case(0x0e):a=0;break; //第一行 case(0x0d):a=4;break; //第二行 case(0x0b):a=8;break;//第三行 case(0x07):a=12;break;//第四行 } P3=0xf0; switch(P3) //檢測是哪一列的按鍵被按下 { case(0xe0):a=a+0;break; //第一列 case(0xd0):a=a+1;break; //第二列 case(0xb0):a=a+2;break;//第三列 case(0x70):a=a+3;break;//第四列 } } }}voidmain(){ while(1) { key_scan(); //按鍵掃描 P0=table[a];//顯示數字 wela=0; //位選打開 }}voiddelay10ms(void){unsignedchard,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(d=130;d>0;d--);}思考與練習一、選擇題1.一個10位的A/D轉換器,模擬輸入量程為0-5V,若其相對誤差為1LSB,則用百分數表示的相對誤差為(C)。A、1%B、0.39%C、0.488%D、0.18%2.A/D轉換結束后,單片機讀取數據的方式有3種,其中不包括(B)。A、查詢方式B、直接讀取C、中斷方式D、固定時間延時3.A/D轉換器在使用前都需要調節零點和增益,調節零點時,模擬輸入量(A);調節增益時,模擬輸入量(A)。A、0V,5VB、0V,最大值C、最大值,最小值D、最大值,最大值。4.DAC0832有(B)幾種控制方式。A、全通、單控、雙通B、直通、單緩沖方式、雙緩沖方式5.當單片機啟動ADC0808進行模/數轉換時,應采用(D)指令。A、MOVA,R0B、MOVXA,@DPTRC、MOVCA,@A+DPTRD、MOVX@DPTR,A二、填空題1.A/D轉換器兩個最重要的技術指標是轉換精度和_轉換速度。2.A/D轉換器種類很多,目前應用廣泛的主要由3類:逐次逼近式、雙積分式和V/F變換式。3.ADC0808是8位256逐次逼近并行A/D轉換芯片,具有地址鎖存、譯碼電路的8路模擬開關。4.D/A轉換器的種類很多,DAC0831是8位串行D/A轉換芯片。5.DAC0832的工作方式通常是直通方式、單緩沖方式以及雙緩沖方。三、應用題1、用單片機設計一簡易數字電壓表,并在PROTEUS中進行仿真。參考答案(詳見作業8.1):#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbitCS=P2^0;sbitCLK=P2^1;sbitDATA=P2^2;ucharcodenum[]={0xfb,0xfd,0xfe};ucharcodetable[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽極數碼管帶小數點段碼表ucharcodetable1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數碼管不帶小數點段碼表uinttab[3];//存放電壓的數組voiddelay();voiddisplay();ucharRead_AD0831();//讀取AD0831的數據voidmain(){ while(1) { uintt=200,temp; temp=Read_AD0831()*100/51; //乘以100是為了保留小數點后兩位數據,除以51是因為一個51代表1V tab[0]=temp/100; //得到百位數 temp=temp%100; //將百位去掉 tab[1]=temp/10; //得到十位數 tab[2]=temp%10; //得到個位數 while(t--) //因為CPU運行很快所以不需要每時每刻都去讀取AD0831的數據 { display(); //在數碼管上顯示數據 } }}ucharRead_AD0831(){ inti=0,tmp=0; DATA=1; CS=0; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); for(i=0;i<8;i++)//循環八次按從高位到低位的順序把數據讀走 { tmp=tmp<<1; tmp=tmp|DATA; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); } CS=1; //讀完過后將AD0831關閉 _nop_(); _nop_(); returntmp;}voiddisplay(){ externuinttab[3]; uchari; for(i=0;i<3;i++)//采用動態掃描的方式在3個數碼管顯示數據 { P3=num[i];//控制哪個數碼管可以顯示 if(i==0) { P1=table[tab[i]];//百位應該帶小數點顯示 } else { P1=table1[tab[i]];//十位和個位不帶小數點顯示 } delay(); P3=0xff;//消影 } }voiddelay(){ uintt=100; while(t--);}設計8路數據采集,要求顯示路數和采集值,并在PROTEUS中進行仿真。參考答案(詳見作業8.2):#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbita=P2^0;sbitb=P2^1;sbitc=P2^2;sbitOE=P2^3;sbitEOC=P2^4;sbitstart=P3^0;sbitwela0=P3^1;sbitwela1=P3^2;sbitwela2=P3^3;sbitwela3=P3^4;uinttab[]={0,0,0};ucharcodetable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽極數碼管帶小數點段碼表ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數碼管不帶小數點段碼表voiddelay();voidread();voiddisplay();uinttemp;voidmain(){ while(1) { uchart=200; read(); while(t--); }}voidread(){ start=0; start=1; start=0; while(EOC==0); //轉換結束才能退出循環 OE=1; //允許數據輸出 temp=P1; display(); //顯示數據 OE=0;}voiddisplay(){ ucharnum,i,n; temp=temp*100; //保留小數點后兩位 temp=temp/51; tab[0]=temp/100;//得到百位數 tab[1]=temp%100/10; //得到十位數 tab[2]=temp%10; //得到個位數 num=P2|0xf8; //為顯示哪個通道做準備 switch(num) { case(0xf8):n=1;break; //一通道 case(0xf9):n=2;break; //二通道 case(0xfa):n=3;break; case(0xfb):n=4;break; case(0xfc):n=5;break; case(0xfd):n=6;break; case(0xfe):n=7;break; case(0xff):n=8;break; } for(i=0;i<4;i++)//循環顯示四位數(通道(一位數),數據(三位數)) { if(i==0) //顯示通道 { P0=table[n]; wela0=1;//打開位選 delay(); wela0=0;//關閉位選 } if(i==1) { P0=table1[tab[0]]; //百位數(使用帶小數點顯示) wela1=1; delay(); wela1=0; } if(i==2) { P0=table[tab[1]]; //十位數(不帶小數點顯示) wela2=1; delay(); wela2=0; } if(i==3) { P0=table[tab[2]]; //個位數(不帶小數點顯示) wela3=1; delay(); wela3=0; } } }voiddelay(){ uchart=100; while(t--);}用ADC0831實現對單路數據的采集。參考答案(詳見作業8.3):#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbitCS=P2^0;sbitCLK=P2^1;sbitDATA=P2^2;ucharcodenum[]={0xfb,0xfd,0xfe};ucharcodetable[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽極數碼管帶小數點段碼表ucharcodetable1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數碼管不帶小數點段碼表uinttab[3];//存放電壓的數組voiddelay();voiddisplay();ucharRead_AD0831();//讀取AD0831的數據voidmain(){ while(1) { uintt=200,temp; temp=Read_AD0831()*100/51; //乘以100是為了保留小數點后兩位數據,除以51是因為一個51代表1V tab[0]=temp/100; //得到百位數 temp=temp%100; //將百位去掉 tab[1]=temp/10; //得到十位數 tab[2]=temp%10; //得到個位數 while(t--) //因為CPU運行很快所以不需要每時每刻都去讀取AD0831的數據 { display(); //在數碼管上顯示數據 } }}ucharRead_AD0831(){ inti=0,tmp=0; DATA=1; CS=0; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); for(i=0;i<8;i++)//循環八次按從高位到低位的順序把數據讀走 { tmp=tmp<<1; tmp=tmp|DATA; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_();

溫馨提示

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

評論

0/150

提交評論