51單片機(jī)C語言編程規(guī)范_第1頁
51單片機(jī)C語言編程規(guī)范_第2頁
51單片機(jī)C語言編程規(guī)范_第3頁
51單片機(jī)C語言編程規(guī)范_第4頁
51單片機(jī)C語言編程規(guī)范_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

51單片機(jī)C語言編程規(guī)范源碼工作室學(xué)習(xí)單片機(jī)C語言的必需性跟著單片機(jī)性能的不斷提高,C語言編譯調(diào)試工具的不斷完美,以及此刻對單片機(jī)產(chǎn)品輔助功能的要求、對開發(fā)周期不斷縮短的要求,使得愈來愈多的單片機(jī)編程人員轉(zhuǎn)向使用C語言,所以有必需在單片機(jī)課程中解說“單片機(jī)C語言”。C語言編程的優(yōu)勢1.語言簡潔、緊湊,使用方便、靈巧。2.運算符豐富。3.?dāng)?shù)據(jù)結(jié)構(gòu)豐富。擁有現(xiàn)代化語言的各種數(shù)據(jù)結(jié)構(gòu)。4.可進(jìn)行結(jié)構(gòu)化程序設(shè)計。5.能夠直接對計算機(jī)硬件進(jìn)行操作。6.生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。7.可移植性好。8.簡單實現(xiàn)模塊化開發(fā)9.方便調(diào)試與保護(hù)程序C語言與匯編的差異用匯編語言編寫單片機(jī)程序時,一定要考慮其儲存器的結(jié)構(gòu),特別要考慮其片內(nèi)數(shù)據(jù)儲存器、特別功能寄存器能否正確合理的使用,以及依如實質(zhì)地址端口數(shù)據(jù)的辦理。用C51編寫程序,不像匯編語言那樣需要詳細(xì)地組織、分派儲存器資源,不過C51對數(shù)據(jù)種類和變量的定義,一定要與單片機(jī)的儲存結(jié)構(gòu)有關(guān)系,不然編譯器不可以正確地映照定位。單片機(jī)C語言與ANSI的差異用C51編寫單片機(jī)程序,與用ANSIC編寫程序的不同之處是,需要依據(jù)單片機(jī)儲存器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)種類和變量。其余的語法例定、程序結(jié)構(gòu)及程序設(shè)計方法,都與ANSIC相同。C語言的程序結(jié)構(gòu)C語言程序采用函數(shù)結(jié)構(gòu),每個C語言程序由一個或多個函數(shù)構(gòu)成,在這些函數(shù)中最少應(yīng)包含一個主函數(shù)main( ),也能夠包含一個main( )函數(shù)和若干個其余的功能函數(shù)。不論main( )函數(shù)放于哪處,程序老是從main( )函數(shù)開始執(zhí)行,執(zhí)行到main( )函數(shù)結(jié)束則結(jié)束。能夠在main( )函數(shù)中調(diào)用其余函數(shù),其余函數(shù)也能夠相互調(diào)用,但main( )函數(shù)只能調(diào)用其余的功能函數(shù),而不可以被其余的函數(shù)所調(diào)用。功能函數(shù)能夠是C語言編譯器供應(yīng)的庫函數(shù),也能夠是由用戶定義的自定義函數(shù)。在編制C程序時,程序的開始部分一般是預(yù)辦理命令、函數(shù)說明和變量定義等。C語言與89C51單片機(jī)用C語言編寫的89C51單片機(jī)應(yīng)用程序,不用像匯編語言那樣須詳細(xì)組織、分派儲存器資源和辦理端口數(shù)據(jù),但在C語言編程中,對數(shù)據(jù)種類與變量的定義,一定要與單片機(jī)的儲存結(jié)構(gòu)有關(guān)系,不然編譯器不可以正確地映照定位。C語言編寫單片機(jī)應(yīng)用程序時,需依據(jù)單片機(jī)儲存結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)種類和變量,而標(biāo)準(zhǔn)的C語言程序不需要考慮這些問題;C語言與89C51單片機(jī)C51包含的數(shù)據(jù)種類、變量儲存模式、輸入輸出辦理、函數(shù)等方面與標(biāo)準(zhǔn)的C語言有必定的差異。其余的語法例則、程序結(jié)構(gòu)及程序設(shè)計方法等與標(biāo)準(zhǔn)的C語言程序設(shè)計相同。此刻支持89C51系列單片機(jī)的C語言編譯器有好多種,如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。各種編譯器的基本狀況相同,但詳細(xì)辦理時有必定的差異,其中KEIL/Franklin以它的代碼緊湊和使用方便等特點優(yōu)于其余編譯器,此刻使用特別寬泛。本章主要以KEIL編譯器介紹89C51單片機(jī)C語言程序設(shè)計。C51程序結(jié)構(gòu)C51的語法例定、程序結(jié)構(gòu)及程序設(shè)計方法都與標(biāo)準(zhǔn)的C語言程序設(shè)計相同,但C51程序與標(biāo)準(zhǔn)的C程序在以下幾個方面不相同:(1)C51中定義的庫函數(shù)和標(biāo)準(zhǔn)C語言定義的庫函數(shù)不同。標(biāo)準(zhǔn)的C語言定義的庫函數(shù)是按通用微型計算機(jī)來定義的,而C51中的庫函數(shù)是按89C51單片機(jī)相應(yīng)狀況來定義的;(2)C51中的數(shù)據(jù)種類與標(biāo)準(zhǔn)C的數(shù)據(jù)種類也有必定的差異,在C51中還增加了幾種針對89C51單片機(jī)特有的數(shù)據(jù)種類;C51程序結(jié)構(gòu)(3)C51變量的儲存模式與標(biāo)準(zhǔn)C中變量的儲存模式不相同,C51中變量的儲存模式是與89C51單片機(jī)的儲存器密切有關(guān);(4)C51與標(biāo)準(zhǔn)C的輸入輸出辦理不相同,C51中的輸入輸出是經(jīng)過89C51串行口來達(dá)成的,輸入輸出指令執(zhí)行前一定要對串行口進(jìn)行初始化;(5)C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有必定的差異,C51中有特地的中斷函數(shù)。C51數(shù)據(jù)種類C51的數(shù)據(jù)種類分為基本數(shù)據(jù)種類和組合數(shù)據(jù)種類,狀況與標(biāo)準(zhǔn)C中的數(shù)據(jù)種類基實情同,但其中char型與short型相同,float型與double型相同,此外,C51中還有特地針對于89C51單片機(jī)的特別功能寄存器型和位種類。C51數(shù)據(jù)種類特別功能寄存器型這是C51擴(kuò)大的數(shù)據(jù)種類,用于接見89C51單片機(jī)中的特別功能寄存器數(shù)據(jù),它分sfr和sfr16兩種種類。其中:sfr為字節(jié)型特別功能寄存器種類,占一個內(nèi)存單元,利用它能夠接見89C51內(nèi)部的所有特別功能寄存器;sfr16為雙字節(jié)型特別功能寄存器種類,占用兩個字節(jié)單元,利用它能夠接見89C51內(nèi)部的所有兩個字節(jié)的特別功能寄存器。在C51中對特別功能寄存器的接見一定先用sfr或sfr16進(jìn)行申明。位種類這也是C51中擴(kuò)大的數(shù)據(jù)種類,用于接見MCS-51單片機(jī)中的可尋址的位單元。在C51中,支持兩種位種類:bit型和sbit型。它們在內(nèi)存中都只占一個二進(jìn)制位,其值能夠是“1”或“0”。其中:用bit定義的位變量在C51編譯器編譯時,在不同的時候位地址是能夠變化的,而用sbit定義的位變量一定與89C51單片機(jī)的一個能夠?qū)ぶ肺粏卧蚩晌粚ぶ返淖止?jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時,其對應(yīng)的位地址是不可變化的。位種類格式以下:sbit位變量名=位地址;如位地址為位直接地址,其取值范圍為0x00~0xff;如位地址是可位尋址變量帶位號或特別功能寄存器名帶位號,則在它前面須對可位尋址變量或特別功能寄存器進(jìn)行定義。字節(jié)地址與位號之間、特別功能寄存器與位號之間一般用“^”作間隔。位種類在C51中,為了用戶辦理方便,C51編譯器把89C51單片機(jī)的常用的特別功能寄存器和特別位進(jìn)行了定義,放在一個“reg51.h”或“reg52.h”的頭文件中,當(dāng)用戶要使用時,只須要在使用以前用一條預(yù)辦理命令#include<reg52.h>把這個頭文件包含到程序中,而后即可使用殊功能寄存器名和特別位名稱。數(shù)據(jù)變換在C51語言程序中,有可能會出此刻運算中數(shù)據(jù)種類不一致的狀況。C51贊成任何標(biāo)準(zhǔn)數(shù)據(jù)種類的隱式變換。1)自動變換變換規(guī)則是向高精度數(shù)據(jù)種類變換、向有符號數(shù)據(jù)種類變換。如字符型變量與整型變量相加時,則位變量先變換字符型或整型數(shù)據(jù),而后相加。2)強(qiáng)迫變換像ANSIC相同,經(jīng)過強(qiáng)迫種類變換的方式進(jìn)行變換。如:unsignedintb;floatc;數(shù)據(jù)變換隱式變換的優(yōu)先級次序以下:bitcharintlongfloatsignedunsigned也就是說,當(dāng)char型與int型進(jìn)行運算時,先自動對char型擴(kuò)展為int型,而后與int型進(jìn)行運算,運算結(jié)果為int型。C51除了支持隱式種類變換外,還可以夠經(jīng)過強(qiáng)迫種類變換符“()”對數(shù)據(jù)種類進(jìn)行人為的強(qiáng)迫變換。C5l編譯器除了能支持以上這些基本數(shù)據(jù)種類以外,還可以支持一些復(fù)雜的組合型數(shù)據(jù)種類,如數(shù)組種類、指針種類、結(jié)構(gòu)種類、聯(lián)合種類等這些復(fù)雜的數(shù)據(jù)種類,在后邊將接踵介紹。C51數(shù)據(jù)的儲存MCS-51單片機(jī)只有bit和unsignedchar兩種數(shù)據(jù)種類支持機(jī)器指令,而其余種類的數(shù)據(jù)都需要變換成bit或unsignedchar型進(jìn)行儲存。為了減少單片機(jī)的儲存空間和提高運行速度,要盡可能地使用unsignedchar型數(shù)據(jù)。一、位變量的儲存bit和sbit型位變量,直接存于RAM的位尋址空間,包含低128位和特別功能寄存器位。C51數(shù)據(jù)的儲存二、字符變量的儲存字符變量(char):不管是unsignedchar數(shù)據(jù)還是signedchar數(shù)據(jù),均為1個字節(jié),能夠被直接儲存在RAM中,能夠儲存在0~0x7f地區(qū),也能夠儲存在0x80~0xff地區(qū),與變量的定義有關(guān)。unsignedchar數(shù):可直接被MSC-51接受signedchar數(shù)據(jù):用補(bǔ)碼表示。需要額外的操作來測試、辦理符號位,使用的是兩種庫函數(shù),代碼量大,運算速度降低。C51數(shù)據(jù)的儲存三、整型變量的儲存整型變量(int):不管是unsignedint數(shù)據(jù)還是signedint數(shù)據(jù),均為2個字節(jié),其儲存方法是高位字節(jié)保存在低地址(在前面),低位字節(jié)保存在高地址(在后邊)。比如:整型變量的值為0x1234,在內(nèi)存中的寄存如右圖所示。signedint數(shù)據(jù)用補(bǔ)碼表示。C51數(shù)據(jù)的儲存四、長整型變量的儲存長整型變量(long)為4個字節(jié),其儲存方法與整型數(shù)據(jù)相同,是最高位字節(jié)保存的地址最低(在最前面),最低位字節(jié)保存的地址最高(在最后邊)。如長整型變量的值為0x12345678,在內(nèi)存中的寄存方法如右圖所示。不管是unsignedlong數(shù)據(jù)還是signedlong數(shù)據(jù)C51數(shù)據(jù)的儲存五、浮點型變量的儲存浮點型變量(fload)占4個字節(jié),用指數(shù)方式表示,其詳細(xì)格式與編譯器有關(guān)。對于KeilC,采用的是IEEE-754標(biāo)準(zhǔn),擁有24位精度,尾數(shù)的最高位一直為1,因此不保存。詳細(xì)分布為:1位符號位,8位階碼位,23位尾數(shù),以以下圖所示。C51數(shù)據(jù)的儲存符號位S:1表示負(fù)數(shù),0表示正數(shù)。階碼:用移碼表示。如,實質(zhì)階碼-126用1表示,實質(zhì)階碼0用127表示,即實質(zhì)階碼數(shù)加上127獲取階碼的表達(dá)數(shù)。階碼數(shù)值范圍:-126~+128。C51數(shù)據(jù)的儲存比如:浮點數(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)如右圖所示。C51變量C51變量定義的一般格式為:[儲存種類]數(shù)據(jù)種類[儲存區(qū)]變量名1[=初值][,變量名2[=初值]][,…]或[儲存種類][儲存區(qū)]數(shù)據(jù)種類變量名1[=初值][,變量名2[=初值]][,…]可見變量(非位變量)的定義由4部分構(gòu)成,即在變量定義時,指定變量4種屬性。變量儲存種類儲存種類是指變量在程序執(zhí)行過程中的作用范圍。C51變量的儲存種類有四種,分別是自動(auto),外面(extern)、靜態(tài)(static)和寄存器(register)。1.a(chǎn)uto:使用auto定義的變量稱為自動變量,其作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語句執(zhí)行時,C51才為該變量分派內(nèi)存空間,結(jié)束時占用的內(nèi)存空間開釋。自動變量一般分派在內(nèi)存的貨倉空間中。定義變量時,假如省略儲存種類,則該變量默認(rèn)為自動(auto)變量Inta;2.extern:使用extern定義的變量稱為外面變量。在一個函數(shù)體內(nèi),要使用一個已在該函數(shù)體外或其余程序中定義過的外面變量時,該變量在該函數(shù)體內(nèi)要用extern說明。外面變量被定義后分派固定的內(nèi)存空間,在程序整個執(zhí)行時間內(nèi)都有效,直到程序結(jié)束才開釋。3.static:使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外面靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對應(yīng)的函數(shù)體內(nèi)有效,向來存在,但在函數(shù)體外不可見,這樣不但使變量在定義它的函數(shù)體外被保護(hù),還可以夠?qū)崿F(xiàn)當(dāng)走開函數(shù)時價不被改變。外面靜態(tài)變量上在函數(shù)外面定義的靜態(tài)變量。它在程序中向來存在,但在定義的范圍以外是不可見的。如在多文件或多模塊辦理中,外面靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。4.register:使用register定義的變量稱為寄存器變量。它定義的變量寄存在CPU內(nèi)部的寄存器中,辦理速度快,但數(shù)目少。C51編譯器編譯時能自動辨別程序中使用頻率最高的變量,并自動將其作為寄存器變量,用戶能夠無需特地申明。五.特別功能寄存器變量89C51系列單片機(jī)片內(nèi)有很多特別功能寄存器,經(jīng)過這些特別功能寄存器能夠控制89C51系列單片機(jī)的準(zhǔn)時器、計數(shù)器、串口、I/O及其余功能零件,每一個特別功能寄存器在片內(nèi)RAM中都對應(yīng)于一個字節(jié)單元或兩個字節(jié)單元。在C51中,贊成用戶對這些特別功能寄存器進(jìn)行接見,接見時須經(jīng)過sfr或sfr16種類說明符進(jìn)行定義,定義時須指明它們所對應(yīng)的片內(nèi)RAM單元的地址。格式以下:sfr或sfr16特別功能寄存器名=地址;sfr用于對89C51單片機(jī)中單字節(jié)的特別功能寄存器進(jìn)行定義,sfr16用于對雙字節(jié)特別功能寄存器進(jìn)行定義。特別功能寄存器名一般用大寫字母表示。地址一般用直接地址形式,詳細(xì)特別功能寄存器地址見前面內(nèi)容。C51的運算符及表達(dá)式在表達(dá)式的后邊加一個分號“;”就構(gòu)成了表達(dá)式語句,如:a=++b*9;x=8;y=7;++k;能夠一行放一個表達(dá)式形成表達(dá)式語句,也能夠一行放多個表達(dá)式形成表達(dá)式語句,這時每個表達(dá)式后邊都一定帶“;”號,此外,還可以夠僅由—個分號“;”占一行形成一個表達(dá)式語句,這種語句稱為空語句。C51的運算符及表達(dá)式空語句在程序設(shè)計中平時用于兩種狀況:(1)在程序中為有關(guān)語句供應(yīng)標(biāo)號,用以標(biāo)記程序執(zhí)行的地點。比如采用下面的語句能夠構(gòu)成一個循環(huán)。repeat:;;gotorepeat;(2)在用while語句構(gòu)成的循環(huán)語句后邊加一個分號,形成一個不執(zhí)行其余操作的空循環(huán)體。這種結(jié)構(gòu)平時用于對某位進(jìn)行判斷,當(dāng)不滿足條件則等候,滿足條件則執(zhí)行。復(fù)合語句復(fù)合語句是由若干條語句組合而成的一種語句,在C51中,用一個大括號“{}”將若干條語句括在一起就形成了一個復(fù)合語句,復(fù)合語句最后不需要以分號“;”結(jié)束,但它內(nèi)部的各條語句仍需以分號“;”結(jié)束。復(fù)合語句的一般形式為:{局部變量定義;語句l;語句2;}復(fù)合語句復(fù)合語句在執(zhí)行時,其中的各條單語句挨次序挨次執(zhí)行,整個復(fù)合語句在語法上等價于一條單語句,所以在C51中能夠?qū)?fù)合語句視為一條單語句。平時復(fù)合語句出此刻函數(shù)中,實質(zhì)上,函數(shù)的執(zhí)行部分(即函數(shù)體)就是一個復(fù)合語句;復(fù)合語句中的單語句一般是可執(zhí)行語句,其余還可以夠是變量的定義語句(說明變量的數(shù)據(jù)種類)。在復(fù)合語句內(nèi)部語句所定義的變量,稱為該復(fù)合語句中的局部變量,它僅在目前這個復(fù)合語句中有效。利用復(fù)合語句將多條單語句組合在—起,以及在復(fù)合語句中進(jìn)行局部變量定義是C51語言的一個重要特點。C51程序基本結(jié)構(gòu)與有關(guān)語句C51的基本結(jié)構(gòu):一、次序結(jié)構(gòu)二、選擇結(jié)構(gòu)三、循環(huán)結(jié)構(gòu)C51的有關(guān)語句:一、ifelseSwitch/case二、whiledowhilefor三、break/continue四、return函數(shù)函數(shù)定義的一般格式以下:函數(shù)種類函數(shù)名(形式參數(shù)表)[reentrant][interruptm][usingn]形式參數(shù)說明{局部變量定義函數(shù)體}前面零件稱為函數(shù)的首部,后邊稱為函數(shù)的尾部,格式說明:1.函數(shù)種類函數(shù)種類說了然函數(shù)返回值的種類。2.函數(shù)名函數(shù)名是用戶為自定義函數(shù)取的名字以便調(diào)用函數(shù)時使用。3.形式參數(shù)表形式參數(shù)表用于列錄在主調(diào)函數(shù)與被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳達(dá)的形式參數(shù)。函數(shù)的調(diào)用與申明函數(shù)調(diào)用的一般形式以下:函數(shù)名(實參列表);對于有參數(shù)的函數(shù)調(diào)用,若實參列表包含多個實參,則各個實參之間用逗號

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論