版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C51高級(jí)語(yǔ)言程序設(shè)計(jì)單片機(jī)原理及接口技術(shù)單片機(jī)原理及接口技術(shù)目錄4.1C語(yǔ)言高級(jí)編程4.2C51對(duì)標(biāo)準(zhǔn)C語(yǔ)言的擴(kuò)展4.3C51的運(yùn)算符及表達(dá)式4.4C51函數(shù)4.5C51構(gòu)造數(shù)據(jù)類(lèi)型4.6C51庫(kù)函數(shù)4.7C51程序編寫(xiě)4.8C51語(yǔ)言與匯編語(yǔ)言接口單片機(jī)原理及接口技術(shù)概述匯編語(yǔ)言編寫(xiě)程序?qū)τ布僮鞅容^便利,編寫(xiě)的程序代碼短,但使用起來(lái)很不方便,可讀性和可移植性較差。同時(shí),匯編語(yǔ)言程序的設(shè)計(jì)周期長(zhǎng),調(diào)試和排錯(cuò)也比較困難。為了提高編程速度和應(yīng)用程序效率,改善程序的可讀性和可移植性,最好是采用高級(jí)語(yǔ)言來(lái)進(jìn)行系統(tǒng)程序設(shè)計(jì)。而C語(yǔ)言既有高級(jí)語(yǔ)言使用方便的特點(diǎn),也具有匯編語(yǔ)言直接對(duì)硬件進(jìn)行操作的特點(diǎn),因此在現(xiàn)代計(jì)算機(jī)軟件系統(tǒng)設(shè)計(jì)中,特別是在單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)過(guò)程中,往往用C語(yǔ)言來(lái)進(jìn)行程序編寫(xiě)和開(kāi)發(fā)。本章主要介紹MCS-51單片機(jī)的C語(yǔ)言語(yǔ)法和程序設(shè)計(jì),并討論C語(yǔ)言程序的結(jié)構(gòu)和編程方法。單片機(jī)原理及接口技術(shù)4.1.1C語(yǔ)言的特點(diǎn)
C語(yǔ)言于20世紀(jì)70年代初問(wèn)世,早期的C語(yǔ)言主要是用于UNIX系統(tǒng)。由于C語(yǔ)言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸被人們認(rèn)識(shí),到了20世紀(jì)80年代,C語(yǔ)言開(kāi)始進(jìn)入其它操作系統(tǒng),并很快在各類(lèi)大、中、小和微型計(jì)算機(jī)上得到廣泛的使用,并成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。與其它高級(jí)語(yǔ)言相比,C語(yǔ)言具有以下一些特點(diǎn):1.簡(jiǎn)潔性:C語(yǔ)言?xún)H有32個(gè)關(guān)鍵字和9種控制語(yǔ)句,使得程序編寫(xiě)簡(jiǎn)潔、靈活。2.運(yùn)算符豐富:C語(yǔ)言提供了34種運(yùn)算符,包括括號(hào)、賦值、強(qiáng)制類(lèi)型轉(zhuǎn)換等,使得表達(dá)式多樣化,能夠?qū)崿F(xiàn)復(fù)雜的運(yùn)算。
4.1C語(yǔ)言高級(jí)編程單片機(jī)原理及接口技術(shù)3.數(shù)據(jù)結(jié)構(gòu)多樣:C語(yǔ)言支持整型、實(shí)型、字符型、數(shù)組類(lèi)型、指針類(lèi)型等多種數(shù)據(jù)類(lèi)型,可以構(gòu)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。4.結(jié)構(gòu)化設(shè)計(jì):C語(yǔ)言擁有多種控制語(yǔ)句,支持if-else、while、do-while、switch、for等結(jié)構(gòu)化控制語(yǔ)句,程序以函數(shù)為模塊,便于進(jìn)行結(jié)構(gòu)設(shè)計(jì)。5.硬件操作:C語(yǔ)言允許直接訪問(wèn)物理地址和進(jìn)行位操作,具有匯編語(yǔ)言的大部分功能。6.高效性:C語(yǔ)言編寫(xiě)的程序生成的目標(biāo)代碼質(zhì)量高,執(zhí)行效率高,通常比匯編語(yǔ)言編寫(xiě)的程序效率低10%~30%。7.可移植性:C語(yǔ)言程序具有很好的可移植性,通常無(wú)需修改即可在不同機(jī)型和操作系統(tǒng)上運(yùn)行。單片機(jī)原理及接口技術(shù)4.1.2C語(yǔ)言與MCS-51單片機(jī)
51系列單片機(jī)支持三種高級(jí)語(yǔ)言,即PL/M,C和BASIC。C語(yǔ)言是一種通用的程序設(shè)計(jì)語(yǔ)言,其代碼率高,數(shù)據(jù)類(lèi)型及運(yùn)算符豐富,并具有良好的程序結(jié)構(gòu),適用于各種應(yīng)用的程序設(shè)計(jì),是目前使用較廣的單片機(jī)編程語(yǔ)言。MCS-51系列單片機(jī)采用的C語(yǔ)言,簡(jiǎn)稱(chēng)C51。C51符合C語(yǔ)言的ANSI標(biāo)準(zhǔn),并根據(jù)單片機(jī)的特性進(jìn)行了擴(kuò)展。C51所產(chǎn)生的目標(biāo)代碼短、運(yùn)行速度高、所需存儲(chǔ)空間小。注:1.在實(shí)際的系統(tǒng)設(shè)計(jì)中,當(dāng)設(shè)計(jì)對(duì)象只是一個(gè)小的嵌入式系統(tǒng)時(shí),匯編語(yǔ)言是一個(gè)很好的選擇,因?yàn)榇a一般都不超過(guò)8K,而且都比較簡(jiǎn)單;2.當(dāng)一個(gè)系統(tǒng)對(duì)時(shí)鐘要求很?chē)?yán)格時(shí),使用匯編語(yǔ)言成了唯一的方法。單片機(jī)原理及接口技術(shù)4.1.3C51編譯器
目前支持MCS-51單片機(jī)的C語(yǔ)言編譯器有很多種,然而并非所有的Cx51編譯器都能產(chǎn)生具有8051特點(diǎn)的有效代碼。下面就不同的編譯器做簡(jiǎn)要介紹。表4-1各個(gè)編譯器的整體特性編譯器版本編譯時(shí)間存儲(chǔ)模式編譯堆棧浮點(diǎn)支持AmericanAUTOMATION16.02.076min3sSMLNo僅大模式IAR4.05A2min3sTSCMLBYesYesAvocet1.31min47sSMLNoYesBso/Tasking1.102min25sSALYesYesIntermetrics3.322min52sSL(支持幾種動(dòng)態(tài)分配方案)NoYesMicroComputerControls1.7不能編譯所有測(cè)試程序SMLNoNoDunfieldShareware2.11不能編譯所有測(cè)試程序SL(ROM和RAM必須映像到同一地址空間)NoNoKeil3.011min28sSALYesYes單片機(jī)原理及接口技術(shù)
KeilC51標(biāo)準(zhǔn)C編譯器為8051微控制器的軟件開(kāi)發(fā)提供了C語(yǔ)言環(huán)境,同時(shí)保留了匯編代碼高效、快速的特點(diǎn)。C51編譯器的功能不斷增強(qiáng),使得使用者可以更加貼近CPU本身及其它的衍生產(chǎn)品。C51已被完全集成到μVision4的集成開(kāi)發(fā)環(huán)境中,這個(gè)集成開(kāi)發(fā)環(huán)境包含:編譯器、匯編器、實(shí)時(shí)操作系統(tǒng)、項(xiàng)目管理器和調(diào)試器。μVision4IDE可為它們提供單一而靈活的開(kāi)發(fā)環(huán)境。C51V7版本是目前最高效、靈活的8051開(kāi)發(fā)平臺(tái)。它可以支持所有8051的衍生產(chǎn)品,也可以支持所有兼容的仿真器,同時(shí)支持其它第三方開(kāi)發(fā)工具。因此,C51V7版本無(wú)疑是8051開(kāi)發(fā)用戶(hù)的最佳選擇。具有以下主要功能:1.集成開(kāi)發(fā)環(huán)境μVision42.集成功能3.C51V7版增強(qiáng)功能4.1.4Keil8051開(kāi)發(fā)工具單片機(jī)原理及接口技術(shù)
同ANSIC一樣,C51的程序由一個(gè)個(gè)函數(shù)組成,這里的函數(shù)和其他語(yǔ)言的“子程序”或“過(guò)程”具有相同的意義。
必須有一個(gè)主函數(shù)main(),程序的執(zhí)行從main()函數(shù)開(kāi)始,調(diào)用其他函數(shù)后返回主函數(shù)main(),最后在主函數(shù)中結(jié)束整個(gè)程序而不管函數(shù)的排列順序如何。
功能函數(shù)可以是C51語(yǔ)言提供的庫(kù)函數(shù),也可以是用戶(hù)自定義的函數(shù)。4.1.5C51程序結(jié)構(gòu)單片機(jī)原理及接口技術(shù)組成結(jié)構(gòu):預(yù)處理命令#include<reg51.h>函數(shù)說(shuō)明longfun1();floatfun2();變量定義intx,y;floatz;主函數(shù)main(){…fun1();/*調(diào)用功能函數(shù)1*/…fun2();/*調(diào)用功能函數(shù)2*/…}功能函數(shù)1fun1(){…}功能函數(shù)2fun2(){…}單片機(jī)原理及接口技術(shù)C語(yǔ)言的語(yǔ)句規(guī)則:
1.每個(gè)變量必須先說(shuō)明后引用,變量名英文大小寫(xiě)是有差別的。2.C語(yǔ)言程序一行可以書(shū)寫(xiě)多條語(yǔ)句,但每個(gè)語(yǔ)句必須以“;”結(jié)尾,一個(gè)語(yǔ)句也可以多行書(shū)寫(xiě)。3.C語(yǔ)言的注釋用/*……*/或//表示。4.“{”花括號(hào)必須成對(duì),位置隨意,可在緊挨函數(shù)名后,也可另起一行,多個(gè)花括號(hào)可以同行書(shū)寫(xiě),也可逐行書(shū)寫(xiě),為層次分明,增加可讀性,同一層的“{”花括號(hào)對(duì)齊,采用逐層縮進(jìn)方式書(shū)寫(xiě)。單片機(jī)原理及接口技術(shù)4.2.1存儲(chǔ)區(qū)域
51系列單片機(jī)的內(nèi)存區(qū)域被分為兩大類(lèi)。一類(lèi)是程序存儲(chǔ)區(qū),即ROM;另一類(lèi)是數(shù)據(jù)存儲(chǔ)區(qū),包括內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)和外部數(shù)據(jù)存儲(chǔ)區(qū)。內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)中又包含了51單片機(jī)的特殊功能寄存器。1數(shù)據(jù)存儲(chǔ)區(qū)
1)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)
①
data
②
idata
③
bdata
2)外部數(shù)據(jù)存儲(chǔ)區(qū)
①
xdata
②
pdata2程序存儲(chǔ)器
①
code4.2C51對(duì)標(biāo)準(zhǔn)C語(yǔ)言的擴(kuò)展單片機(jī)原理及接口技術(shù)51系列單片機(jī)的存儲(chǔ)區(qū)類(lèi)型單片機(jī)原理及接口技術(shù)4.2.2
數(shù)據(jù)類(lèi)型C51提供的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類(lèi)型的形式出現(xiàn)的,可分為基本數(shù)據(jù)類(lèi)型和組合。C51編譯器具體支持的數(shù)據(jù)類(lèi)型有無(wú)符號(hào)字符型(unsignedchar)、有符號(hào)字符型(signedchar)、無(wú)符號(hào)整型(unsignedint)、有符號(hào)整型(signedint)、無(wú)符號(hào)長(zhǎng)整型(unsignedlong)、有符號(hào)長(zhǎng)整型(signedlong)、浮點(diǎn)型(float)、雙精度型(double)和指針型等。這些數(shù)據(jù)類(lèi)型的長(zhǎng)度和值域會(huì)因處理器的類(lèi)型和C語(yǔ)言編譯程序的實(shí)現(xiàn)而有所不同,對(duì)于KeilC51產(chǎn)生的目標(biāo)文件。單片機(jī)原理及接口技術(shù)表4-2KeilC51的數(shù)據(jù)類(lèi)型類(lèi)型長(zhǎng)度/bit值域unsignedchar80~255signedchar8-128~+127unsignedint160~65535signedint16-32768~+32767unsignedlong320~4294967295signedlong32-2147483648~+2147483647float32±1.175494E-38~±3.402823E+38(6位數(shù)字)double64±1.175494E-38~±3.402823E+38(10位數(shù)字)一般指針24存儲(chǔ)空間0~65535單片機(jī)原理及接口技術(shù)C51中還有專(zhuān)門(mén)針對(duì)于MCS-51單片機(jī)的位類(lèi)型和特殊功能寄存器型。1.位類(lèi)型位類(lèi)型是C51中擴(kuò)充的數(shù)據(jù)類(lèi)型,該類(lèi)型的變量可以用于變量的定義和聲明、函數(shù)的參數(shù)傳遞和函數(shù)的返回值中。2.特殊功能寄存器型
特殊功能寄存器區(qū)SFR。SFR在程序中被用來(lái)控制定時(shí)/計(jì)數(shù)器、串口、I/O端口以及各種外設(shè)。SFR在MCS-51單片機(jī)中處于地址0x80~0xFF的位置,并可以被按照位、字節(jié)或者字的形式被訪問(wèn)。C51編譯器除了能支持以上這些基本數(shù)據(jù)類(lèi)型以外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類(lèi)型,如數(shù)組類(lèi)型、指針類(lèi)型、結(jié)構(gòu)類(lèi)型和聯(lián)合類(lèi)型等。單片機(jī)原理及接口技術(shù)4.2.3
常量和變量
C51支持的數(shù)據(jù)有常量、變量、指針。存儲(chǔ)時(shí)遵循“先高后低”原則;常量位置與定義說(shuō)明有關(guān),一般放在程序存儲(chǔ)區(qū)code。1)常量整型常量、實(shí)型常量、字符常量、字符串常量、符號(hào)常量。符號(hào)常量在使用前必須先定義,格式為:#define標(biāo)識(shí)符常量//是C51的預(yù)處理指令2)變量
定義變量的一般格式:
[存儲(chǔ)模式]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名;單片機(jī)原理及接口技術(shù)變量說(shuō)明舉例charvar;/*字符變量var,存儲(chǔ)類(lèi)型由編譯模式確定*/charcodeMSG[]=″PARAMETER:″;/*字符數(shù)組MSG[]定位在程序存貯區(qū)*/unsignedlongxdataarray[100];/*無(wú)符號(hào)長(zhǎng)型數(shù)組定位在片外RAM區(qū),每元素占4bytes*/floatidatax,y,z;/*實(shí)型變量x,y,z,定位在片內(nèi)用間址訪問(wèn)的內(nèi)部RAM區(qū)*/bitlock;/*位變量Lock,由編譯器定位*/unsignedintpdatasion;/*無(wú)符號(hào)整型變量sion定位在外部RAM*/unsignedcharxdatavector[10][4][4];/*無(wú)符號(hào)字符型三維數(shù)組,定位在片外RAM區(qū)*/sfrP0=0x80;/*定義P0口,地址為80H*/charbdataflags;/*字符變量flags定位在可位尋址內(nèi)部RAM區(qū)*/sbitflag0=flags^0;/*定義flag0為flags.0*/單片機(jī)原理及接口技術(shù)說(shuō)明:1.字符型(char)、整型(int)和長(zhǎng)整型(long)均有符號(hào)型(signed)和無(wú)符號(hào)型(unsigned)兩種,如果不是必須,盡可能選擇unsigned型,這將會(huì)使編譯器省卻符號(hào)位的檢測(cè),使生成的程序代碼比signed類(lèi)型短得多。2.程序編譯時(shí),C51編譯器會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換,當(dāng)運(yùn)算符兩邊為不同類(lèi)型的數(shù)據(jù)時(shí),編譯器先將低級(jí)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為較高級(jí)的數(shù)據(jù)類(lèi)型,運(yùn)算后,運(yùn)算結(jié)果為高級(jí)數(shù)據(jù)類(lèi)型。3.bit和sbit都是C51擴(kuò)展的變量類(lèi)型。bit用來(lái)定義一個(gè)普通位變量(0或1),編譯器在編譯過(guò)程中分配地址,除非指定否則這個(gè)地址隨機(jī)分布在整個(gè)可尋址空間中。所有的可位尋址的位都可由sbit指定,這包括可位尋址區(qū)和SFR中的位。4.如果在變量說(shuō)明時(shí)略去存貯器類(lèi)型標(biāo)志符,編譯器會(huì)自動(dòng)選擇默認(rèn)的存貯器類(lèi)型。單片機(jī)原理及接口技術(shù)4.2.4存儲(chǔ)器模式C51編譯器編譯時(shí)為了適應(yīng)不同規(guī)模的程序而選用3種存儲(chǔ)模式:1.SMALL模式SMALL模式稱(chēng)為小編譯模式,在SMALL模式下編譯時(shí),函數(shù)參數(shù)和變量放入可直接尋址的片內(nèi)存儲(chǔ)器(最大128字節(jié)),默認(rèn)存儲(chǔ)器類(lèi)型為data,訪問(wèn)十分方便。2.COMPACT模式COMPACT模式稱(chēng)為緊湊編譯模式,在COMPACT模式下編譯時(shí),函數(shù)參數(shù)和變量放入分頁(yè)片外存儲(chǔ)區(qū)(最大256字節(jié)),默認(rèn)存儲(chǔ)器類(lèi)型為pdata。3.LARGE模式LARGE模式稱(chēng)為大編譯模式,在LARGE模式下,編譯時(shí)函數(shù)參數(shù)和變量直接放入片外數(shù)據(jù)存儲(chǔ)器(最大64K字節(jié)),默認(rèn)存儲(chǔ)器類(lèi)型為xdata,使用數(shù)據(jù)指針DPTR進(jìn)行尋址。單片機(jī)原理及接口技術(shù)舉例說(shuō)明變量的存儲(chǔ)模式#pragmasmall/*變量的存儲(chǔ)模式為SMALL*/chara1;intxdatab1;#pragmaCompact/*變量的存儲(chǔ)模式為COMPACT*/chara2;intxdatab2;intfunc1(intx1,inty1)large/*函數(shù)的存儲(chǔ)模式為L(zhǎng)ARGE*/{return(x1-y1);}intfunc2(intx2,inty2)/*函數(shù)的存儲(chǔ)模式隱含為SMALL*/{return(x2+y2);}單片機(jī)原理及接口技術(shù)4.2.5
絕對(duì)地址的訪問(wèn)1.對(duì)存貯器的絕對(duì)地址訪問(wèn)利用絕對(duì)地址訪問(wèn)的頭文件absacc.h可對(duì)不同的存貯區(qū)進(jìn)行訪問(wèn)。該頭文件的函數(shù)有:
CBYTE(訪問(wèn)code區(qū)字符型)DBYTE(訪問(wèn)data區(qū)字符型)PBYTE(訪問(wèn)pdata或I/O區(qū)字符型)XBYTE(訪問(wèn)xdata或I/O區(qū)字符型)
還有CWORD、DWORD、PWORD和XWORD四個(gè)函數(shù),它們的訪問(wèn)區(qū)域同上,只是訪問(wèn)的類(lèi)型為int型。例:#include<absacc.h>#definecomXBYTE[0x07ff]那么后面程序com變量出現(xiàn)的地方,就是對(duì)地址為07ffH的外部RAM或I/O口進(jìn)行訪問(wèn)。單片機(jī)原理及接口技術(shù)2.通過(guò)指針訪問(wèn)采用指針的方法,可以在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。例4-8通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。#defineucharunsignedchar/*定義符號(hào)uchar為數(shù)據(jù)類(lèi)型符unsignedchar*/#defineuintunsignedint/*定義符號(hào)uint為數(shù)據(jù)類(lèi)型符unsignedint*/voidfunc(void){uchardatavar1;/*變量var1為unsignedchar*/ucharpdata*p1;/*指針p1指向pdata區(qū)*/ucharxdata*p2;/*指針p2指向xdata區(qū)*/uintxdata*p3;/*指針p3指向xdata區(qū)*/單片機(jī)原理及接口技術(shù)
p1=0x40;/*p1指針賦值,指向pdata區(qū)的40H單元*/*p1=0x4f;/*將數(shù)據(jù)0x4f送到片外RAM的40H單元*/p2=&var1;/*p2指針指向data區(qū)的var1變量*/*p2=0x50;/*給變量var1賦值0x50*/p3=0x2000;/*p3指針賦值,指向xdata區(qū)的2000H單元*/*p3=0x1122;/*將數(shù)據(jù)0x1122送到片外RAM的2000H單元*/}單片機(jī)原理及接口技術(shù)3.使用C51擴(kuò)展關(guān)鍵字_at_定義變量時(shí),使用_at_關(guān)鍵詞指定變量的絕對(duì)地址,格式為:
[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型變量名_at_絕對(duì)地址;例:dataunsignedcharx1_at_0x40;//在data區(qū)定義字節(jié)變量x1,它的地址為40Hxdataunsignedintx2_at_0x2000;//在xdata區(qū)定義字變量x2,它的地址為2000Hvoidmain(void){x1=0xff;x2=0x1234;}單片機(jī)原理及接口技術(shù)4.3C51的運(yùn)算符及表達(dá)式
C51有很強(qiáng)的數(shù)據(jù)處理能力,具有十分豐富的運(yùn)算符,利用這些運(yùn)算符可以組成各種表達(dá)式及語(yǔ)句。在C51中有3大運(yùn)算符:算術(shù)運(yùn)算符、關(guān)系與邏輯運(yùn)算符、以及位操作運(yùn)算符。另外還有一些特殊的運(yùn)算符。單片機(jī)原理及接口技術(shù)4.3.1算術(shù)運(yùn)算符表4-5C51中支持的算術(shù)運(yùn)算符運(yùn)算符作用+加或取正值-減或取負(fù)值*乘/除%取余數(shù)++自增--自減單片機(jī)原理及接口技術(shù)4.3.2關(guān)系和邏輯運(yùn)算符表4-6關(guān)系和邏輯運(yùn)算符運(yùn)算符作用>
大于>=大于等于<
小于<=小于等于==等于!=不等于&&與||或!非單片機(jī)原理及接口技術(shù)4.3.3位運(yùn)算符
位運(yùn)算是對(duì)字節(jié)或字中的位(bit)進(jìn)行測(cè)試或移位處理,但并不改變參與運(yùn)算的變量的值。如果要求按位改變變量的值,則要利用相應(yīng)的賦值運(yùn)算。C51中位運(yùn)算符只能對(duì)整數(shù)進(jìn)行操作,不能對(duì)float、double、longdouble、void或其它復(fù)雜數(shù)據(jù)類(lèi)型進(jìn)行操作。C51中的位運(yùn)算符如表4-7所示。表4-7位運(yùn)算符單片機(jī)原理及接口技術(shù)4.3.4逗號(hào)運(yùn)算符
在C51語(yǔ)言中,逗號(hào)“,”是一個(gè)特殊的運(yùn)算符,可以用它將兩個(gè)或兩個(gè)以上的表達(dá)式連接起來(lái),稱(chēng)為逗號(hào)表達(dá)式。
逗號(hào)運(yùn)算符的左側(cè)總是作為void(無(wú)值),這意味著其右邊表達(dá)式的值變?yōu)橐远禾?hào)分開(kāi)的整個(gè)表達(dá)式的值。例如:y=(x=2,5x)的運(yùn)算結(jié)果是y的值為10。1.賦值運(yùn)算符:=
將“=”的右邊的值賦值給左邊的變量。2.復(fù)合運(yùn)算符:
4.3.5賦值運(yùn)算符單片機(jī)原理及接口技術(shù)表4-8復(fù)合賦值運(yùn)算符運(yùn)算符作用+=加法賦值-=減法賦值*=乘法賦值/=除法賦值%=取模賦值&=邏輯與賦值︱=邏輯或賦值^=邏輯異或賦值~=邏輯非賦值>>=右移位賦值<<=左移位賦值單片機(jī)原理及接口技術(shù)4.3.6條件運(yùn)算符C51語(yǔ)言提供了一個(gè)代替某些“if…else”語(yǔ)句的條件運(yùn)算符(?
,該運(yùn)算符是唯一的一個(gè)三目運(yùn)算符。其功能是先計(jì)算關(guān)系表達(dá)式關(guān)系表達(dá)式?表達(dá)式1:表達(dá)式2的值,當(dāng)關(guān)系表達(dá)式的值為T(mén)rue(非0值)時(shí),計(jì)算表達(dá)式1的值,并將結(jié)果作為整個(gè)表達(dá)式的值;當(dāng)邏輯表達(dá)式的值為Flase(0值)時(shí),計(jì)算表達(dá)式2的值,并將結(jié)果作為整個(gè)表達(dá)式的值。
例如:max=(a>b)?a:b;
表達(dá)式中若a>b,max=a;若a<b,max=b。即max是a和b中較大的數(shù)。如果用if…else語(yǔ)句改寫(xiě),則有:if(a>b)max=a;elsemax=b;單片機(jī)原理及接口技術(shù)4.4C51函數(shù)
在程序設(shè)計(jì)過(guò)程中,對(duì)于較大的程序一般采用模塊化結(jié)構(gòu)。通常將一個(gè)較大的程序分成若干個(gè)程序模塊,每個(gè)模塊包括子程序,實(shí)現(xiàn)一個(gè)特定的功能。在C51語(yǔ)言中,子程序模塊是由函數(shù)來(lái)實(shí)現(xiàn)的。C51語(yǔ)言的程序是由一個(gè)主函數(shù)和若干個(gè)子函數(shù)組成的,每個(gè)子函數(shù)完成一定的功能,由主函數(shù)(main())根據(jù)需要來(lái)調(diào)用。子函數(shù)可以被主函數(shù)調(diào)用,也可以被其它子函數(shù)或其本身調(diào)用形成子程序嵌套,但主函數(shù)不能被調(diào)用。當(dāng)被調(diào)用函數(shù)執(zhí)行完畢后,就發(fā)出返回(return)指令,恢復(fù)原來(lái)程序流的執(zhí)行。程序執(zhí)行時(shí)從主函數(shù)開(kāi)始,到主函數(shù)最后一條語(yǔ)句結(jié)束。單片機(jī)原理及接口技術(shù)1.函數(shù)的分類(lèi)從用戶(hù)使用角度劃分,函數(shù)分為庫(kù)函數(shù)和用戶(hù)自定義函數(shù)
庫(kù)函數(shù)是編譯系統(tǒng)為用戶(hù)設(shè)計(jì)的一系列標(biāo)準(zhǔn)函數(shù),用戶(hù)只需調(diào)用,而無(wú)需自己去編寫(xiě)這些復(fù)雜的函數(shù),如前面所用到的頭文件reg51.h等,有的頭文件中包括一系列函數(shù),要使用其中的函數(shù)必須先使用#include包含語(yǔ)句,然后才能調(diào)用。用戶(hù)自定義函數(shù)是用戶(hù)根據(jù)任務(wù)編寫(xiě)的函數(shù)。從參數(shù)形式上函數(shù)分為無(wú)參函數(shù)和有參函數(shù)。
有參函數(shù)即是在調(diào)用時(shí),調(diào)用函數(shù)用實(shí)際參數(shù)代替形式參數(shù),調(diào)用完返回結(jié)果給調(diào)用函數(shù)。
4.4C51函數(shù)單片機(jī)原理及接口技術(shù)2.函數(shù)的定義用C51進(jìn)行程序設(shè)計(jì)的過(guò)程中,既可以用系統(tǒng)提供的標(biāo)準(zhǔn)庫(kù)函數(shù),也可以使用用戶(hù)自己定義的函數(shù)。對(duì)于系統(tǒng)提供的標(biāo)準(zhǔn)庫(kù)函數(shù),用戶(hù)使用時(shí)通過(guò)預(yù)處理器命令#include可將對(duì)應(yīng)的標(biāo)準(zhǔn)函數(shù)庫(kù)包含到程序中;而對(duì)于用戶(hù)自定義的函數(shù),在使用之前必須對(duì)其進(jìn)行定義,只有定義之后才能被調(diào)用。函數(shù)定義的一般格式如下:[存儲(chǔ)類(lèi)說(shuō)明符]函數(shù)類(lèi)型函數(shù)標(biāo)識(shí)符(形式參數(shù)表)[reentrant][interruptm][usingn][存儲(chǔ)模式]形式參數(shù)說(shuō)明{
函數(shù)體;}其中函數(shù)體是能夠完成一定功能的語(yǔ)句,由用戶(hù)自己編寫(xiě)。單片機(jī)原理及接口技術(shù)(1)存儲(chǔ)類(lèi)說(shuō)明符:存儲(chǔ)類(lèi)說(shuō)明符有兩類(lèi):extern和static。(2)函數(shù)類(lèi)型函數(shù)類(lèi)型是用來(lái)說(shuō)明函數(shù)返回值的類(lèi)型。有簡(jiǎn)單類(lèi)型(char、unsignedchar、int、unsignedint、long、unsignedlong、float和bit)、復(fù)合類(lèi)型(struct和union)和無(wú)類(lèi)型(void)。(3)函數(shù)標(biāo)識(shí)符函數(shù)標(biāo)識(shí)符即函數(shù)名,是用戶(hù)為自定義函數(shù)所取的名字,以便調(diào)用函數(shù)時(shí)使用。(4)形式參數(shù)表形式參數(shù)表用于列舉在主調(diào)函數(shù)與被調(diào)函數(shù)之間進(jìn)行數(shù)據(jù)傳遞的形式參數(shù)。(5)reentrant修飾符在C51語(yǔ)言中,利用這個(gè)修飾符把函數(shù)定義為可重入函數(shù)。單片機(jī)原理及接口技術(shù)(6)interruptm修飾符為了在C51源程序中直接編寫(xiě)中斷服務(wù)程序,C51編譯器對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt。關(guān)鍵字interrupt是函數(shù)定義時(shí)的一個(gè)選項(xiàng),加上這個(gè)選項(xiàng)才可以將一個(gè)函數(shù)定義為中斷服務(wù)函數(shù)。51單片機(jī)的中斷源編號(hào)單片機(jī)原理及接口技術(shù)中斷函數(shù)的定義格式:void
函數(shù)名(void)
interruptn[usingm]1)interruptn:說(shuō)明函數(shù)是中斷類(lèi)型n的中斷服務(wù)子程序C51編譯器支持32個(gè)中斷函數(shù),中斷類(lèi)型號(hào)為0~31。函數(shù)定義為中斷函數(shù)后,編譯器會(huì)在對(duì)應(yīng)的中斷服務(wù)程序入口處,生成LJMP指令,直接跳到中斷函數(shù)。中斷函數(shù)不能帶參數(shù),不能定義函數(shù)返回值,且程序不能直接調(diào)用中斷函數(shù)。編譯器會(huì)自動(dòng)為中斷函數(shù)添加保護(hù)現(xiàn)場(chǎng)的代碼,進(jìn)入函數(shù)后,壓棧保護(hù)函數(shù)中使用了的ACC、B、DPTR、PSW寄存器的值,返回前出?;謴?fù)。單片機(jī)原理及接口技術(shù)2)usingm:指定函數(shù)使用第m個(gè)寄存器組,m可以為0、1、2、3,代表4個(gè)不同的工作寄存器組。定義函數(shù)時(shí)可省略u(píng)singm選項(xiàng),此時(shí)編譯器自動(dòng)選擇一個(gè)寄存器組作絕對(duì)寄存器組訪問(wèn);如定義則小心使用,要保證任何寄存器組的切換都只在控制的區(qū)域內(nèi)發(fā)生,否則產(chǎn)生不正確的函數(shù)結(jié)果。在函數(shù)的入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;函數(shù)退出之前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)。(8)存儲(chǔ)模式為了提高程序的效率和靈活性,C51允許采用混合存儲(chǔ)模式。若指定固定的存儲(chǔ)模式后,它將不再隨編譯模式而變。單片機(jī)原理及接口技術(shù)3.函數(shù)的調(diào)用函數(shù)調(diào)用的形式為:函數(shù)名(實(shí)際參數(shù)表);實(shí)參和形參必須在數(shù)目、類(lèi)型及順序上嚴(yán)格保持一致,對(duì)于無(wú)參函數(shù)不存在實(shí)際參數(shù)表。函數(shù)的調(diào)用方式有三種:
①函數(shù)調(diào)用語(yǔ)句:即把被調(diào)函數(shù)名作為調(diào)用函數(shù)的一個(gè)語(yǔ)句,如fun1();。②被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對(duì)象,如result=2*get(a,b);此時(shí)get函數(shù)中的a,b應(yīng)為實(shí)參,其以返回值參與式中的運(yùn)算。③被調(diào)函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)如m=max(a,get(a,b));函數(shù)get(a,b)作為函數(shù)max()的一個(gè)實(shí)際參數(shù)。單片機(jī)原理及接口技術(shù)3.函數(shù)的調(diào)用注:1)如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,在主調(diào)函數(shù)前應(yīng)對(duì)被調(diào)函數(shù)進(jìn)行說(shuō)明,形式為:
返回值類(lèi)型被調(diào)函數(shù)名(形式參數(shù)表);
2)如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,可以不對(duì)被調(diào)函數(shù)說(shuō)明。下面以一個(gè)簡(jiǎn)單例子來(lái)說(shuō)明:intfun1(a,b)inta,b;
{
intc;c=a+b;return(c);
}main(){intd,u=3,v=2;d=2*fun1(u,v);}
上例被調(diào)函數(shù)在主調(diào)函數(shù)前,不用說(shuō)明。單片機(jī)原理及接口技術(shù)intfun1(a,b);main(){
intd,u=3,v=2;d=2*fun1(u,v);}
intfun1(a,b);
inta,b;{intc;
c=a+b;return(c);}上例中被調(diào)函數(shù)在主調(diào)函數(shù)后,在前面對(duì)被調(diào)函數(shù)進(jìn)行說(shuō)明。單片機(jī)原理及接口技術(shù)4.函數(shù)的嵌套與遞歸(1)函數(shù)的嵌套在C51語(yǔ)言中,函數(shù)的定義是相互平行、獨(dú)立的。即在函數(shù)定義時(shí),一個(gè)函數(shù)體內(nèi)不能包含另一個(gè)函數(shù)。但是在一個(gè)函數(shù)的調(diào)用過(guò)程中可以調(diào)用另一個(gè)函數(shù),即可以嵌套調(diào)用函數(shù)。C51編譯器通常依靠堆棧來(lái)進(jìn)行參數(shù)傳遞,但由于C51的堆棧設(shè)在片內(nèi)RAM中,而片內(nèi)RAM的空間有限,因而嵌套的深度一般在5-10層以?xún)?nèi)。(2)函數(shù)的遞歸調(diào)用如果在調(diào)用一個(gè)函數(shù)過(guò)程中出現(xiàn)了直接或間接調(diào)用該函數(shù)本身,則稱(chēng)為函數(shù)的遞歸調(diào)用。遞歸調(diào)用是嵌套調(diào)用的一個(gè)特殊情況。在函數(shù)的遞歸調(diào)用中要避免出現(xiàn)無(wú)終止的自身調(diào)用,應(yīng)通過(guò)控制條件,使得遞歸的次數(shù)有限。單片機(jī)原理及接口技術(shù)例4-19函數(shù)的嵌套調(diào)用。#include<reg51.h>/*包含特殊功能寄存器庫(kù)函數(shù)*/#include<stdio.h>/*包含I/O函數(shù)庫(kù)函數(shù)*/externserial_ini();intmin(inta,intb){intc;c=a<b?a:b;/*求最小值*/return(c);}intadd(intj,intk,intm,intn){intres;res=min(j,k)+min(m,n);/*調(diào)用函數(shù)min()*/return(res);}main(){intfinal;serial_ini();final=add(2,15,5,7);/*調(diào)用函數(shù)add()*/printf("%d",final);}單片機(jī)原理及接口技術(shù)
4.5.1數(shù)組和指針1.數(shù)組數(shù)組是一個(gè)由若干同類(lèi)型變量組成的集合,數(shù)組中的各個(gè)元素可以用數(shù)組名和下標(biāo)來(lái)唯一確定。數(shù)組在使用之前必須先對(duì)其進(jìn)行定義。根據(jù)數(shù)組中存放的數(shù)據(jù)可分為整型數(shù)組、字符數(shù)組等。不同的數(shù)組在定義、使用上基本相同,根據(jù)下標(biāo)維數(shù)的不同可以分為一維數(shù)組、二維數(shù)組和多維數(shù)組。2.指針指針是C語(yǔ)言中的精華。指針類(lèi)型數(shù)據(jù)在C語(yǔ)言程序中使用非常廣泛,正確使用指針類(lèi)型數(shù)據(jù),可以方便有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),動(dòng)態(tài)地分配存儲(chǔ)器空間,直接處理內(nèi)存地址。4.5C51構(gòu)造數(shù)據(jù)類(lèi)型
單片機(jī)原理及接口技術(shù)1.數(shù)組(1)一維數(shù)組一維數(shù)組只有一個(gè)下標(biāo),定義的一般形式如下:
數(shù)據(jù)類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式]1)“數(shù)據(jù)類(lèi)型說(shuō)明符”是任一種基本數(shù)據(jù)類(lèi)型或構(gòu)造數(shù)據(jù)類(lèi)型。2)“數(shù)組名”是用戶(hù)定義的數(shù)組標(biāo)識(shí)符,它的取名方法與變量的取名方法相同。3)“常量表達(dá)式”用于說(shuō)明該數(shù)組的長(zhǎng)度,即該數(shù)組元素的個(gè)數(shù)。要求取值為整型常量,必須用方括號(hào)“[]”括起來(lái)。單片機(jī)原理及接口技術(shù)(2)二維數(shù)組二維數(shù)組有兩個(gè)下標(biāo),定義的一般形式如下:
數(shù)據(jù)類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]如:unsignedinta[3][4];定義了一個(gè)三行4列的數(shù)組,數(shù)組名為a,該數(shù)組的下標(biāo)共有3×4個(gè),即:a[0][0];a[0][1];a[0][2];a[0][3];a[1][0];a[1][1];a[1][2];a[1][3];a[2][0];a[2][1];a[2][2];a[2][3];單片機(jī)原理及接口技術(shù)(3)數(shù)組的賦值1)數(shù)組元素逐個(gè)賦值如:x[0]=0;x[1]=x;…;x[9]=9;2)數(shù)組初始化賦值數(shù)組初始化賦值是指在數(shù)組說(shuō)明時(shí)給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的,從而減少運(yùn)行時(shí)間,提高效率。例如:intx[10]={0,1,2,3,4,5,6,7,8,9};3)動(dòng)態(tài)賦值動(dòng)態(tài)賦值是在程序執(zhí)行過(guò)程中對(duì)數(shù)組賦值。如例4-20中是用循環(huán)語(yǔ)句配合scanf函數(shù)逐個(gè)對(duì)數(shù)組元素賦值。4)二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。單片機(jī)原理及接口技術(shù)
2.指針(1)指針變量的定義指針變量使用之前必須對(duì)它進(jìn)行定義,定義格式與一般變量的定義類(lèi)似,一般形式為
數(shù)據(jù)類(lèi)型說(shuō)明符[存儲(chǔ)器類(lèi)型]*指針變量名;數(shù)據(jù)類(lèi)型說(shuō)明符說(shuō)明了該指針變量所指向的變量類(lèi)型。(2)指針變量的引用指針變量是存放另一變量地址的特殊變量,指針變量只能存放地址。指針變量在使用時(shí)應(yīng)注意兩個(gè)運(yùn)算符:“&”和“*”。其中,“&”是取地址運(yùn)算符,“*”是指針運(yùn)算符或稱(chēng)“間接訪問(wèn)”運(yùn)算符。單片機(jī)原理及接口技術(shù)匯編語(yǔ)言和C語(yǔ)言的對(duì)照表注:上表省略了匯編語(yǔ)言程序中對(duì)符號(hào)地址n和m用EQU偽指令進(jìn)行具體地址定義的語(yǔ)句以及C語(yǔ)言對(duì)變量n、m和指針變量P進(jìn)行類(lèi)型定義的語(yǔ)句,實(shí)際程序設(shè)計(jì)中,此步是不可缺少的。表中&為取地址運(yùn)算符,*為取內(nèi)容運(yùn)算符。單片機(jī)原理及接口技術(shù)說(shuō)明:1)在C語(yǔ)言中,為了能夠?qū)崿F(xiàn)直接對(duì)內(nèi)存單元進(jìn)行操作,引入了指針類(lèi)型的數(shù)據(jù)。一個(gè)變量的地址就稱(chēng)為該變量的指針。2)如果有一個(gè)變量專(zhuān)門(mén)用來(lái)存放另一個(gè)變量的地址,則稱(chēng)之為指針變量。一個(gè)指針變量存放的內(nèi)容是另一個(gè)變量在內(nèi)存中的地址,每一個(gè)變量都有它自己的指針(地址)。3)C語(yǔ)言中用“*”表示“指向”。如:整型變量i的地址存放在指針變量ip中,則
i=0x50;*ip=0x50;都是給同一個(gè)變量賦值。4)區(qū)分“&”和“*”運(yùn)算符。單片機(jī)原理及接口技術(shù)2.指針型數(shù)據(jù)的類(lèi)型由于C51是結(jié)合51單片機(jī)硬件的,51單片機(jī)的不同存貯空間,有不同的地址范圍,即使對(duì)于同一外部數(shù)據(jù)存貯器,又有用@Ri尋址(Ri為八位)和用@DPTR尋址(DPTR為十六位)兩種尋址方式,而指針本身也是一個(gè)變量,有它存放的存貯區(qū)和數(shù)據(jù)長(zhǎng)度。因此,在指針類(lèi)型的定義中要說(shuō)明:被指的變量的數(shù)據(jù)類(lèi)型和存貯類(lèi)型;指針變量本身的數(shù)據(jù)類(lèi)型(占幾個(gè)字節(jié))和存貯類(lèi)型(即指針本身存放在什么存貯區(qū))。指針類(lèi)型的數(shù)據(jù)定義形式如下:數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型1]*[存儲(chǔ)器類(lèi)型2]標(biāo)識(shí)符;單片機(jī)原理及接口技術(shù)
C51各類(lèi)指針類(lèi)型和其占用字節(jié)大小指針類(lèi)型(存儲(chǔ)器類(lèi)型1)大小通用指針3BytesXDATA指針2BytesCODE指針2BytesIDATA指針1ByteDATA指針1BytePDATA指針1Byte單片機(jī)原理及接口技術(shù)指向不同存儲(chǔ)區(qū)變量的通用指針指針能適用于指向任何存貯空間,此時(shí)指針長(zhǎng)度為3字節(jié),第一字節(jié)表示存貯器類(lèi)型編碼,第二、三字節(jié)分別表示所指地址的高位和低位。unsignedchar*ptr;//通用指針ptr,指針存放在默認(rèn)存儲(chǔ)區(qū)unsignedchar*idataiptr;//通用指針iptr,指針存放在idata存儲(chǔ)區(qū)指向固定存儲(chǔ)區(qū)變量的指針定義為data或idata,表示指針指向內(nèi)部數(shù)據(jù)存貯器;定義為pdata,表示指針指向外部數(shù)據(jù)存貯器,用@Ri間址。以上均為八位地址;定義為類(lèi)型code/xdata,表示指針指向外部程序存貯器或外部數(shù)據(jù)存貯器指針,本身(即被指示地址)應(yīng)為十六位長(zhǎng)度。
intcode*ptr;//指向code存儲(chǔ)區(qū)的指針ptr,指針存放在默認(rèn)存儲(chǔ)區(qū)intidata*pdataiptr;//指向idata存儲(chǔ)區(qū)的指針ptr,指針存放在pdata存儲(chǔ)區(qū)單片機(jī)原理及接口技術(shù)指針變量說(shuō)明:longxdata*px;/*指針px指向xdata區(qū)的long型(每個(gè)數(shù)據(jù)占四個(gè)單元)變量,
指針自身在編譯模式默認(rèn)的存貯區(qū),指針長(zhǎng)度為2個(gè)字節(jié)*/charxdata*datapd;/*指針pd指向xdata區(qū)的字符型變量,自身在data區(qū),指針
長(zhǎng)度為2個(gè)字節(jié)*/datacharxdata*pd;/*與上例等效*/dataint*pn;(和int*datapn及int*pn等效)/*定義一個(gè)類(lèi)型為int型的通用型
指針,指針自身在data區(qū),長(zhǎng)度為3字節(jié)*/單片機(jī)原理及接口技術(shù)在上例的指針聲明中包含如下幾個(gè)內(nèi)容:1)指針變量名(如px)前面冠以“*”,表示px為指針型變量,此處*不帶取內(nèi)容之意。2)指針指向的存貯類(lèi)型,即指向哪個(gè)存貯區(qū),它決定了指針本身的長(zhǎng)度(見(jiàn)數(shù)據(jù)類(lèi)型表)。存貯類(lèi)型聲明的位置在數(shù)據(jù)類(lèi)型和指針名(如*px)之間,如無(wú)此項(xiàng)聲明,則此指針型變量為通用型。3)指針指向的存貯區(qū)的數(shù)據(jù)類(lèi)型,即被指向的存貯區(qū)以多少個(gè)單元作一個(gè)數(shù)據(jù)單位,當(dāng)程序通過(guò)指針對(duì)該區(qū)操作時(shí),將按此規(guī)定的單元個(gè)數(shù)的內(nèi)容作為一個(gè)數(shù)據(jù)操作。4)指針變量自身的存貯類(lèi)型,即指針處于什么區(qū)與自身的長(zhǎng)度無(wú)關(guān),該聲明可位于聲明語(yǔ)句的開(kāi)頭,也可在“*”和變量名之間。此項(xiàng)由編譯模式放在默認(rèn)區(qū),如無(wú)規(guī)定編譯模式,通常在data區(qū)。單片機(jī)原理及接口技術(shù)4.5.2結(jié)構(gòu)、共同體和枚舉1.結(jié)構(gòu)(1)結(jié)構(gòu)與結(jié)構(gòu)變量1)先定義結(jié)構(gòu)類(lèi)型再定義結(jié)構(gòu)變量。定義一個(gè)結(jié)構(gòu)類(lèi)型的一般形式為struct結(jié)構(gòu)名{結(jié)構(gòu)元素表};定義一個(gè)結(jié)構(gòu)變量的一般形式為:
struct結(jié)構(gòu)名變量名1,變量名2,…;其中,“結(jié)構(gòu)元素表”為結(jié)構(gòu)中的結(jié)構(gòu)成員,它可以由不同的數(shù)據(jù)類(lèi)型組成。定義時(shí)需指明各個(gè)成員的數(shù)據(jù)類(lèi)型。單片機(jī)原理及接口技術(shù)例定義一個(gè)結(jié)構(gòu)名為data結(jié)構(gòu)類(lèi)型:structdata{intyear;intmonth;intday;};它由year、month和day3個(gè)成員組成,這三個(gè)結(jié)構(gòu)成員的數(shù)據(jù)類(lèi)型都是整型(int),當(dāng)然也可以根據(jù)實(shí)際需要選用各種不同類(lèi)型的變量作為結(jié)構(gòu)成員,將month和day的數(shù)據(jù)類(lèi)型定義為字符型(char)。若結(jié)構(gòu)變量為data1和data2,定義如下:structdatadata1,data2;單片機(jī)原理及接口技術(shù)2)定義結(jié)構(gòu)類(lèi)型的同時(shí)定義結(jié)構(gòu)變量。一般形式為struct結(jié)構(gòu)名{結(jié)構(gòu)元素表}變量名1,變量名2,……變量名n;3)使用typedef別名來(lái)定義結(jié)構(gòu)類(lèi)型變量先用typedef為結(jié)構(gòu)起一個(gè)別名,然后用別名定義該結(jié)構(gòu)類(lèi)型變量。一般形式為typedefstruct結(jié)構(gòu)名{結(jié)構(gòu)元素表}類(lèi)型別名類(lèi)型別名變量名1,變量名2,……變量名n;/*定義結(jié)構(gòu)變量名*/其中類(lèi)型別名習(xí)慣于用大寫(xiě)。單片機(jī)原理及接口技術(shù)(2)結(jié)構(gòu)變量的引用一般情況下,結(jié)構(gòu)變量的引用是通過(guò)對(duì)其結(jié)構(gòu)元素的引用來(lái)實(shí)現(xiàn)的,結(jié)構(gòu)元素引用的一般格式如下:
結(jié)構(gòu)變量名.結(jié)構(gòu)元素名或結(jié)構(gòu)變量名->結(jié)構(gòu)元素名其中,“.”和“->”是結(jié)構(gòu)的成員運(yùn)算符。例如:data1.year表示結(jié)構(gòu)變量data1中的元素year,data2.month表示結(jié)構(gòu)變量data2中的元素month。單片機(jī)原理及接口技術(shù)2.結(jié)構(gòu)數(shù)組C51允許將具有相同結(jié)構(gòu)類(lèi)型的變量定義為結(jié)構(gòu)數(shù)組,結(jié)構(gòu)數(shù)組與一般變量數(shù)組的不同在于結(jié)構(gòu)數(shù)組的每一個(gè)元素都具有同一個(gè)結(jié)構(gòu)類(lèi)型的變量,它們具有同一個(gè)結(jié)構(gòu)類(lèi)型,含有相同的成員項(xiàng)。例4-26結(jié)構(gòu)數(shù)組的定義和引用structdocument{unsignedintnumber;unsignedintage;bitsex;};/*定義document的結(jié)構(gòu)類(lèi)型*/structdocumentstudent[20];/*定義20個(gè)數(shù)組元素的結(jié)構(gòu)數(shù)組student,每個(gè)數(shù)組元素都是document結(jié)構(gòu)
類(lèi)型*/student[5].age=18;/*對(duì)結(jié)構(gòu)數(shù)組成員進(jìn)行賦值*/單片機(jī)原理及接口技術(shù)3.共同體
結(jié)構(gòu)能夠把不同類(lèi)型的數(shù)據(jù)組合在一起使用。結(jié)構(gòu)中定義的各個(gè)變量在內(nèi)存中占用不同的內(nèi)存單元,在位置上是分開(kāi)的,彼此不互相重疊。在C51語(yǔ)言中,還提供一種數(shù)據(jù)類(lèi)型,使不同類(lèi)型的數(shù)據(jù)共同使用一塊內(nèi)存空間,空間的大小以最長(zhǎng)的類(lèi)型為主,這就是共同體數(shù)據(jù)類(lèi)型,也稱(chēng)作聯(lián)合類(lèi)型(union)。4.枚舉枚舉數(shù)據(jù)類(lèi)型是一個(gè)有名字的某些整型常量的集合。這些整型常量是該類(lèi)型變量可取的所有合法值。枚舉定義時(shí)應(yīng)當(dāng)列出該類(lèi)型變量的所有可取值。枚舉定義的格式與結(jié)構(gòu)和共同體基本類(lèi)似,只是關(guān)鍵字變?yōu)閑num。單片機(jī)原理及接口技術(shù)4.6C51庫(kù)函數(shù)庫(kù)函數(shù)是編譯系統(tǒng)為用戶(hù)設(shè)計(jì)的一系列標(biāo)準(zhǔn)函數(shù),用戶(hù)只需調(diào)用,而無(wú)需自己去編寫(xiě)這些復(fù)雜的函數(shù),如前面所用到的頭文件reg51.h、absacc.h等,有的頭文件中包括一系列函數(shù),要使用其中的函數(shù)必須先使用#include包含語(yǔ)句,然后才能調(diào)用。內(nèi)部庫(kù)函數(shù)
#include<intrins.h>_crol_,_cror_:將char型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回
_iror_,_irol_:將int型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回_lrol_,_lror_:將long型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回
_nop_:相當(dāng)于插入NOP_testbit_:相當(dāng)于JBCbitvar測(cè)試該位變量并跳轉(zhuǎn)同時(shí)清除單片機(jī)原理及接口技術(shù)2.直接訪問(wèn)存儲(chǔ)區(qū)的頭文件#include<absacc.h>”
可以直接訪問(wèn)指定地址的存儲(chǔ)區(qū)單元CBYTE、CWORD:直接訪問(wèn)程序存儲(chǔ)區(qū);DBYTE、DWORD:訪問(wèn)內(nèi)部數(shù)據(jù)區(qū);PBYTE、PWORD:訪問(wèn)外部數(shù)據(jù)區(qū)當(dāng)前頁(yè);XBYTE、XWORD:訪問(wèn)外部數(shù)據(jù)區(qū)。例:rval=CBYTE[0x0002];//指向程序存貯器的0002H地址rval=XWORD[0x0002];//指向外RAM的0004H地址單片機(jī)原理及接口技術(shù)3.數(shù)學(xué)函數(shù)#include<math.h>包含常用的算術(shù)運(yùn)算函數(shù)sin:sin函數(shù)cos:cos函數(shù)abs:求絕對(duì)值exp、log、sqrt、tan、pow:xy4.緩沖區(qū)處理函數(shù)#include<string.h>包括搜索、比較、拷貝、移動(dòng)等函數(shù)memchr;memcmp;memcpy;memmove;strcat;strchr;strcmp;strcpy5.字符轉(zhuǎn)換與字符分類(lèi)#include<ctype.h>isxdigit:判斷字符是否是16進(jìn)制數(shù)字字符
islower:是否是小寫(xiě)isupper:是否是大寫(xiě)
tolower:字符轉(zhuǎn)換成小寫(xiě)字符toupper:字符轉(zhuǎn)換成大寫(xiě)字符單片機(jī)原理及接口技術(shù)4.7C51程序編寫(xiě)1.順序結(jié)構(gòu)順序結(jié)構(gòu)是最基本、最簡(jiǎn)單的程序結(jié)構(gòu)。在這種結(jié)構(gòu)中,程序由低地址到高地址依次執(zhí)行。2.選擇結(jié)構(gòu)選擇結(jié)構(gòu)可使程序根據(jù)不同的情況,選擇執(zhí)行不同的分支。3.循環(huán)結(jié)構(gòu)在程序處理過(guò)程中,有時(shí)需要某一段程序重復(fù)執(zhí)行多次,這時(shí)就需要循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
4.7.1
C51程序的基本結(jié)構(gòu)單片機(jī)原理及接口技術(shù)(1)if語(yǔ)句if語(yǔ)句是C51語(yǔ)言中一個(gè)基本的條件選擇語(yǔ)句,它是根據(jù)判定結(jié)果來(lái)決定執(zhí)行給出的兩個(gè)操作之一。通常有3種格式:1)if(表達(dá)式){語(yǔ)句;}2)if(表達(dá)式){語(yǔ)句1;}else{語(yǔ)句2;}3)if(表達(dá)式1){語(yǔ)句1;}esleif(表達(dá)式2){語(yǔ)句2;}elseif(表達(dá)式3){語(yǔ)句3;}……elseif(表達(dá)式n-1){語(yǔ)句n-1;}else{語(yǔ)句n;}
單片機(jī)原理及接口技術(shù)(2)switch/case語(yǔ)句
if語(yǔ)句通過(guò)嵌套可以實(shí)現(xiàn)多分支結(jié)構(gòu),但如果分支過(guò)多,則嵌套的if語(yǔ)句層數(shù)就多,結(jié)構(gòu)就更加復(fù)雜,程序可讀性降低。為此C51語(yǔ)言中提供了專(zhuān)門(mén)處理多分支結(jié)構(gòu)的switch/case語(yǔ)句。一般格式為switch(表達(dá)式){case常量表達(dá)式1:{語(yǔ)句1;}break;case常量表達(dá)式2:{語(yǔ)句2;}break;...case常量表達(dá)式n:{語(yǔ)句n;}break;default:{語(yǔ)句n+1;}}單片機(jī)原理及接口技術(shù)(3)while語(yǔ)句while語(yǔ)句在C51語(yǔ)言中用于實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu),一般格式為while(表達(dá)式){語(yǔ)句;}/*循環(huán)體*/表達(dá)式是while語(yǔ)句能否循環(huán)的條件,后面的語(yǔ)句是循環(huán)體。當(dāng)表達(dá)式的結(jié)果為非0(“真”)時(shí),就重復(fù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句;當(dāng)表達(dá)式的結(jié)果為0(“假”)時(shí),則終止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的語(yǔ)句。它的特點(diǎn)是:先判斷條件,后執(zhí)行循環(huán)體。如條件成立,則再執(zhí)行循環(huán)體;如條件不成立,則退出循環(huán)。該方法常用來(lái)測(cè)試硬件上的某些信號(hào)變化。單片機(jī)原理及接口技術(shù)例4-35利用while語(yǔ)句編程實(shí)現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫(kù)*/#include<stdio.h>/*包含I/O函數(shù)庫(kù)*/voidmain(void)/*主函數(shù)*/{inti,j=0;/*定義整型變量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;while(i<=100)/*累加1~100之和在中*/{j=j+i;i++;}printf("1~100的累加和為%d。\n",j);while(1);}程序運(yùn)行結(jié)果:1~100的累加和為5050單片機(jī)原理及接口技術(shù)(4)do-while語(yǔ)句
do-while語(yǔ)句在C51語(yǔ)言中用于實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu),一般格式為do{語(yǔ)句;}/*循環(huán)體*/while(表達(dá)式);特點(diǎn)是:先執(zhí)行語(yǔ)句,后判斷表達(dá)式。若表達(dá)式的結(jié)果為非0(“真”),則再執(zhí)行循環(huán)體,然后又判斷,直到有表達(dá)式的結(jié)果為0(“假”)時(shí),退出循環(huán),執(zhí)行do-while結(jié)構(gòu)的下一條語(yǔ)句。do-while語(yǔ)句在執(zhí)行時(shí),循環(huán)體內(nèi)的語(yǔ)句至少會(huì)被執(zhí)行一次。單片機(jī)原理及接口技術(shù)例4-36利用do-while語(yǔ)句編程實(shí)現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫(kù)*/#include<stdio.h>/*包含I/O函數(shù)庫(kù)*/voidmain(void)/*主函數(shù)*/{inti,j=0;/*定義整型變量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;do/*累加1~100之和在j中*/{
j=j+i;i++;}while(i<=100);printf("1~100的累加和為%d。\n",j);while(1);}程序運(yùn)行結(jié)果:1~100的累加和為5050。單片機(jī)原理及接口技術(shù)(5)for語(yǔ)句
在C51語(yǔ)言中,for語(yǔ)句是使用最靈活、最方便,應(yīng)用最多的循環(huán)控制語(yǔ)句,同時(shí)也是最復(fù)雜的。它可以用于循環(huán)次數(shù)已經(jīng)確定的情況,也可以用于循環(huán)次數(shù)不確定的情況。一般格式為for(表達(dá)式1;表達(dá)2;表達(dá)式3){語(yǔ)句;}/*循環(huán)體*/在for循環(huán)中,一般表達(dá)式1為初始化表達(dá)式,用于給循環(huán)變量賦初值;表達(dá)式2為循環(huán)測(cè)試表達(dá)式,對(duì)循環(huán)變量進(jìn)行判斷;表達(dá)式3為增量尺度表達(dá)式,用于對(duì)循環(huán)變量的值進(jìn)行更新,使循環(huán)變量不滿(mǎn)足條件而退出循環(huán)。它的執(zhí)行過(guò)程如下:1)先求解表達(dá)式1的值。2)再求解表達(dá)式2的值。若表達(dá)式2的值為真,則執(zhí)行循環(huán)體中的語(yǔ)句,并求解表達(dá)式3,然后重復(fù)執(zhí)行步驟(2)的操作;若表達(dá)式2的值為假,則結(jié)束for循環(huán),執(zhí)行后面的語(yǔ)句。單片機(jī)原理及接口技術(shù)例4-37
利用for語(yǔ)句編程實(shí)現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫(kù)*/#include<stdio.h>/*包含I/O函數(shù)庫(kù)*/voidmain(void)/*主函數(shù)*/{inti,j=0;/*定義整型變量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;for(i=1;i<=100;i++)j=j+i;/*累加1~100之和在j中*/printf("1~100的累加和為%d。\n",j);while(1);}程序運(yùn)行結(jié)果:1~100的累加和為5050。單片機(jī)原理及接口技術(shù)(6)循環(huán)的嵌套若在一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體中又包含一個(gè)完整的循環(huán)結(jié)構(gòu),這種結(jié)構(gòu)稱(chēng)為循環(huán)的嵌套。外面的循環(huán)結(jié)構(gòu)稱(chēng)為外循環(huán),里面的循環(huán)結(jié)構(gòu)稱(chēng)為內(nèi)循環(huán),如果在內(nèi)循環(huán)的循環(huán)體內(nèi)又包含循環(huán)結(jié)構(gòu),就構(gòu)成了多重循環(huán)結(jié)構(gòu)。在C51語(yǔ)言中,允許三種循環(huán)結(jié)構(gòu)相互嵌套。例4-38用嵌套結(jié)構(gòu)構(gòu)造一個(gè)延時(shí)程序。
voiddelay(unsignedintx){unsignedcharj;while(x--)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年07月江蘇江都農(nóng)商銀行暑期大學(xué)生實(shí)踐活動(dòng)招考筆試歷年參考題庫(kù)附帶答案詳解
- 2024年江源縣婦幼保健站高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年企業(yè)所得稅匯算清繳培訓(xùn)
- 圓錐的體積(說(shuō)課稿)-2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)人教版
- 2024版建筑承包協(xié)議:安全措施專(zhuān)項(xiàng)附錄版B版
- 2024正規(guī)個(gè)人租房合同范本-二零二四年度12篇
- 臨床指南:腸胃炎
- 2024版車(chē)輛無(wú)償租賃合同模板
- 雙側(cè)輸卵管吻合術(shù)后的護(hù)理
- 辦公室安全管理制度
- 新版中國(guó)食物成分表
- 2024河南鄭州市金水區(qū)事業(yè)單位招聘45人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 湘教版八年級(jí)音樂(lè)下冊(cè)教案全冊(cè)
- 食物損失和浪費(fèi)控制程序
- 特種設(shè)備安全管理電梯模擬考核題庫(kù)888題(含標(biāo)準(zhǔn)答案)
- 債權(quán)法學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 關(guān)于農(nóng)機(jī)安裝合同模板
- 2024解讀《弘揚(yáng)教育家精神》全文
- TCI 373-2024 中老年人免散瞳眼底疾病篩查規(guī)范
- TCCIAT 0046-2022 混凝土剪力墻結(jié)構(gòu)裝配式組合殼體系技術(shù)規(guī)程
- GB/Z 44118.1-2024電能質(zhì)量技術(shù)管理第1部分:總則
評(píng)論
0/150
提交評(píng)論