【正文】
作必須在一個統(tǒng)一的時鐘脈沖的控制下才能按照正確的順序執(zhí)行。時鐘脈沖由時鐘振蕩器產生,通常振蕩器輸出的時鐘頻率為為6~16MHz。MCS51時鐘電路如下圖所示。圖14 MCS51時鐘電路圖1.時鐘周期時鐘周期也稱為振蕩周期,即振蕩器的振蕩頻率的倒數,是時序中最小的時間單位。例如:時鐘頻率為6MHz。時鐘脈沖是計算機的基本工作脈沖,它控制著計算機的工作節(jié)奏。2.機器周期執(zhí)行一條指令的過程可分為若干個階段,每個一個階段完成一規(guī)定的操作,完一個規(guī)定操作所需要的時間稱為一個機器周期。一個機器周期包含12個時鐘周期。3.指令周期指令周期定義為執(zhí)行一條指令所用的時間。MCS51單片機指令可分為單周期指令、雙周期指令、四周期指令三種。只有乘法指令和除法指令是四周期指令。 最小系統(tǒng)最小系統(tǒng)電路圖如下圖所示:圖15 最小系統(tǒng)電路圖第二章 MCS51指令系統(tǒng)及匯編語言程序設計 指令系統(tǒng)簡介;MCS51系列單片機指令系統(tǒng)共有111條指令,其中有49條單字節(jié)指令、45條雙字節(jié)指令和17條三字節(jié)指令。MCS51匯編語言指令格式由以下向個部分組成:[標號:] 操作碼 [目的操作數] [源操作數] [:注釋]其中,[]中的項表示為可選項例如:LOOP: MOV A,Ri :A←Ri 尋址方式;所謂尋址方式就是尋找或獲得操作數的方式。指令的一個重要組成部分是操作數。由尋址方式指定參與運算的操作數或操作數所在單元的地址。尋址方式的一個重要問題是:何在整個存儲范圍內,靈活、方便地找到所需要的單元。1.立即尋址在立即尋址方式中,操作數直接出現在指令中,指令的操作數可以是8位或16位數。例如:MOV A,20H;MOV DPTR,20000H2.直接尋址在直接尋址方式中,操作數的單元地址直接出現在指令中,這一尋址方式可進行內存儲單元的訪問。它包括:⑴.特殊功能寄存器地址空間。這也是唯一可尋址特殊功能寄存器(SFR)的尋址方式。例如:MOV TCON,AMOV A, P1⑵.內部RAM的低128字節(jié)例如:MOV A,76H3.寄存器尋址在寄存器尋址方式中,寄存器中的內容就是操作數。例如:MOV A,Ri 。假若Ri中存放在操作數為3BH,則指令執(zhí)行結果是A=3BH。4.寄存器間接尋址在寄存器間接尋址方式中,指定寄存器中的內容是操作數的地址,該地址對應存儲器單元的內容才是操作數。例如:MOV A,@R05.變址尋址 變址尋址方式是以程序指針PC或數據指針DPTR為基址寄存器,以累加器A作為變址寄存器,兩者內容相加(即基地址+偏移量)形成16位的操作數地址,變址尋址方式主要用于訪問固化在程序存儲器中的某個字節(jié)。變址尋址方式有兩類:⑴.用程序指針PC作基地址,A作變地址,形成操作數地址:@A+PC。⑵.用數據指針DPTR作基地址,A作變址,形成操作數地址:@A+DPTR。6.相對尋址相對尋址是以程序計數器PC的當前值作為基地址,與指令中的第二字節(jié)給出的相對偏移量rel進行相加,所得和為程序的轉移地址。相對偏移量rel是一個用補碼表示的8位有符號數,rel的范圍為+127~128字節(jié)之間。例如:SJMP 08HJZ 30H7.位尋址位尋址給出的是直接地址。例如:SETB ET0 指令系統(tǒng);單片機指令分為五類:1, 數據傳送類;2, 算術遠算類;3, 邏輯轉移類;4, 控制轉移類;5, 位操作。1, 數據傳送類(29條)屬于這一類的助記符有:MOV 、MOVC、MOVX、XCH、XCHD、PUSH、POP①、MOV A ,Rn ②、MOV @Ri , A @Ri Direct Direct data data ③、MOV Rn ,A ④、MOV Direct1 , A Direct data data Direct2 @Ri Rn 注:★ 書寫時,不要漏掉“,”號。 ★執(zhí)行后不影響任何標志位。例:設片內RAM 30H單元內容為40H,第40H單元內容為10H,P1口作為輸入口,其輸入數據為CAH,求經下列程序段執(zhí)行后的結果。MOV R0, 30HMOV A, @R0MOV R1, AMOV B, @R1MOV @R1, P1MOV P2, P1⑤、MOVX A , @DPTR ⑥、MOVC A ,@A+DPTR @Ri @A+PC⑦、MOVX @DPTR , A @Ri , A⑧、XCH A ,Rn ⑨、XCHD A ,@Ri @Ri @DPTR Direct ⑩、MOV DPT,DATA16 ⑩、PUSH DirectPOP Direct注:由于復位后,SP的值為07H,這就會出現堆棧區(qū)與工作寄存器區(qū)兩者重疊。為此,必須在程序的開頭部分通過指令重新定義堆棧區(qū)域。如:MOV SP, 70H算術運算類(24條形碼)屬于這一類的助記符有: ADD,ADDC,INC SUBB,DEC MUL,DIV,DA①、ADD Rn ②、INC A ADDC A ,@Ri Rn SUBB DATA @Ri DIRECT DIRECT DPTR③、DEC A ④、 MUL AB Rn DIV AB @Ri DA A DIRECT邏輯運算類(24條)屬于這一類的助記符有:ANL,ORL,XRL,CPL,CLR① ANL A Rn ANL A,@Ri ANL A DIRECT ANL A DATA ② ANL direct, A ANL direct, data③ ORL A, Rn ORL A, direct ORL A, @Ri ORL A, data④ ORL direct, data ORL direct, A⑤ XRL A, Rn XRL A, direct XRL A, data XRL A, @Ri⑥ XRL direct, A XRL direct, data③ CPL A CLR A RL A RLC A RR A RRC A SWAP A 控制轉移類(17條)屬于這一類的助記符有:JMP,LJMP,AJMP, LCALL,ACALL,SJMPJZ,JNZ,DJNZ,CJNE①、JMP @A+DPTR ②、NOPLJMP addr16 RETAJMP addr11 RETILCALL addr16 ③、JZ relACALL addr11 JNZ relSJMP rel (地址范圍為) DJNZ Rn , rel Direct , rel④、CJNE Rn , DATA, rel A, DATA, rel @Ri, DATA, rel A, Direct, rel位操作指令(17條)屬于這一類的助記符有:JB,JNB,JBC,CLR,SETB,CPL,ANL,ORL,MOV①、CLR C ②、SETB C BIT BIT③、CPL C ④、ANL C ,BIT BIT /BIT⑤、ORL C ,BIT ⑥、MOV C ,BIT C ,/BIT BIT ,C⑦、JB BIT ,REL ⑧、JC rel JNB BIT ,REL JNC rel JBC BIT , REL、 匯編語言程序設計基礎;程序設計語言可分為三類:機器語言、匯編語言、高級語言。機器語言:當指令和地址采用二進制代碼表示時,稱之為機器語言。CPU直接識別和執(zhí)行的是機器語言代碼,但是,機器語言對人們來說不便于記憶和交流,而且極易出錯,故一般不采用機器語言直接編程。但是,對于任何其他語言編寫的程序,或者說計算機所執(zhí)行的每一操作,最終都必須轉換為機器語言的指令代碼,CPU才能識別和執(zhí)行。匯編語言:是一種采用助記符來表示的機器語言,即用助符號來代表指令的操作碼和操作數,用標號或符號代表地址、常數或變量。這種用助記符編寫的程序稱為源程序,匯編語言必須翻譯成機器語言的目標代碼(目標程序),計算機才能執(zhí)行。高級語言:使用接近人們習慣的自然語言的英語縮寫和數學表達的形式編寫程序,這樣就可以大大提高編程的效率。用高級語言編寫的源程序,需要經編譯程序翻譯成機器語言表示的目標程序,計算機方能執(zhí)行。 偽指令MCS51單片機匯編語言中常用的偽指令如下:1.ORG(匯編起始地址)格式:ORG 16位地址2.END(結束匯編)格式:END功能:匯編語言源程序的結束標志,即通知匯編程序不再繼續(xù)往下匯編。3.EQU(等值)格式:標志符 EQU 數或匯編符號功能:把數或匯編符號賦給標識符,且只能賦值一次。如:LOOP EQU 20H4.DB(定義字節(jié))格式: [標號:] DB 項或項表功能:將項或項表中的字節(jié)(8位)數據依次存入標號所示的存儲單元中。使用時,項與項之間用“,”分隔;字符型數據用“”括起來;數據可采用二進制、十六進制及ASCLL碼等形式表示。例如:TAB: DB 12H,0AFH,“9”5.DW(定義字)格式:[標號:] DW 項或項表功能:功能:將項或項表中的字(16位)數據依次存入標號所示的存儲單元中。例如:TAB: DW 0112H,04AFH6.DS(定義存儲單元)格式:標號:DS 數字功能:從標號所指示的單元開始,根據數字的值保留一定數量的字節(jié)存儲單元,留給以后存儲數據用。例如:SPACE:DS 107.BIT(地址符號命令)格式:標識符 BIT 位地址功能:將位地址賦以標識符。例如:A1 BIT 經以上定義后,A1就可當作位地址來使用。MOV C,A1 程序設計實例;程序1:求符號函數。 設X、Y分別為30H、31H單元。分析:由設計要求可以看出,程序有三條路徑需要選擇,因此需要采用分支程序設計,其流程圖如圖21所示。開始0→YX=0?X0?2→Y1→Y結束YYNN圖21 符號函數流程圖程序如下: ORG 2000H X EQU 30H Y EQU 31H MOV A, X JZ LOOP0 ;A為0值,轉LOOP0 JB , LOOP1 ;最高位為1,為負數 MOV A, 01H ;A←1 SJMP LOOP0 LOOP1:MOV A, 02H ;A←2 LOOP0: MOV Y, A ;Y←A SJMP $ END程序2:在內部RAM的42H開始的連續(xù)單元中存放一組8位無符號數,該數組長度n(n≤3DH)存放在41H中,找出這組數中的最大數,并將其存入內部RAM的40H單元中。分析:可以先將第一個數組元素送40H單元內,然后將數組中的其它數依次與其比較,若大于40H中的值,