![第三部分單片機(jī)語文程序設(shè)計(jì)_第1頁](http://file4.renrendoc.com/view/34a7e3ee00e7ed19e47b16da5357db7e/34a7e3ee00e7ed19e47b16da5357db7e1.gif)
![第三部分單片機(jī)語文程序設(shè)計(jì)_第2頁](http://file4.renrendoc.com/view/34a7e3ee00e7ed19e47b16da5357db7e/34a7e3ee00e7ed19e47b16da5357db7e2.gif)
![第三部分單片機(jī)語文程序設(shè)計(jì)_第3頁](http://file4.renrendoc.com/view/34a7e3ee00e7ed19e47b16da5357db7e/34a7e3ee00e7ed19e47b16da5357db7e3.gif)
![第三部分單片機(jī)語文程序設(shè)計(jì)_第4頁](http://file4.renrendoc.com/view/34a7e3ee00e7ed19e47b16da5357db7e/34a7e3ee00e7ed19e47b16da5357db7e4.gif)
![第三部分單片機(jī)語文程序設(shè)計(jì)_第5頁](http://file4.renrendoc.com/view/34a7e3ee00e7ed19e47b16da5357db7e/34a7e3ee00e7ed19e47b16da5357db7e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三部分單片機(jī)語文程序設(shè)計(jì)第一頁,共七十三頁,編輯于2023年,星期一單片機(jī)C語言及程序設(shè)計(jì)1.C51概述2.C51數(shù)據(jù)類型及存儲3.C51變量的定義及數(shù)據(jù)存儲區(qū)域
C51位變量的定義5.C51特殊功能寄存器的定義6.C51指令的定義
7.C51的輸入/輸出
8.C51函數(shù)的定義
9.C51與匯編語言混合編程10.C51集成開發(fā)軟件KeilC第二頁,共七十三頁,編輯于2023年,星期一第三部分單片機(jī)C語言及程序設(shè)計(jì)
認(rèn)為讀者已經(jīng)學(xué)習(xí)過C語言,具有C語言的基本知識,本章內(nèi)容完全是結(jié)合單片機(jī)來講解,補(bǔ)充C語言在單片機(jī)方面的概念、數(shù)據(jù)定義和函數(shù)定義等。 通過本章學(xué)習(xí),使你能夠比較順利地編寫C51程序。第三頁,共七十三頁,編輯于2023年,星期一1.C51概述主要內(nèi)容1C語言編程的優(yōu)勢2C51與ANSIC的區(qū)別3C51擴(kuò)展的關(guān)鍵字第四頁,共七十三頁,編輯于2023年,星期一1.C51概述學(xué)習(xí)單片機(jī)C語言的必要性 隨著單片機(jī)性能的不斷提高,C語言編譯調(diào)試工具的不斷完善,以及現(xiàn)在對單片機(jī)產(chǎn)品輔助功能的要求、對開發(fā)周期不斷縮短的要求,使得越來越多的單片機(jī)編程人員轉(zhuǎn)向使用C語言,因此有必要在單片機(jī)課程中講授“單片機(jī)C語言”?!癈51”概念:為了與ANSIC區(qū)別,把“單片機(jī)C語言”稱為“C51”,也稱為“KeilC”。第五頁,共七十三頁,編輯于2023年,星期一C語言編程的優(yōu)勢
在編程方面,使用C51較匯編語言有諸多優(yōu)勢:
1)編程容易
2)容易實(shí)現(xiàn)復(fù)雜的數(shù)值計(jì)算
3)容易閱讀與交流
4)容易調(diào)試與維護(hù)程序
5)容易實(shí)現(xiàn)模塊化開發(fā)
6)程序可移植性好
第六頁,共七十三頁,編輯于2023年,星期一C語言與ANSI的區(qū)別
用匯編語言編寫單片機(jī)程序時(shí),必須要考慮其存儲器的結(jié)構(gòu),尤其要考慮其片內(nèi)數(shù)據(jù)存儲器、特殊功能寄存器是否正確合理的使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。 用C51編寫程序,雖然不像匯編語言那樣需要具體地組織、分配存儲器資源,但是C51對數(shù)據(jù)類型和變量的定義,必須要與單片機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。第七頁,共七十三頁,編輯于2023年,星期一C語言與ANSI的區(qū)別
用C51編寫單片機(jī)程序,與用ANSIC編寫程序的不同之處是:
需要根據(jù)單片機(jī)存儲器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類型和變量。 其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法,都與
ANSIC相同。本章主要介紹C51各種變量的定義、指針定義、函數(shù)定義和混合編程。
第八頁,共七十三頁,編輯于2023年,星期一3C51擴(kuò)展的關(guān)鍵字
由于單片機(jī)在結(jié)構(gòu)及編程上的特殊要求,C51有自己的特殊關(guān)鍵字,稱之為C51擴(kuò)展的關(guān)鍵字,下面給出常用的C51擴(kuò)展的關(guān)鍵字: _at_ bdata bit code data idata interrupt pdata reentrant sbit sfr sfr16 using volatile xdata
這些關(guān)鍵字在后面會陸續(xù)接觸到,此處先不給出它們的含義。
第九頁,共七十三頁,編輯于2023年,星期一2.C51數(shù)據(jù)類型及存儲主要內(nèi)容1C51的數(shù)據(jù)類型2C51數(shù)據(jù)的存儲第十頁,共七十三頁,編輯于2023年,星期一2.1C51的數(shù)據(jù)類型表4-1C51數(shù)據(jù)類型、長度和數(shù)值范圍數(shù)據(jù)類型表示方法長度數(shù)值范圍無符號字符型unsignedchar1字節(jié)0~255有符號字符型signedchar1字節(jié)-128~127無符號整型unsignedint2字節(jié)0~65535有符號整型signedint2字節(jié)-32768~32767無符號長整型unsignedlong4字節(jié)0~4294967295有符號長整型signedlong4字節(jié)-2147483648~2147483647浮點(diǎn)型float4字節(jié)±1.1755E-38~±3.40E+38特殊功能寄存器型sfrsfr161字節(jié)2字節(jié)0~2550~65535位類型bit、sbit1位0或1第十一頁,共七十三頁,編輯于2023年,星期一2.1C51的數(shù)據(jù)類型數(shù)據(jù)類型轉(zhuǎn)換1)自動轉(zhuǎn)換
轉(zhuǎn)換規(guī)則是向高精度數(shù)據(jù)類型轉(zhuǎn)換、向有符號數(shù)據(jù)類型轉(zhuǎn)換。如字符型變量與整型變量相加時(shí),則位變量先轉(zhuǎn)換字符型或整型數(shù)據(jù),然后相加。2)強(qiáng)制轉(zhuǎn)換 像ANSIC一樣,通過強(qiáng)制類型轉(zhuǎn)換的方式進(jìn)行轉(zhuǎn)換。如:
unsigned int b; float c; b=(int)c;
第十二頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲
MCS-51單片機(jī)只有bit和unsignedchar兩種數(shù)據(jù)類型支持機(jī)器指令,而其它類型的數(shù)據(jù)都需要轉(zhuǎn)換成bit或unsignedchar型進(jìn)行存儲。 為了減少單片機(jī)的存儲空間和提高運(yùn)行速度,要盡可能地使用unsignedchar型數(shù)據(jù)。
一、位變量的存儲
bit和sbit型位變量,直接存于RAM的位尋址空間,包括低128位和特殊功能寄存器位。第十三頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲二、字符變量的存儲
字符變量(char):無論是unsignedchar數(shù)據(jù)還是signedchar數(shù)據(jù),均為1個(gè)字節(jié),能夠被直接存儲在RAM中,可以存儲在0~0x7f區(qū)域,也可以存儲在0x80~0xff區(qū)域,與變量的定義有關(guān)。unsignedchar數(shù):可直接被MSC-51接受signedchar數(shù)據(jù):用補(bǔ)碼表示。需要額外的操作來測試、處理符號位,使用的是兩種庫函數(shù),代碼量大,運(yùn)算速度降低。第十四頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲三、整型變量的存儲整型變量(int):
不管是unsignedint數(shù)據(jù)還是signedint數(shù)據(jù),均為2個(gè)字節(jié),其存儲方法是高位字節(jié)保存在低地址(在前面),低位字節(jié)保存在高地址(在后面)。例:整型變量的值為0x1234,在內(nèi)存中的存放如右圖所示。
signedint數(shù)據(jù)用補(bǔ)碼表示。地址低高::1234::第十五頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲四、長整型變量的存儲長整型變量(long)為4個(gè)字節(jié),其存儲方法與整型數(shù)據(jù)一樣,是最高位字節(jié)保存的地址最低(在最前面),最低位字節(jié)保存的地址最高(在最后面)。如:長整型變量的值為0x12345678,在內(nèi)存中的存放方法如右圖所示。不管是unsignedlong數(shù)據(jù)還是signedlong數(shù)據(jù)。地址低高::12345678::第十六頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲五、浮點(diǎn)型變量的存儲
浮點(diǎn)型變量(fload)占4個(gè)字節(jié),用指數(shù)方式表示,其具體格式與編譯器有關(guān)。
對于KeilC,采用的是IEEE-754標(biāo)準(zhǔn),具有24位精度,尾數(shù)的最高位始終為1,因而不保存。具體分布為:1位符號位,8位階碼位,23位尾數(shù),如下圖所示。
字節(jié)地址0123浮點(diǎn)數(shù)內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符號和階碼尾數(shù)高位尾數(shù)低位第十七頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲符號位S:1表示負(fù)數(shù),0表示正數(shù)。階碼:用移碼表示。如,實(shí)際階碼-126用1表示,實(shí)際階碼0用127表示,即實(shí)際階碼數(shù)加上127得到階碼的表達(dá)數(shù)。階碼數(shù)值范圍:-126~+128。第十八頁,共七十三頁,編輯于2023年,星期一2.2C51數(shù)據(jù)的存儲例如:浮點(diǎn)數(shù)-12.5符號位為1,12.5的二進(jìn)制數(shù)1100.1=1.1001E+0011,階碼數(shù)值為3+127=130=10000010B,尾數(shù)為1001。
因此,其十六進(jìn)制數(shù)為0xC1480000,則存儲結(jié)構(gòu)如右圖所示。
地址低高::C1480000::第十九頁,共七十三頁,編輯于2023年,星期一3.C51變量的定義及數(shù)據(jù)存儲區(qū)域主要內(nèi)容3.1C51變量的定義3.2C51變量的存儲類型3.3C51變量的存儲區(qū)域3.4C51變量定義舉例3.5C51變量的存儲模式3.6C51變量的絕對定位第二十頁,共七十三頁,編輯于2023年,星期一3.1C51變量的定義C51變量定義的一般格式為:[存儲類型]數(shù)據(jù)類型[存儲區(qū)]變量名1[=初值][,變量名2[=初值]][,…]或 [存儲類型] [存儲區(qū)]
數(shù)據(jù)類型變量名1[=初值][,變量名2[=初值]][,…]變量(非位變量)的定義由4部分組成,即在變量定義時(shí),指定變量4種屬性。數(shù)據(jù)類型:在前面的2中已經(jīng)敘述過,對于變量名也無須多說,下面主要解釋“存儲類型”和“存儲區(qū)”等概念。
第二十一頁,共七十三頁,編輯于2023年,星期一3.2C51變量的存儲類型
存儲類型這個(gè)屬性我們?nèi)匝赜肁NSIC的說法,盡量不改變原來的含義。
按照ANSIC,C語言的變量有4種存儲類型: 動態(tài)存儲(auto) 靜態(tài)存儲(static) 全局存儲(extern) 寄存器存儲(register)
第二十二頁,共七十三頁,編輯于2023年,星期一3.2C51變量的存儲類型一、動態(tài)存儲
動態(tài)(存儲)變量:用auto定義的為動態(tài)變量,也叫自動變量。
作用范圍:函數(shù)內(nèi)或復(fù)合語句內(nèi)部。當(dāng)定義它的函數(shù)或復(fù)合語句執(zhí)行時(shí),C51才為變量分配存儲空間,結(jié)束時(shí)所占用的存儲空間釋放。 定義變量時(shí),auto可以省略,或者說如果省略了存儲類型項(xiàng),則認(rèn)為是動態(tài)變量。動態(tài)變量一般分配使用寄存器或堆棧。
第二十三頁,共七十三頁,編輯于2023年,星期一3.2C51變量的存儲類型二、靜態(tài)存儲
靜態(tài)(存儲)變量:用static定義的為靜態(tài)變量。分為內(nèi)部靜態(tài)和外部靜態(tài)變量。
內(nèi)部靜態(tài)變量:在函數(shù)體內(nèi)定義的為內(nèi)部靜態(tài)變量。 在函數(shù)內(nèi)可以任意使用和修改,函數(shù)運(yùn)行結(jié)束后會一直存在,但在函數(shù)外不可見,即在函數(shù)體外得到保護(hù)。
外部靜態(tài)變量:在函數(shù)體外部定義的為外部靜態(tài)變量。在定義的文件內(nèi)可以任意使用和修改,外部靜態(tài)變量會一直存在,但在文件外不可見,即在文件外得到保護(hù)。
第二十四頁,共七十三頁,編輯于2023年,星期一3.2C51變量的存儲類型三、外部存儲
外部(存儲)變量:用extern聲明的變量為外部變量,是在其它文件定義過的全局變量。 用extern聲明后,便可以在所聲明的文件中使用。
需要注意的是:在定義變量時(shí),即便是全局變量,也不能使用extern定義。
第二十五頁,共七十三頁,編輯于2023年,星期一3.2C51變量的存儲類型四、寄存器存儲
寄存器(存儲)變量:用register定義的變量為寄存器變量。
寄存器變量存放在CPU的寄存器中,這種變量處理速度快,但數(shù)目少。
C51中的寄存器變量:
C51的編譯器在編譯時(shí),能夠自動識別程序中使用頻率高的變量,并將其安排為寄存器變量,用戶不用專門聲明。
第二十六頁,共七十三頁,編輯于2023年,星期一3.3C51變量的存儲區(qū)域
變量的存儲區(qū)屬性是單片機(jī)擴(kuò)展的概念,非常重要,它涉及到7個(gè)新的關(guān)鍵字。
MCS-51單片機(jī)有四個(gè)存儲空間,分成三類,它們是片內(nèi)數(shù)據(jù)存儲空間、片外數(shù)據(jù)存儲空間和程序存儲空間。
MCS-51單片機(jī)有更多的存儲區(qū)域:由于片內(nèi)數(shù)據(jù)存儲器和片外數(shù)據(jù)存儲器又分成不同的區(qū)域,所以單片機(jī)的變量有更多的存儲區(qū)域。
在定義變量時(shí),必須明確指出是存放在哪個(gè)區(qū)域。第二十七頁,共七十三頁,編輯于2023年,星期一3.3C51變量的存儲區(qū)域表4-2C51存儲區(qū)與存儲空間的對應(yīng)關(guān)系關(guān)鍵字對應(yīng)的存儲空間及范圍codeROM空間,64KB全空間data片內(nèi)RAM,直接尋址,低128字節(jié)bdata片內(nèi)RAM,位尋址區(qū)0x20~0x2f,可字節(jié)訪問idata
片內(nèi)RAM,間接尋址,256字節(jié),與@Ri對應(yīng)pdata片外RAM,分頁尋址的256字節(jié)(P2不變),P2改變可尋址64KB全空間,與MOVX@Ri對應(yīng)xdata片外RAM,64KB全空間bit片內(nèi)RAM位尋找區(qū),位地址0x00~0x7f,128位第二十八頁,共七十三頁,編輯于2023年,星期一3.4C51變量定義舉例1)定義存儲在data區(qū)域的動態(tài)unsignedchar變量:
unsignedchardatasec=0,min=0,hou=0;2)定義存儲在data區(qū)域的靜態(tài)unsignedchar變量:
staticunsignedchardatascan_code=0xfe;3)定義存儲在data區(qū)域的靜態(tài)unsignedint變量:
staticunsignedintdatadd; 第二十九頁,共七十三頁,編輯于2023年,星期一3.4C51變量定義舉例4)定義存儲在bdata區(qū)域的動態(tài)unsignedchar變量:
unsignedcharbdataoperate,operate1; //定義指示操作的可位尋址的變量5)定義存儲在idata區(qū)域的動態(tài)unsignedchar數(shù)組:
unsignedcharidatatemp[20];6)定義在pdata區(qū)域的動態(tài)有符號int數(shù)組:
intpdatasend_data[30]; //定義存放發(fā)送數(shù)據(jù)的數(shù)組
第三十頁,共七十三頁,編輯于2023年,星期一3.4C51變量定義舉例7)定義存儲在xdata區(qū)域的動態(tài)unsignedint數(shù)組:
unsignedintxdatareceiv_buf[50];
//定義存放接受數(shù)據(jù)的數(shù)組8)定義存儲在code區(qū)域的unsignedchar數(shù)組:
unsignedcharcodedis_code[10]= {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
//定義共陰極數(shù)碼管段碼數(shù)組第三十一頁,共七十三頁,編輯于2023年,星期一3.5C51變量的存儲模式
存儲模式:如果在定義變量時(shí)缺省了存儲區(qū)屬性,則編譯器會自動選擇默認(rèn)的存儲區(qū)域,也就是存儲模式。
變量的存儲模式也就是程序(或函數(shù))的編譯模式。
編譯模式分為三種:小模式(small)、緊湊模式(compact)和大模式(large)。編譯模式由編譯控制命令決定。
存儲模式(編譯模式)決定了變量的默認(rèn)存儲區(qū)域和參數(shù)的傳遞方法。第三十二頁,共七十三頁,編輯于2023年,星期一3.5C51變量的存儲模式一、small模式
在small模式下,變量的默認(rèn)存儲區(qū)域是“data”、“idata”,即未指出存儲區(qū)域的變量保存到片內(nèi)數(shù)據(jù)存儲器中,并且堆棧也安排在該區(qū)域中。
small模式的特點(diǎn):存儲容量小,但速度快。small模式參數(shù)的傳遞:通過寄存器、堆棧或片內(nèi)數(shù)據(jù)存儲區(qū)完成的。
第三十三頁,共七十三頁,編輯于2023年,星期一3.5C51變量的存儲模式二、compact模式
在compact模式下,變量的默認(rèn)存儲區(qū)域是“pdata”,即未指出存儲區(qū)域的變量保存到片外數(shù)據(jù)存儲器的一頁中,最大變量數(shù)為256字節(jié),并且堆棧也安排在該區(qū)域中。
compact模式特點(diǎn):是存儲容量較small模式大,速度較small模式稍慢,但比large模式要快。compact模式下參數(shù)傳遞:通過片外數(shù)據(jù)區(qū)的一個(gè)固定頁完成的。第三十四頁,共七十三頁,編輯于2023年,星期一3.5C51變量的存儲模式三、large模式
在large模式下,變量的默認(rèn)存儲區(qū)域是“xdata”,即未指出存儲區(qū)域的變量保存到片外數(shù)據(jù)存儲器,最大變量數(shù)可達(dá)64KB,并且堆棧也安排在該區(qū)域中。
large模式的特點(diǎn):存儲容量大,速度慢
large模式下參數(shù)的傳遞方式:參數(shù)的傳遞也是通過片外數(shù)據(jù)存儲器完成的。
第三十五頁,共七十三頁,編輯于2023年,星期一3.5C51變量的存儲模式
C51支持混合模式:即可以對函數(shù)設(shè)置編譯模式,所以在large模式下,可以對某些函數(shù)設(shè)置為compact模式或small模式,從而提高運(yùn)行速度。
默認(rèn)編譯模式:如果文件或函數(shù)未指明編譯模式,則編譯器按small模式處理。
編譯模式控制命令:“#pragmasmall(或compact、large)”應(yīng)放在文件的開始。
第三十六頁,共七十三頁,編輯于2023年,星期一3.6C51變量的絕對定位C51有三種方式可以對變量(I/O端口)絕對定位:絕對定位關(guān)鍵字_at_、指針、庫函數(shù)的絕對定位宏。
對于后兩種方式,在后面指針一節(jié)介紹
C51擴(kuò)展的關(guān)鍵字_at_專門用于對變量作絕對定位,_at_使用在變量的定義中,其格式為:[存儲類型]數(shù)據(jù)類型[存儲區(qū)]變量名1_at_地址常數(shù)[,變量名2…]
第三十七頁,共七十三頁,編輯于2023年,星期一3.6C51變量的絕對定位舉例說明_at_的使用方法
1)對data區(qū)域中的unsignedchar變量aa作絕對定位:
unsigned char dataaa_at_0x30;
2)對pdata區(qū)域中的unsignedint數(shù)組cc作絕對定位:
unsigned intpdatacc[10]_at_0x34;
3)對xdata區(qū)域中的unsignedchar變量printer_port作絕對定位:
unsigned char xdataprinter_port_at_0x7fff;
第三十八頁,共七十三頁,編輯于2023年,星期一3.6C51變量的絕對定位說明:
1)絕對地址變量在定義時(shí)不能初始化,因此不能對code型變量絕對定位;
2)絕對地址變量只能夠是全局變量,不能在函數(shù)中對變量絕對定位;
3)絕對地址變量多用于I/O端口,一般情況下不對變量作絕對定位;
3)位變量不能使用_at_絕對定位。第三十九頁,共七十三頁,編輯于2023年,星期一4C51位變量的定義主要內(nèi)容4.1bit型位變量的定義4.2sbit型位變量的定義第四十頁,共七十三頁,編輯于2023年,星期一4.1bit型位變量的定義常說的位變量指的就是bit型位變量。C51的bit型位變量定義的一般格式為:[存儲類型]bit位變量名1[=初值][,位變量名2[=初值]][,…]bit位變量被保存在RAM中的位尋址區(qū)域(字節(jié)地址為0x20~0x2f,16字節(jié))。例如: bitflag_run,receiv_bit=0;
staticbit send_bit;
第四十一頁,共七十三頁,編輯于2023年,星期一4.1bit型位變量的定義說明:
1)bit型位變量與其它變量一樣,可以作為函數(shù)的形參,也可以作為函數(shù)的返回值,即函數(shù)的類型可以是位型的;
2)位變量不能定義指針,不能定義數(shù)組。
第四十二頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義
對于能夠按位尋址的特殊功能寄存器、定義在位尋址區(qū)域的變量(字節(jié)型、整型、長整型),可以對其各位用sbit定義位變量。
為了方便起見,分開討論按位尋址的特殊功能寄存器中位變量的定義、按位尋址的變量中位變量的定義。第四十三頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義一、特殊功能寄存器中位變量定義
能夠按位尋址的特殊功能寄存器中位變量定義的一般格式為:
sbit 位變量名=位地址表達(dá)式
這里的位地址表達(dá)式有三種形式:
直接位地址 特殊功能寄存器名帶位號 字節(jié)地址帶位號第四十四頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義
1、用直接位地址定義位變量這種情況下位變量的定義格式為:
sbit 位變量名=位地址常數(shù)
這里的位地址常數(shù)范圍為0x80~0xff,實(shí)際是定義特殊功能寄存器的位。例如:
sbit P0_0=0x80; sbit P1_1=0x91; sbit RS0=0xd3; //定義PSW的第3位
sbit ET0=0xa9; //定義IE的第1位
第四十五頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義2、特殊功能寄存器名帶位號定義這時(shí)位變量的定義格式為:sbit 位變量名=特殊功能寄存器名^位號常數(shù)這里的位號常數(shù)為0~7。例如:
sbit P0_3=P0^3; sbit P1_4=P1^4; sbit OV=PSW^2; //定義PSW的第2位
sbit ES=IE^4; //定義IE的第4位
第四十六頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義3、寄存器地址帶位號定義位變量在這種情況下位變量的定義格式為:sbit 位變量名=特殊功能寄存器地址^位號常數(shù) 這里的位號常數(shù)同上,為0~7。例如:
sbit P0_6=0x80^6; sbit P1_7=0x90^7; sbit AC=0xd0^6; //定義PSW的第6位
sbit EA=0xa8^7; //定義IE的第7位
第四十七頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義4、說明
1)用sbit定義的位變量,必須能夠按位操作,而不能夠?qū)o位操作功能的位定義位變量。 2)用sbit定義位變量,必須放在函數(shù)外面作為全局位變量,而不能在函數(shù)內(nèi)部定義。
3)用sbit每次只能定義一個(gè)位變量。
4)對其它模塊定義的位變量(bit型或sbit型)的引用聲明,都使用bit。
5)用sbit定義的是一種絕對定位的位變量(因?yàn)槊质桥c確定位地址對應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像bit型位變量那樣隨便使用。第四十八頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義二、位尋址區(qū)變量的位定義
對bdata型變量(字節(jié)型、整型、長整型),被保存在RAM中的位尋址區(qū),可以對bdata型變量各位作位變量定義。 這樣,既可以對bdata型變量作字節(jié)(或整型、長整型)操作,也可以作位操作。
bdata型變量的位定義格式:
sbit位變量名=bdata型變量名^位號常數(shù)
第四十九頁,共七十三頁,編輯于2023年,星期一4.2sbit型位變量的定義
bdata型變量為在此之前應(yīng)該是定義過的,位號常數(shù)可以是0~7(8位字節(jié)變量),或0~15(16位整型變量),或0~31(32位字長整型變量)。例:
unsigned char bdataoperate;
對operate的低4位作位變量定義:
sbitflag_key=operate^0; //鍵盤標(biāo)志位
sbitflag_dis=operate^1; //顯示標(biāo)志位
sbitflag_mus=operate^2; //音樂標(biāo)志位
sbitflag_run=operate^3; //運(yùn)行標(biāo)志位第五十頁,共七十三頁,編輯于2023年,星期一5C51特殊功能寄存器的定義主要內(nèi)容5.18位特殊功能寄存器的定義5.216位特殊功能寄存器的定義第五十一頁,共七十三頁,編輯于2023年,星期一5.18位特殊功能寄存器的定義定義的一般格式為:
sfr 特殊功能寄存器名=地址常數(shù)
地址常數(shù)范圍:0x80~0xff。
特殊功能寄存器定義例子(見reg51.h、reg52.h等文件):
sfr P0=0x80; //定義P0寄存器
sfr P1=0x90; //定義P1口寄存器
sfr PSW=0xd0; //定義PSW sfr IE=0xa8; //定義IE
第五十二頁,共七十三頁,編輯于2023年,星期一5.216位特殊功能寄存器的定義定義的一般格式為:
sfr16特殊功能寄存器名=地址常數(shù)
地址常數(shù)范圍:0x80~0xff。例:(見reg51.h、reg52.h等文件):
sfr16DPTR=0x82; sfr16T2=0xcc; //含TL2和TH2 sfr16RCAP2=0xca;
//含RCAP2L和
RCAP2H,0xca為RCAP2L的地址第五十三頁,共七十三頁,編輯于2023年,星期一5.216位特殊功能寄存器的定義說明:
1)定義特殊功能寄存器中的地址必須在0x80~0xff范圍內(nèi)。 2)定義特殊功能寄存器,必須放在函數(shù)外面作為全局變量。
3)用sfr或sfr16每次只能定義一個(gè)特殊功能寄存器。
4)像sbit一樣,用sfr或sfr16定義的是絕對定位的變量(因?yàn)槊质桥c確定地址對應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像一般變量那樣隨便使用。第五十四頁,共七十三頁,編輯于2023年,星期一6C51指針的定義6.1通用指針6.2存儲器專用指針6.3指針變換6.4C51指針應(yīng)用第五十五頁,共七十三頁,編輯于2023年,星期一6.C51指針的定義
由于MCS-51單片機(jī)有三種不同類型的存儲空間,并且還有不同的存儲區(qū)域,因此C51指針的內(nèi)容更豐富。
指針除了具有像變量的四種屬性(存儲類型、數(shù)據(jù)類型、存儲區(qū)、變量名)外,按存儲區(qū),將指針分為通用指針和不同存儲區(qū)域的專用指針。
第五十六頁,共七十三頁,編輯于2023年,星期一6.1通用指針
所謂通用指針,就是通過該類指針可以訪問所有的存儲空間。
在C51庫函數(shù)中通常使用這種指針來訪問。
通用指針用3個(gè)字節(jié)來表示:
第一個(gè)字節(jié):表示指針?biāo)赶虻拇鎯臻g 第二個(gè)字節(jié):為指針地址的高字節(jié) 第三個(gè)字節(jié):為指針地址的低字節(jié)第五十七頁,共七十三頁,編輯于2023年,星期一6.1通用指針通用指針的定義與一般C語言指針的定義相同,其格式為:
[存儲類型]數(shù)據(jù)類型*指針名1[,*指針名2][,…]例如:
unsignedchar*cpt; int*dpt; long*lpt; staticchar*ccpt;
通用指針的特點(diǎn):定義簡單訪問所有空間訪問速度慢
第五十八頁,共七十三頁,編輯于2023年,星期一6.2存儲器專用指針
所謂存儲器專用指針,就是通過該類指針,只能夠訪問規(guī)定的存儲空間區(qū)域。 指針本身占用:
1個(gè)字節(jié)(data*,idata*,bdata*,pdata*)或
2個(gè)字節(jié)(xdata*,code*)存儲器專用指針的一般定義格式為:[存儲類型]數(shù)據(jù)類型指向存儲區(qū)
*[指針存儲區(qū)
]指針名1 [,*[指針存儲區(qū)]指針名2,…]
第五十九頁,共七十三頁,編輯于2023年,星期一6.2存儲器專用指針指向存儲區(qū):
是指針變量所指向的數(shù)據(jù)存儲空間區(qū)域。不能夠缺省。指針存儲區(qū):
是指針變量本身所存儲的空間區(qū)域。
缺省時(shí)認(rèn)為指針存儲區(qū)在默認(rèn)的存儲區(qū)域,其默認(rèn)存儲區(qū)域決定于所設(shè)定的編譯模式。
指向和指針存儲區(qū),兩者可以是同一個(gè)區(qū)域,但多數(shù)情況下不會是同一個(gè)區(qū)域。
第六十頁,共七十三頁,編輯于2023年,星期一6.2存儲器專用指針存儲器專用指針例子:
unsignedchardata*cpt1,*cpt2; signedintidata*dpt1,*dpt2; unsignedcharpdata*ppt; signedlongxdata*lpt1,*lpt2; unsignedcharcode*ccpt; 上面所定義的指針雖然所指向的空間不同,但指針變量本身都存儲在默認(rèn)的存儲區(qū)域。
第六十一頁,共七十三頁,編輯于2023年,星期一6.2存儲器專用指針如:
1)unsignedchardata*idatacpt1,*idatacpt2; 2)signedintidata*datadpt1,*datadpt2; 3)unsignedcharpdata*xdatappt; 4)signedlongxdata*lpt1,*xdatalpt2; 5)unsignedcharcode*dataccpt;
綠色關(guān)鍵字為指針?biāo)赶虻拇鎯^(qū)
藍(lán)色關(guān)鍵字為指針本身所存儲的區(qū)域第六十二頁,共七十三頁,編輯于2023年,星期一6.2存儲器專用指針
注意:
(1)要區(qū)分指針變量指向的空間區(qū)域和指針變量本身所存儲的區(qū)域;(2)定義時(shí),前者不能缺省,而后者可以缺省;(3)指針變量的長度:指向不同的區(qū)域,占用的字節(jié)數(shù)不同。
說明:指針變量本身所存儲的區(qū)域,在定義指針時(shí)一般都省略了,指針變量本身保存在缺省存儲的區(qū)域中。
定義時(shí),缺省指針存儲的區(qū)域,顯得簡單,并且對初學(xué)者更容易理解。
第六十三頁,共七十三頁,編輯于2023年,星期一6.3指針變換一、通用指針格式
由前面的討論知,通用指針由3個(gè)字節(jié)組成,第一個(gè)字節(jié)為數(shù)據(jù)的存儲區(qū)域,后兩個(gè)字節(jié)為指針地址,第一個(gè)字節(jié)的存儲區(qū)域編碼如表4-6所示。
表4-6通用指針存儲區(qū)域編碼存儲區(qū)idataxdatapdatadatacode編碼12345第六十四頁,共七十三頁,編輯于2023年,星期一6.3指針變換一、指針轉(zhuǎn)換
指針轉(zhuǎn)換有兩種途徑,一種是顯式的編程轉(zhuǎn)換,另一種是隱式的自動轉(zhuǎn)換。
指針的編程轉(zhuǎn)換:(1)通用指針的第一字節(jié),與專用指針的指向數(shù)據(jù)區(qū)屬性,二者相互轉(zhuǎn)換;(2)通用指針后兩個(gè)字節(jié)的地址,與專用指針值的轉(zhuǎn)換。
指針的隱式自動轉(zhuǎn)換:由編譯器在進(jìn)行編譯時(shí)自動完成。
第六十五頁,共七十三頁,編輯于2023年,星期一6.4C51指針應(yīng)用
指針在PC機(jī)上的C語言中應(yīng)用很廣泛。 在單片機(jī)中,由于不使用操作系統(tǒng),指針的應(yīng)用可以獨(dú)立于變量,獨(dú)立地指向所需要訪問的存儲空間位置。
本節(jié)通過例子來學(xué)習(xí)和認(rèn)識C51指針的這種獨(dú)立應(yīng)用性。 下面介紹兩種利用指針訪問存儲區(qū)的方法。也可以訪問函數(shù)。第六十六頁,共七十三頁,編輯于2023年,星期一6.4C51指針應(yīng)用二、通過指針定義的宏訪問存儲器1、訪問存儲器宏的定義用指針定義的、訪問存儲器宏的格式:#define宏名((數(shù)據(jù)類型volatile存儲區(qū)*)0)
格式中的數(shù)據(jù)類型主要為無符號的字符型數(shù)、整型;格式中的存儲區(qū)域主要使用data、idata、pdata、xdata和code類型,不使用bdata存儲區(qū)類型。
第六十七頁,共七十三頁,編輯于2023年,星期一6.4C51指針應(yīng)用格式中的關(guān)鍵字“volatile”:
“volatile”是單片機(jī)中定義的,其含義為:這種變量在程序執(zhí)行中可被隱含地改變而編譯器無法檢測到,告知編譯器不要做優(yōu)化處理,使應(yīng)用者能夠得到正確的變量值。
vol
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 股份制合作發(fā)展策略報(bào)告書
- 車展場地租賃合同
- 游戲原畫設(shè)計(jì)制作作業(yè)指導(dǎo)書
- 小企業(yè)貸款合同
- 2025年昆明貨運(yùn)駕駛從業(yè)資格考試題庫模擬考試
- 2025年中衛(wèi)貨運(yùn)上崗證模擬考試
- 2025年湖州道路貨運(yùn)駕駛員從業(yè)資格證考試題庫
- 2024-2025學(xué)年度九年級物理全冊13.2內(nèi)能教學(xué)設(shè)計(jì)2新版新人教版
- 2024年春五年級語文下冊第六單元29戰(zhàn)風(fēng)車導(dǎo)學(xué)案無答案語文S版
- 投招標(biāo)工作計(jì)劃
- GB/T 44325-2024工業(yè)循環(huán)冷卻水零排污技術(shù)規(guī)范
- 上饒創(chuàng)新發(fā)展產(chǎn)業(yè)投資集團(tuán)有限公司招聘筆試題庫2024
- 學(xué)校突發(fā)事件應(yīng)急流程
- 2024版第三方代付協(xié)議模板
- 陜西省2024年中考語文真題試卷【附答案】
- 河南省鄭州市二七區(qū)2023-2024學(xué)年七年級下學(xué)期期末考試語文試題
- 中國歷代政治得失-課件
- 課件:森林的基本概念
- 高速公路養(yǎng)護(hù)培訓(xùn)
- 2024年演出經(jīng)紀(jì)人考試必背1000題附答案(黃金題型)
- JB-T 8532-2023 脈沖噴吹類袋式除塵器
評論
0/150
提交評論