《第3章-單片機(jī)C51語言基礎(chǔ)與開發(fā)平臺(tái).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《第3章-單片機(jī)C51語言基礎(chǔ)與開發(fā)平臺(tái).ppt(70頁珍藏版)》請(qǐng)?jiān)趨R文網(wǎng)上搜索。
1、第第3 3章章 單片機(jī)單片機(jī)C51C51語言基礎(chǔ)與開發(fā)平臺(tái)語言基礎(chǔ)與開發(fā)平臺(tái) 3.1 3.1 單片機(jī)單片機(jī)C51C51語言基礎(chǔ)語言基礎(chǔ) 3.2 Keil 3.2 Keil Vision5Vision5集成開發(fā)環(huán)境集成開發(fā)環(huán)境 3.3 STC89C52RC3.3 STC89C52RC系列單片機(jī)的系列單片機(jī)的ISPISP編程編程 所謂所謂尋址方式尋址方式,就是,就是CPUCPU執(zhí)行一條指令時(shí)如何找執(zhí)行一條指令時(shí)如何找到該指令操作數(shù)的方式。操作數(shù)總是存放在某一存儲(chǔ)到該指令操作數(shù)的方式。操作數(shù)總是存放在某一存儲(chǔ)單元中,尋找操作數(shù)最重要的就是找操作數(shù)所在的單單元中,尋找操作數(shù)最重要的就是找操作數(shù)所在的單
2、元地址,所以稱之為尋址方式。元地址,所以稱之為尋址方式。指令通常由操作碼和操作數(shù)組成,操作數(shù)部分給指令通常由操作碼和操作數(shù)組成,操作數(shù)部分給出的只是操作數(shù)的尋址方式。所以尋址方式是指令組出的只是操作數(shù)的尋址方式。所以尋址方式是指令組成的重要內(nèi)容,理解尋址方式對(duì)于指令系統(tǒng)的學(xué)習(xí)及成的重要內(nèi)容,理解尋址方式對(duì)于指令系統(tǒng)的學(xué)習(xí)及程序編制非常重要。程序編制非常重要。計(jì)算機(jī)尋址方式的種類是由它的硬件結(jié)構(gòu)決定的,計(jì)算機(jī)尋址方式的種類是由它的硬件結(jié)構(gòu)決定的,尋址方式越多、越靈活,指令系統(tǒng)將越有效,用戶編尋址方式越多、越靈活,指令系統(tǒng)將越有效,用戶編程越方便,計(jì)算機(jī)可處理的功能就越強(qiáng)。程越方便,計(jì)算機(jī)可處理的
3、功能就越強(qiáng)。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 立即尋址立即尋址 操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼的后面,操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中,可以立即得到操作數(shù)并執(zhí)行,故稱為立即尋址。匯編可以立即得到操作數(shù)并執(zhí)行,故稱為立即尋址。匯編指令中,在一個(gè)數(shù)的前面冠以指令中,在一個(gè)數(shù)的前面冠以“#”符號(hào)作前綴,就符號(hào)作前綴,就表示該數(shù)為立即尋址。也稱為表示該數(shù)為立即尋址。也稱為立即數(shù)尋址立即數(shù)尋址。例如:例如:MOV AMOV A,#30H#30H指令中指令中“30H30H”就是立即數(shù)。就是立
4、即數(shù)。這一條指令的功能是執(zhí)行將立即數(shù)這一條指令的功能是執(zhí)行將立即數(shù)“30H30H”傳送到累傳送到累加器加器A A中的操作。該指令操作碼的機(jī)器代碼為中的操作。該指令操作碼的機(jī)器代碼為74H74H,占,占用一個(gè)字節(jié)存儲(chǔ)單元,立即數(shù)用一個(gè)字節(jié)存儲(chǔ)單元,立即數(shù)30H30H存放在緊跟在其后存放在緊跟在其后的一個(gè)字節(jié)存儲(chǔ)單元,成為指令代碼的一部分。整條的一個(gè)字節(jié)存儲(chǔ)單元,成為指令代碼的一部分。整條指令的機(jī)器碼為指令的機(jī)器碼為74H 30H74H 30H。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 寄存器尋址寄存器尋址 在指令選定的某寄存器中存放或讀取操作數(shù),以在指令選定的某寄存器中存放或讀取操作數(shù),以完成指令規(guī)
5、定的操作,稱為寄存器尋址。完成指令規(guī)定的操作,稱為寄存器尋址。例如:例如:MOV AMOV A,R0R0指令中源操作數(shù)和目的操作數(shù)指令中源操作數(shù)和目的操作數(shù)都是寄存器尋址。該指令的功能是把工作寄存器都是寄存器尋址。該指令的功能是把工作寄存器R0R0中中的內(nèi)容傳送到累加器的內(nèi)容傳送到累加器A A中,如中,如R0R0中的內(nèi)容為中的內(nèi)容為20H20H,則執(zhí),則執(zhí)行該指令后行該指令后A A的內(nèi)容也為的內(nèi)容也為20H20H。寄存器尋址按所選定的工作寄存器寄存器尋址按所選定的工作寄存器R0R0R7R7進(jìn)行操進(jìn)行操作,指令機(jī)器碼的低作,指令機(jī)器碼的低3 3位用于指示所用的工作寄存器位用于指示所用的工作寄存器
6、R0R0R7R7。如:。如:MOV AMOV A,Rn(n=0Rn(n=07)7),這,這8 8條指令對(duì)應(yīng)的條指令對(duì)應(yīng)的機(jī)器碼分別為機(jī)器碼分別為E8HE8HEFHEFH。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式寄存器間接尋址寄存器間接尋址由某寄存器內(nèi)容作為操作數(shù)地址的尋址方法稱為由某寄存器內(nèi)容作為操作數(shù)地址的尋址方法稱為寄存器間接尋址。需要強(qiáng)調(diào)的是:寄存器中的內(nèi)容不寄存器間接尋址。需要強(qiáng)調(diào)的是:寄存器中的內(nèi)容不是操作數(shù)本身,而是操作數(shù)的地址,到該地址中才能是操作數(shù)本身,而是操作數(shù)的地址,到該地址中才能得到操作數(shù)。寄存器在此起得到操作數(shù)。寄存器在此起地址指針地址指針的作用。的作用。例如:例如:MOV
7、A,R0指令的源操作數(shù)是寄存器指令的源操作數(shù)是寄存器間接尋址。該指令的功能是將以工作寄存器間接尋址。該指令的功能是將以工作寄存器R0中的內(nèi)中的內(nèi)容為地址的片內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到累加器單元的數(shù)據(jù)傳送到累加器A中去。中去。例如:若例如:若R0中的內(nèi)容為中的內(nèi)容為78H,片內(nèi),片內(nèi)RAM地址為地址為78H的的單元中的內(nèi)容為單元中的內(nèi)容為2FH,則執(zhí)行該指令后,片內(nèi),則執(zhí)行該指令后,片內(nèi)RAM78H單元的內(nèi)容單元的內(nèi)容2FH將被送到累加器將被送到累加器A中。符號(hào)中。符號(hào)“”可理解為可理解為取地址取地址。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 寄存器間接尋址寄存器間接尋址 寄存器間接尋址
8、示例如下:寄存器間接尋址示例如下:可用作寄存器間接尋址的寄存器只有可用作寄存器間接尋址的寄存器只有R0R0、R1R1和和DPTRDPTR。用。用R0R0、R1R1作地址指針時(shí),可尋址片內(nèi)或片外作地址指針時(shí),可尋址片內(nèi)或片外RAMRAM的的256256個(gè)單元,但不能訪問個(gè)單元,但不能訪問SFRSFR;DPTRDPTR作地址指針作地址指針時(shí),可訪問片外時(shí),可訪問片外RAMRAM的的64KB64KB地址范圍。地址范圍。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 直接尋址直接尋址 在指令中直接給出操作數(shù)所在存儲(chǔ)器地址的尋址在指令中直接給出操作數(shù)所在存儲(chǔ)器地址的尋址方式稱為直接尋址方式。方式稱為直接尋址方式。
9、例如:例如:MOV AMOV A,40H40H指令中的源操作數(shù)就是直接尋指令中的源操作數(shù)就是直接尋址,址,40H40H為操作數(shù)的地址。該指令的功能是把片內(nèi)為操作數(shù)的地址。該指令的功能是把片內(nèi)RAMRAM地址為地址為40H40H單元的內(nèi)容送到單元的內(nèi)容送到A A中。該指令的機(jī)器碼為中。該指令的機(jī)器碼為E5H 40HE5H 40H,8 8位直接地址在指令操作碼中占一個(gè)字節(jié)。位直接地址在指令操作碼中占一個(gè)字節(jié)。MCS-51MCS-51系列單片機(jī)的直接尋址可用于訪問片內(nèi)、系列單片機(jī)的直接尋址可用于訪問片內(nèi)、片外數(shù)據(jù)存儲(chǔ)器,也可用于訪問程序存儲(chǔ)器。片外數(shù)據(jù)存儲(chǔ)器,也可用于訪問程序存儲(chǔ)器。補(bǔ)充內(nèi)容:尋址方
10、式補(bǔ)充內(nèi)容:尋址方式 直接尋址直接尋址 直接尋址可訪問片內(nèi)直接尋址可訪問片內(nèi)RAMRAM的低的低128128個(gè)單元,同時(shí)也個(gè)單元,同時(shí)也是訪問片內(nèi)是訪問片內(nèi)RAMRAM高高128128個(gè)單元特殊功能寄存器個(gè)單元特殊功能寄存器SFRSFR的唯的唯一方法。由于一方法。由于5252子系列的片內(nèi)子系列的片內(nèi)RAMRAM有有256256個(gè)單元,其高個(gè)單元,其高128128個(gè)單元與個(gè)單元與SFRSFR的地址是重疊的。為了避免混亂,的地址是重疊的。為了避免混亂,5151單片機(jī)規(guī)定:?jiǎn)纹瑱C(jī)規(guī)定:直接尋址的指令不能訪問片內(nèi)直接尋址的指令不能訪問片內(nèi)RAMRAM的高的高128128個(gè)單元個(gè)單元(80H(80HFF
11、H)FFH),若要訪問這些單元只能用寄,若要訪問這些單元只能用寄存器間接尋址指令,而要訪問存器間接尋址指令,而要訪問SFRSFR只能用直接尋址指只能用直接尋址指令。另外,訪問令。另外,訪問SFRSFR可在指令中直接使用該寄存器的可在指令中直接使用該寄存器的名字來代替地址,如名字來代替地址,如MOV AMOV A,80H80H,可以寫成,可以寫成MOV AMOV A,P0P0,因?yàn)椋驗(yàn)镻0P0口的地址為口的地址為80H80H。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 直接尋址直接尋址 直接尋址方式在直接尋址方式在訪問程序存儲(chǔ)器訪問程序存儲(chǔ)器時(shí)的轉(zhuǎn)移、調(diào)用時(shí)的轉(zhuǎn)移、調(diào)用指令中將直接給出程序存儲(chǔ)器的地
12、址,執(zhí)行這些指令指令中將直接給出程序存儲(chǔ)器的地址,執(zhí)行這些指令后,程序計(jì)數(shù)器后,程序計(jì)數(shù)器PCPC的內(nèi)容將更換為指令直接給出的地的內(nèi)容將更換為指令直接給出的地址,機(jī)器將改為訪問以所給地址為起始地址的存儲(chǔ)區(qū)址,機(jī)器將改為訪問以所給地址為起始地址的存儲(chǔ)區(qū)間,取指令間,取指令(或取數(shù)或取數(shù)),并依次執(zhí)行。,并依次執(zhí)行。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 變址尋址變址尋址 由基址寄存器加上變址寄存器的間接尋址方式稱由基址寄存器加上變址寄存器的間接尋址方式稱為基址變址尋址,簡(jiǎn)稱變址尋址。它是以數(shù)據(jù)指針寄為基址變址尋址,簡(jiǎn)稱變址尋址。它是以數(shù)據(jù)指針寄存器存器DPTRDPTR或者或者PCPC作為基址寄存器
13、,累加器作為基址寄存器,累加器A A作為變址作為變址寄存器,兩者內(nèi)容相加后的和作為程序存儲(chǔ)器的地址,寄存器,兩者內(nèi)容相加后的和作為程序存儲(chǔ)器的地址,再尋址該單元,讀取數(shù)據(jù)。這種尋址方式常用于訪問再尋址該單元,讀取數(shù)據(jù)。這種尋址方式常用于訪問程序存儲(chǔ)器中的常數(shù)表。程序存儲(chǔ)器中的常數(shù)表。例如:例如:MOVCA,A+DPTRMOVCA,A+PC補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 變址尋址變址尋址 變址尋址方式的示例如下:變址尋址方式的示例如下:補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 相對(duì)尋址相對(duì)尋址 相對(duì)尋址是以相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器當(dāng)前程序計(jì)數(shù)器PCPC值值加上指令中給加上指令中給出的偏移量出
14、的偏移量relrel,構(gòu)成實(shí)際操作數(shù)地址的尋址方法。,構(gòu)成實(shí)際操作數(shù)地址的尋址方法。它用于訪問程序存儲(chǔ)器,常出現(xiàn)在相對(duì)轉(zhuǎn)移指令中。它用于訪問程序存儲(chǔ)器,常出現(xiàn)在相對(duì)轉(zhuǎn)移指令中。在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn):在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn):(1)(1)當(dāng)前當(dāng)前PCPC值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該指令的字節(jié)數(shù)。例如:指令的字節(jié)數(shù)。例如:JZ relJZ rel是一條累加器是一條累加器A A為零就為零就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲(chǔ)地址為轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲(chǔ)地址為2050H2050H,則執(zhí)行該指令時(shí)的當(dāng)前則執(zhí)行該指令時(shí)的當(dāng)前PCPC值即為值即為
15、2052H2052H。即當(dāng)前。即當(dāng)前PCPC值值是對(duì)相對(duì)轉(zhuǎn)移指令取指結(jié)束時(shí)的值。是對(duì)相對(duì)轉(zhuǎn)移指令取指結(jié)束時(shí)的值。補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 相對(duì)尋址相對(duì)尋址 (2)(2)偏移量偏移量relrel是有符號(hào)的單字節(jié)數(shù),以補(bǔ)碼形式是有符號(hào)的單字節(jié)數(shù),以補(bǔ)碼形式表示,取值的范圍是表示,取值的范圍是-128-128127(00H127(00HFFH)FFH),負(fù)數(shù)表,負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。所以,相對(duì)轉(zhuǎn)移指令滿足條件后,轉(zhuǎn)移的目的地移。所以,相對(duì)轉(zhuǎn)移指令滿足條件后,轉(zhuǎn)移的目的地址為:址為:目的地址目的地址 =當(dāng)前當(dāng)前
16、PCPC值值 +rel+rel =當(dāng)前指令存儲(chǔ)地址當(dāng)前指令存儲(chǔ)地址 +指令字節(jié)數(shù)指令字節(jié)數(shù) +rel+rel補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 位尋址位尋址 位尋址是在位操作指令中直接給出位操作數(shù)的地位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對(duì)片內(nèi)址,可以對(duì)片內(nèi)RAMRAM中的中的128128位和特殊功能寄存器位和特殊功能寄存器SFRSFR中的中的9393位進(jìn)行尋址。位進(jìn)行尋址。位尋址可認(rèn)為是位尋址可認(rèn)為是位類型數(shù)據(jù)的直接尋址位類型數(shù)據(jù)的直接尋址。例如:例如:MOV CMOV C,30H30H補(bǔ)充內(nèi)容:尋址方式補(bǔ)充內(nèi)容:尋址方式 數(shù)據(jù)類型數(shù)據(jù)類型 該類指令的功能是實(shí)現(xiàn)數(shù)據(jù)在片內(nèi)該類指
17、令的功能是實(shí)現(xiàn)數(shù)據(jù)在片內(nèi)RAMRAM單元之間、單元之間、寄存器之間、寄存器與寄存器之間、寄存器與RAMRAM單元之間的傳送。所有指單元之間的傳送。所有指令具有統(tǒng)一的格式,其格式如下:令具有統(tǒng)一的格式,其格式如下:MOV目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)指令功能:將源操作數(shù)指令功能:將源操作數(shù)(或單元或單元)的內(nèi)容存入目的操作的內(nèi)容存入目的操作數(shù)地址單元中。數(shù)地址單元中。操作碼助記符都是操作碼助記符都是“MOVMOV”,目的操作數(shù)和源操,目的操作數(shù)和源操作數(shù)不同尋址方式的組合就派生出該類的全部指令。作數(shù)不同尋址方式的組合就派生出該類的全部指令。因此,記憶這類指令的關(guān)鍵在于掌握兩個(gè)操作數(shù)的各
18、因此,記憶這類指令的關(guān)鍵在于掌握兩個(gè)操作數(shù)的各種尋址方式的組合關(guān)系。種尋址方式的組合關(guān)系。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 特殊功能寄存器特殊功能寄存器 為便于記憶,一般傳送指令的關(guān)系圖如下:為便于記憶,一般傳送指令的關(guān)系圖如下:3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)類型存儲(chǔ)類型 datadata區(qū):區(qū):3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)類型存儲(chǔ)類型 bdatabdata區(qū):區(qū):3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)類型存儲(chǔ)類型 idataidata區(qū):區(qū):3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)類型存儲(chǔ)類型 pdatap
19、data區(qū)和區(qū)和xdataxdata區(qū):區(qū):3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)類型存儲(chǔ)類型 CodeCode區(qū):區(qū):3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 存儲(chǔ)模式存儲(chǔ)模式 3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ)存儲(chǔ)模式存儲(chǔ)模式說說 明明SMALL默默認(rèn)認(rèn)的的存存儲(chǔ)儲(chǔ)類類型型是是data,參參數(shù)數(shù)及及局局部部變變量量放放入入可可直直接接尋尋址址片片內(nèi)內(nèi)RAM的的用用戶戶區(qū)區(qū)中中(最最大大128字字節(jié)節(jié))。另另外外所所有有對(duì)對(duì)象象(包包括括堆堆棧棧),都都必必須須嵌嵌入入片片內(nèi)內(nèi)RAM。棧棧長(zhǎng)長(zhǎng)很很關(guān)關(guān)鍵鍵,因因?yàn)闉閷?shí)際棧長(zhǎng)依賴于函數(shù)嵌套調(diào)用層數(shù)實(shí)際棧長(zhǎng)依賴于函
20、數(shù)嵌套調(diào)用層數(shù)COMPACT默認(rèn)的存儲(chǔ)類型是默認(rèn)的存儲(chǔ)類型是pdata,參數(shù)及局部變量放入分頁的外,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲(chǔ)區(qū),通過部數(shù)據(jù)存儲(chǔ)區(qū),通過R0或或R1間接訪問,??臻g位于間接訪問,??臻g位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中LARGE默默認(rèn)認(rèn)的的存存儲(chǔ)儲(chǔ)類類型型是是xdata,參參數(shù)數(shù)及及局局部部變變量量直直接接放放入入片片外外數(shù)數(shù)據(jù)據(jù)存存儲(chǔ)儲(chǔ)區(qū)區(qū),使使用用數(shù)數(shù)據(jù)據(jù)指指針針DPTR來來進(jìn)進(jìn)行行尋尋址址。用用此此數(shù)數(shù)據(jù)據(jù)指指針針進(jìn)進(jìn)行行訪訪問問效效率率較較低低,尤尤其其對(duì)對(duì)兩兩個(gè)個(gè)或或多多個(gè)個(gè)字字節(jié)節(jié)的的變變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的長(zhǎng)度量,這種數(shù)據(jù)類型的訪問
21、機(jī)制直接影響代碼的長(zhǎng)度 指針指針 通用指針:通用指針:C51提供了一個(gè)提供了一個(gè)3個(gè)字節(jié)個(gè)字節(jié)的通用存儲(chǔ)器指針,其第一個(gè)字節(jié)的通用存儲(chǔ)器指針,其第一個(gè)字節(jié)表明指針?biāo)傅拇鎯?chǔ)區(qū)空間,另外兩個(gè)字節(jié)用于存儲(chǔ)表明指針?biāo)傅拇鎯?chǔ)區(qū)空間,另外兩個(gè)字節(jié)用于存儲(chǔ)16位位地址地址偏移量。對(duì)于偏移量。對(duì)于data、idata和和pdata區(qū),只需要區(qū),只需要8位位的偏移量。的偏移量。例如:例如:long*state;是一個(gè)指向是一個(gè)指向long型整數(shù)的指針,而型整數(shù)的指針,而state本身本身則根據(jù)則根據(jù)存儲(chǔ)模式存儲(chǔ)模式存放在不同的存放在不同的RAM區(qū)。區(qū)。char*xdataptr;是一個(gè)指向是一個(gè)指向char
22、型型數(shù)據(jù)的指針,而數(shù)據(jù)的指針,而ptr本身存放在外部本身存放在外部RAM區(qū)。區(qū)。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 指針指針 通用指針:通用指針:通用存儲(chǔ)器指針格式:通用存儲(chǔ)器指針格式:其中,第一字節(jié)代表了指針的其中,第一字節(jié)代表了指針的存儲(chǔ)器類型存儲(chǔ)器類型,其編碼如下:,其編碼如下:3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ)地址地址+0+1+2內(nèi)容內(nèi)容存儲(chǔ)器類型存儲(chǔ)器類型偏移地址高位字節(jié)偏移地址高位字節(jié)偏移地址低位字節(jié)偏移地址低位字節(jié)存儲(chǔ)器存儲(chǔ)器類型類型idataxdatapdatadatacode值值12345 指針指針 通用指針:通用指針:通用指針指向的數(shù)據(jù)可存放于通用指
23、針指向的數(shù)據(jù)可存放于任何類型任何類型的存儲(chǔ)器中,其產(chǎn)的存儲(chǔ)器中,其產(chǎn)生的代碼比具體指針代碼的執(zhí)行速度要慢,因?yàn)榇鎯?chǔ)區(qū)在運(yùn)行生的代碼比具體指針代碼的執(zhí)行速度要慢,因?yàn)榇鎯?chǔ)區(qū)在運(yùn)行前是未知的,編譯器不能優(yōu)化存儲(chǔ)區(qū)訪問,必須產(chǎn)生可以訪問前是未知的,編譯器不能優(yōu)化存儲(chǔ)區(qū)訪問,必須產(chǎn)生可以訪問任何存儲(chǔ)區(qū)的通用代碼。任何存儲(chǔ)區(qū)的通用代碼。如果需要考慮執(zhí)行速度,則應(yīng)該盡可能使用如果需要考慮執(zhí)行速度,則應(yīng)該盡可能使用具體指針具體指針,而,而不是通用指針。不是通用指針。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 指針指針 具體指針:具體指針:Keil允許使用者規(guī)定指針指向的存儲(chǔ)段,這種指針稱為具允許使用者規(guī)
24、定指針指向的存儲(chǔ)段,這種指針稱為具體指針。例如:體指針。例如:chardata*str;/str指向指向data區(qū)的區(qū)的char型數(shù)據(jù)型數(shù)據(jù)intxdata*ptr;/ptr指向指向xdata區(qū)的區(qū)的int型數(shù)據(jù)型數(shù)據(jù) 使用具體指針的好處是節(jié)省了存儲(chǔ)空間。編譯器不用為存使用具體指針的好處是節(jié)省了存儲(chǔ)空間。編譯器不用為存儲(chǔ)器選擇和決定正確的存儲(chǔ)器操作指令產(chǎn)生代碼,這樣就使得儲(chǔ)器選擇和決定正確的存儲(chǔ)器操作指令產(chǎn)生代碼,這樣就使得代碼更加簡(jiǎn)短。但必須保證指針不指向所聲明的存儲(chǔ)區(qū)以外的代碼更加簡(jiǎn)短。但必須保證指針不指向所聲明的存儲(chǔ)區(qū)以外的地方,否則會(huì)產(chǎn)生錯(cuò)誤。地方,否則會(huì)產(chǎn)生錯(cuò)誤。3.1 單片機(jī)的單片
25、機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 指針指針 具體指針:具體指針:具體指針與通用指針對(duì)照關(guān)系如下:具體指針與通用指針對(duì)照關(guān)系如下:例:例:charxdata*datapdx;指針;指針pdx位于位于data區(qū),指向區(qū),指向xdata區(qū)的區(qū)的char類型數(shù)據(jù)。類型數(shù)據(jù)。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ)指針類型通用指針xdata指針code指針idata指針data指針pdata指針存儲(chǔ)大小3字節(jié)2字節(jié)2字節(jié)1字節(jié)1字節(jié)1字節(jié) 指針指針例例:#includechar*generic_ptr;chardata*xd_ptr;charmystring=Testoutput;main()gener
26、ic_ptr=mystring;while(*generic_ptr)XBYTE0 x0000=*generic_ptr;generic_ptr+;xd_ptr=mystring;while(*xd_ptr)XBYTE0 x0000=*xd_ptr;xd_ptr+;3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 絕對(duì)地址訪問絕對(duì)地址訪問 絕對(duì)宏:絕對(duì)宏:在程序中在程序中,用,用“#include”即可使用其中聲即可使用其中聲明的明的宏宏來訪問絕對(duì)地址。包括:來訪問絕對(duì)地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE和和DWORD等,如:等,如:xv
27、al=XBYTE0 x0002;XWORD0 x0002=0 x2000;#defineDAC0832XBYTE0 xffff;DAC0832=0 x80;3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 絕對(duì)地址訪問絕對(duì)地址訪問 _at_at_關(guān)鍵字:關(guān)鍵字:該關(guān)鍵字用法較簡(jiǎn)單該關(guān)鍵字用法較簡(jiǎn)單,直接在數(shù)據(jù)聲明后加上,直接在數(shù)據(jù)聲明后加上_at_地址常地址常數(shù)即可。但需要注意以下問題:數(shù)即可。但需要注意以下問題:(1)絕對(duì)變量不能被初始化。)絕對(duì)變量不能被初始化。(2)bit型數(shù)據(jù)及變量不能用型數(shù)據(jù)及變量不能用_at_指定。例如:指定。例如:structdatstructdatidata*ne
28、xt;charcode*test;idatastructdatnum_at_0 x42;xdataintval_at_0 x8000;3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 運(yùn)算符運(yùn)算符 算術(shù)運(yùn)算符:算術(shù)運(yùn)算符:3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 運(yùn)算符運(yùn)算符 關(guān)系運(yùn)算符:關(guān)系運(yùn)算符:3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 運(yùn)算符運(yùn)算符 邏輯運(yùn)算符:邏輯運(yùn)算符:邏輯運(yùn)算符的操作數(shù)為邏輯運(yùn)算符的操作數(shù)為“位位”類型。類型。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 運(yùn)算符運(yùn)算符 位運(yùn)算符:位運(yùn)算符:位運(yùn)算符為位運(yùn)算符為“按位按位”進(jìn)行邏輯運(yùn)算,其操作數(shù)可為進(jìn)行邏輯
29、運(yùn)算,其操作數(shù)可為“位位”類型,也可為其他類型,如類型,也可為其他類型,如“字節(jié)字節(jié)”、“字字”等。等。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) 運(yùn)算符運(yùn)算符 復(fù)合運(yùn)算符:復(fù)合運(yùn)算符:3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) C51函數(shù)分為函數(shù)分為主函數(shù)、標(biāo)準(zhǔn)庫函數(shù)、自定義函數(shù)主函數(shù)、標(biāo)準(zhǔn)庫函數(shù)、自定義函數(shù)。主函數(shù):主函數(shù):Cx51語言程序中語言程序中有且只能有一個(gè)主函數(shù)有且只能有一個(gè)主函數(shù)main()。一個(gè)一個(gè)Cx51語言程序的執(zhí)行總是從主函數(shù)語言程序的執(zhí)行總是從主函數(shù)main()開始,主函開始,主函數(shù)可以調(diào)用其它函數(shù),包括庫函數(shù)和用戶自定義函數(shù),其它函數(shù)可以調(diào)用
30、其它函數(shù),包括庫函數(shù)和用戶自定義函數(shù),其它函數(shù)不能調(diào)用主函數(shù)。數(shù)不能調(diào)用主函數(shù)。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) C51函數(shù)分為函數(shù)分為主函數(shù)、標(biāo)準(zhǔn)庫函數(shù)、自定義函數(shù)主函數(shù)、標(biāo)準(zhǔn)庫函數(shù)、自定義函數(shù)。主函數(shù):主函數(shù):主函數(shù)的標(biāo)準(zhǔn)寫法是主函數(shù)的標(biāo)準(zhǔn)寫法是intmain(void)前前面面的的int是是main函函數(shù)數(shù)的的返返回回值值類類型型,用用于于向向操操作作系系統(tǒng)統(tǒng)說說明明程程序序的的退退出出狀狀態(tài)態(tài)。返返回回值值為為“0”代代表表正正常常退退出出,“1”代代表表異異常常。形形式式參參數(shù)數(shù)“void”用用于于說說明明主主函函數(shù)數(shù)main()沒沒有有輸輸入入?yún)?shù)。
31、數(shù)。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) 庫函數(shù):庫函數(shù):Cx51編譯器提供了豐富的庫函數(shù),庫函數(shù)是已經(jīng)編寫好的編譯器提供了豐富的庫函數(shù),庫函數(shù)是已經(jīng)編寫好的功能函數(shù),可完成數(shù)學(xué)計(jì)算、輸入輸出等常用功能,供開發(fā)人功能函數(shù),可完成數(shù)學(xué)計(jì)算、輸入輸出等常用功能,供開發(fā)人員調(diào)用,以提高編程效率。員調(diào)用,以提高編程效率。如如果果程程序序中中使使用用了了庫庫函函數(shù)數(shù),則則應(yīng)應(yīng)該該在在程程序序的的開開頭頭處處使使用用#include包含語句包含語句,將所用的,將所用的庫函數(shù)頭文件庫函數(shù)頭文件包含到程序中來。包含到程序中來。如:如:#include專用寄存器專用寄存器SFR定義定義
32、#include絕對(duì)地址定義絕對(duì)地址定義3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) 庫函數(shù):庫函數(shù):如:如:#include動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配#include緩沖區(qū)處理函數(shù)緩沖區(qū)處理函數(shù)#include輸入輸出流函數(shù)輸入輸出流函數(shù)#include內(nèi)部函數(shù)內(nèi)部函數(shù)#include字符分類函數(shù)字符分類函數(shù)3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) 自定義函數(shù):自定義函數(shù):可根據(jù)需要編寫自定義功能函數(shù),結(jié)構(gòu)如下:可根據(jù)需要編寫自定義功能函數(shù),結(jié)構(gòu)如下:返回值類型返回值類型函數(shù)名函數(shù)名(類型類型形參形參)數(shù)據(jù)定義;數(shù)據(jù)定義;執(zhí)行語句;執(zhí)行語句;返回值;返回
33、值;3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) 自定義函數(shù):自定義函數(shù):形參(形式參數(shù))形參(形式參數(shù))和和返回值返回值是函數(shù)與外界聯(lián)系的橋梁。形是函數(shù)與外界聯(lián)系的橋梁。形參是在函數(shù)調(diào)用時(shí)由外界傳入函數(shù)體內(nèi)的參數(shù),形參可以沒有,參是在函數(shù)調(diào)用時(shí)由外界傳入函數(shù)體內(nèi)的參數(shù),形參可以沒有,也可以有多個(gè)。也可以有多個(gè)。返回值返回值是函數(shù)運(yùn)行完畢時(shí)返回給調(diào)用該函數(shù)語句的值。如是函數(shù)運(yùn)行完畢時(shí)返回給調(diào)用該函數(shù)語句的值。如果函數(shù)沒有返回值,那么應(yīng)聲明為果函數(shù)沒有返回值,那么應(yīng)聲明為void類型,凡不加返回值類類型,凡不加返回值類型限定的函數(shù),就會(huì)被編譯器視為返回整型值處理。型限定的函數(shù),就會(huì)被編譯器視為返回整型值處理。3.1 單片機(jī)的單片機(jī)的C51語言基礎(chǔ)語言基礎(chǔ) C51函數(shù)函數(shù) 自定義函數(shù):自定義函數(shù):根據(jù)作用范圍的不同,根據(jù)作用范圍的不同,變量變量可分為可分為局部變量局部變量和和