單片機(jī)原理及接口技術(shù)課件:C51高級語言程序設(shè)計_第1頁
單片機(jī)原理及接口技術(shù)課件:C51高級語言程序設(shè)計_第2頁
單片機(jī)原理及接口技術(shù)課件:C51高級語言程序設(shè)計_第3頁
單片機(jī)原理及接口技術(shù)課件:C51高級語言程序設(shè)計_第4頁
單片機(jī)原理及接口技術(shù)課件:C51高級語言程序設(shè)計_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C51高級語言程序設(shè)計單片機(jī)原理及接口技術(shù)單片機(jī)原理及接口技術(shù)目錄4.1C語言高級編程4.2C51對標(biāo)準(zhǔn)C語言的擴(kuò)展4.3C51的運(yùn)算符及表達(dá)式4.4C51函數(shù)4.5C51構(gòu)造數(shù)據(jù)類型4.6C51庫函數(shù)4.7C51程序編寫4.8C51語言與匯編語言接口單片機(jī)原理及接口技術(shù)概述匯編語言編寫程序?qū)τ布僮鞅容^便利,編寫的程序代碼短,但使用起來很不方便,可讀性和可移植性較差。同時,匯編語言程序的設(shè)計周期長,調(diào)試和排錯也比較困難。為了提高編程速度和應(yīng)用程序效率,改善程序的可讀性和可移植性,最好是采用高級語言來進(jìn)行系統(tǒng)程序設(shè)計。而C語言既有高級語言使用方便的特點(diǎn),也具有匯編語言直接對硬件進(jìn)行操作的特點(diǎn),因此在現(xiàn)代計算機(jī)軟件系統(tǒng)設(shè)計中,特別是在單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程中,往往用C語言來進(jìn)行程序編寫和開發(fā)。本章主要介紹MCS-51單片機(jī)的C語言語法和程序設(shè)計,并討論C語言程序的結(jié)構(gòu)和編程方法。單片機(jī)原理及接口技術(shù)4.1.1C語言的特點(diǎn)

C語言于20世紀(jì)70年代初問世,早期的C語言主要是用于UNIX系統(tǒng)。由于C語言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸被人們認(rèn)識,到了20世紀(jì)80年代,C語言開始進(jìn)入其它操作系統(tǒng),并很快在各類大、中、小和微型計算機(jī)上得到廣泛的使用,并成為當(dāng)代最優(yōu)秀的程序設(shè)計語言之一。與其它高級語言相比,C語言具有以下一些特點(diǎn):1.簡潔性:C語言僅有32個關(guān)鍵字和9種控制語句,使得程序編寫簡潔、靈活。2.運(yùn)算符豐富:C語言提供了34種運(yùn)算符,包括括號、賦值、強(qiáng)制類型轉(zhuǎn)換等,使得表達(dá)式多樣化,能夠?qū)崿F(xiàn)復(fù)雜的運(yùn)算。

4.1C語言高級編程單片機(jī)原理及接口技術(shù)3.數(shù)據(jù)結(jié)構(gòu)多樣:C語言支持整型、實型、字符型、數(shù)組類型、指針類型等多種數(shù)據(jù)類型,可以構(gòu)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。4.結(jié)構(gòu)化設(shè)計:C語言擁有多種控制語句,支持if-else、while、do-while、switch、for等結(jié)構(gòu)化控制語句,程序以函數(shù)為模塊,便于進(jìn)行結(jié)構(gòu)設(shè)計。5.硬件操作:C語言允許直接訪問物理地址和進(jìn)行位操作,具有匯編語言的大部分功能。6.高效性:C語言編寫的程序生成的目標(biāo)代碼質(zhì)量高,執(zhí)行效率高,通常比匯編語言編寫的程序效率低10%~30%。7.可移植性:C語言程序具有很好的可移植性,通常無需修改即可在不同機(jī)型和操作系統(tǒng)上運(yùn)行。單片機(jī)原理及接口技術(shù)4.1.2C語言與MCS-51單片機(jī)

51系列單片機(jī)支持三種高級語言,即PL/M,C和BASIC。C語言是一種通用的程序設(shè)計語言,其代碼率高,數(shù)據(jù)類型及運(yùn)算符豐富,并具有良好的程序結(jié)構(gòu),適用于各種應(yīng)用的程序設(shè)計,是目前使用較廣的單片機(jī)編程語言。MCS-51系列單片機(jī)采用的C語言,簡稱C51。C51符合C語言的ANSI標(biāo)準(zhǔn),并根據(jù)單片機(jī)的特性進(jìn)行了擴(kuò)展。C51所產(chǎn)生的目標(biāo)代碼短、運(yùn)行速度高、所需存儲空間小。注:1.在實際的系統(tǒng)設(shè)計中,當(dāng)設(shè)計對象只是一個小的嵌入式系統(tǒng)時,匯編語言是一個很好的選擇,因為代碼一般都不超過8K,而且都比較簡單;2.當(dāng)一個系統(tǒng)對時鐘要求很嚴(yán)格時,使用匯編語言成了唯一的方法。單片機(jī)原理及接口技術(shù)4.1.3C51編譯器

目前支持MCS-51單片機(jī)的C語言編譯器有很多種,然而并非所有的Cx51編譯器都能產(chǎn)生具有8051特點(diǎn)的有效代碼。下面就不同的編譯器做簡要介紹。表4-1各個編譯器的整體特性編譯器版本編譯時間存儲模式編譯堆棧浮點(diǎn)支持AmericanAUTOMATION16.02.076min3sSMLNo僅大模式IAR4.05A2min3sTSCMLBYesYesAvocet1.31min47sSMLNoYesBso/Tasking1.102min25sSALYesYesIntermetrics3.322min52sSL(支持幾種動態(tài)分配方案)NoYesMicroComputerControls1.7不能編譯所有測試程序SMLNoNoDunfieldShareware2.11不能編譯所有測試程序SL(ROM和RAM必須映像到同一地址空間)NoNoKeil3.011min28sSALYesYes單片機(jī)原理及接口技術(shù)

KeilC51標(biāo)準(zhǔn)C編譯器為8051微控制器的軟件開發(fā)提供了C語言環(huán)境,同時保留了匯編代碼高效、快速的特點(diǎn)。C51編譯器的功能不斷增強(qiáng),使得使用者可以更加貼近CPU本身及其它的衍生產(chǎn)品。C51已被完全集成到μVision4的集成開發(fā)環(huán)境中,這個集成開發(fā)環(huán)境包含:編譯器、匯編器、實時操作系統(tǒng)、項目管理器和調(diào)試器。μVision4IDE可為它們提供單一而靈活的開發(fā)環(huán)境。C51V7版本是目前最高效、靈活的8051開發(fā)平臺。它可以支持所有8051的衍生產(chǎn)品,也可以支持所有兼容的仿真器,同時支持其它第三方開發(fā)工具。因此,C51V7版本無疑是8051開發(fā)用戶的最佳選擇。具有以下主要功能:1.集成開發(fā)環(huán)境μVision42.集成功能3.C51V7版增強(qiáng)功能4.1.4Keil8051開發(fā)工具單片機(jī)原理及接口技術(shù)

同ANSIC一樣,C51的程序由一個個函數(shù)組成,這里的函數(shù)和其他語言的“子程序”或“過程”具有相同的意義。

必須有一個主函數(shù)main(),程序的執(zhí)行從main()函數(shù)開始,調(diào)用其他函數(shù)后返回主函數(shù)main(),最后在主函數(shù)中結(jié)束整個程序而不管函數(shù)的排列順序如何。

功能函數(shù)可以是C51語言提供的庫函數(shù),也可以是用戶自定義的函數(shù)。4.1.5C51程序結(jié)構(gòu)單片機(jī)原理及接口技術(shù)組成結(jié)構(gòu):預(yù)處理命令#include<reg51.h>函數(shù)說明longfun1();floatfun2();變量定義intx,y;floatz;主函數(shù)main(){…fun1();/*調(diào)用功能函數(shù)1*/…fun2();/*調(diào)用功能函數(shù)2*/…}功能函數(shù)1fun1(){…}功能函數(shù)2fun2(){…}單片機(jī)原理及接口技術(shù)C語言的語句規(guī)則:

1.每個變量必須先說明后引用,變量名英文大小寫是有差別的。2.C語言程序一行可以書寫多條語句,但每個語句必須以“;”結(jié)尾,一個語句也可以多行書寫。3.C語言的注釋用/*……*/或//表示。4.“{”花括號必須成對,位置隨意,可在緊挨函數(shù)名后,也可另起一行,多個花括號可以同行書寫,也可逐行書寫,為層次分明,增加可讀性,同一層的“{”花括號對齊,采用逐層縮進(jìn)方式書寫。單片機(jī)原理及接口技術(shù)4.2.1存儲區(qū)域

51系列單片機(jī)的內(nèi)存區(qū)域被分為兩大類。一類是程序存儲區(qū),即ROM;另一類是數(shù)據(jù)存儲區(qū),包括內(nèi)部數(shù)據(jù)存儲區(qū)和外部數(shù)據(jù)存儲區(qū)。內(nèi)部數(shù)據(jù)存儲區(qū)中又包含了51單片機(jī)的特殊功能寄存器。1數(shù)據(jù)存儲區(qū)

1)內(nèi)部數(shù)據(jù)存儲區(qū)

data

idata

bdata

2)外部數(shù)據(jù)存儲區(qū)

xdata

pdata2程序存儲器

code4.2C51對標(biāo)準(zhǔn)C語言的擴(kuò)展單片機(jī)原理及接口技術(shù)51系列單片機(jī)的存儲區(qū)類型單片機(jī)原理及接口技術(shù)4.2.2

數(shù)據(jù)類型C51提供的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型的形式出現(xiàn)的,可分為基本數(shù)據(jù)類型和組合。C51編譯器具體支持的數(shù)據(jù)類型有無符號字符型(unsignedchar)、有符號字符型(signedchar)、無符號整型(unsignedint)、有符號整型(signedint)、無符號長整型(unsignedlong)、有符號長整型(signedlong)、浮點(diǎn)型(float)、雙精度型(double)和指針型等。這些數(shù)據(jù)類型的長度和值域會因處理器的類型和C語言編譯程序的實現(xiàn)而有所不同,對于KeilC51產(chǎn)生的目標(biāo)文件。單片機(jī)原理及接口技術(shù)表4-2KeilC51的數(shù)據(jù)類型類型長度/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存儲空間0~65535單片機(jī)原理及接口技術(shù)C51中還有專門針對于MCS-51單片機(jī)的位類型和特殊功能寄存器型。1.位類型位類型是C51中擴(kuò)充的數(shù)據(jù)類型,該類型的變量可以用于變量的定義和聲明、函數(shù)的參數(shù)傳遞和函數(shù)的返回值中。2.特殊功能寄存器型

特殊功能寄存器區(qū)SFR。SFR在程序中被用來控制定時/計數(shù)器、串口、I/O端口以及各種外設(shè)。SFR在MCS-51單片機(jī)中處于地址0x80~0xFF的位置,并可以被按照位、字節(jié)或者字的形式被訪問。C51編譯器除了能支持以上這些基本數(shù)據(jù)類型以外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型和聯(lián)合類型等。單片機(jī)原理及接口技術(shù)4.2.3

常量和變量

C51支持的數(shù)據(jù)有常量、變量、指針。存儲時遵循“先高后低”原則;常量位置與定義說明有關(guān),一般放在程序存儲區(qū)code。1)常量整型常量、實型常量、字符常量、字符串常量、符號常量。符號常量在使用前必須先定義,格式為:#define標(biāo)識符常量//是C51的預(yù)處理指令2)變量

定義變量的一般格式:

[存儲模式]數(shù)據(jù)類型[存儲器類型]變量名;單片機(jī)原理及接口技術(shù)變量說明舉例charvar;/*字符變量var,存儲類型由編譯模式確定*/charcodeMSG[]=″PARAMETER:″;/*字符數(shù)組MSG[]定位在程序存貯區(qū)*/unsignedlongxdataarray[100];/*無符號長型數(shù)組定位在片外RAM區(qū),每元素占4bytes*/floatidatax,y,z;/*實型變量x,y,z,定位在片內(nèi)用間址訪問的內(nèi)部RAM區(qū)*/bitlock;/*位變量Lock,由編譯器定位*/unsignedintpdatasion;/*無符號整型變量sion定位在外部RAM*/unsignedcharxdatavector[10][4][4];/*無符號字符型三維數(shù)組,定位在片外RAM區(qū)*/sfrP0=0x80;/*定義P0口,地址為80H*/charbdataflags;/*字符變量flags定位在可位尋址內(nèi)部RAM區(qū)*/sbitflag0=flags^0;/*定義flag0為flags.0*/單片機(jī)原理及接口技術(shù)說明:1.字符型(char)、整型(int)和長整型(long)均有符號型(signed)和無符號型(unsigned)兩種,如果不是必須,盡可能選擇unsigned型,這將會使編譯器省卻符號位的檢測,使生成的程序代碼比signed類型短得多。2.程序編譯時,C51編譯器會自動進(jìn)行類型轉(zhuǎn)換,當(dāng)運(yùn)算符兩邊為不同類型的數(shù)據(jù)時,編譯器先將低級的數(shù)據(jù)類型轉(zhuǎn)換為較高級的數(shù)據(jù)類型,運(yùn)算后,運(yùn)算結(jié)果為高級數(shù)據(jù)類型。3.bit和sbit都是C51擴(kuò)展的變量類型。bit用來定義一個普通位變量(0或1),編譯器在編譯過程中分配地址,除非指定否則這個地址隨機(jī)分布在整個可尋址空間中。所有的可位尋址的位都可由sbit指定,這包括可位尋址區(qū)和SFR中的位。4.如果在變量說明時略去存貯器類型標(biāo)志符,編譯器會自動選擇默認(rèn)的存貯器類型。單片機(jī)原理及接口技術(shù)4.2.4存儲器模式C51編譯器編譯時為了適應(yīng)不同規(guī)模的程序而選用3種存儲模式:1.SMALL模式SMALL模式稱為小編譯模式,在SMALL模式下編譯時,函數(shù)參數(shù)和變量放入可直接尋址的片內(nèi)存儲器(最大128字節(jié)),默認(rèn)存儲器類型為data,訪問十分方便。2.COMPACT模式COMPACT模式稱為緊湊編譯模式,在COMPACT模式下編譯時,函數(shù)參數(shù)和變量放入分頁片外存儲區(qū)(最大256字節(jié)),默認(rèn)存儲器類型為pdata。3.LARGE模式LARGE模式稱為大編譯模式,在LARGE模式下,編譯時函數(shù)參數(shù)和變量直接放入片外數(shù)據(jù)存儲器(最大64K字節(jié)),默認(rèn)存儲器類型為xdata,使用數(shù)據(jù)指針DPTR進(jìn)行尋址。單片機(jī)原理及接口技術(shù)舉例說明變量的存儲模式#pragmasmall/*變量的存儲模式為SMALL*/chara1;intxdatab1;#pragmaCompact/*變量的存儲模式為COMPACT*/chara2;intxdatab2;intfunc1(intx1,inty1)large/*函數(shù)的存儲模式為LARGE*/{return(x1-y1);}intfunc2(intx2,inty2)/*函數(shù)的存儲模式隱含為SMALL*/{return(x2+y2);}單片機(jī)原理及接口技術(shù)4.2.5

絕對地址的訪問1.對存貯器的絕對地址訪問利用絕對地址訪問的頭文件absacc.h可對不同的存貯區(qū)進(jìn)行訪問。該頭文件的函數(shù)有:

CBYTE(訪問code區(qū)字符型)DBYTE(訪問data區(qū)字符型)PBYTE(訪問pdata或I/O區(qū)字符型)XBYTE(訪問xdata或I/O區(qū)字符型)

還有CWORD、DWORD、PWORD和XWORD四個函數(shù),它們的訪問區(qū)域同上,只是訪問的類型為int型。例:#include<absacc.h>#definecomXBYTE[0x07ff]那么后面程序com變量出現(xiàn)的地方,就是對地址為07ffH的外部RAM或I/O口進(jìn)行訪問。單片機(jī)原理及接口技術(shù)2.通過指針訪問采用指針的方法,可以在C51程序中對任意指定的存儲器單元進(jìn)行訪問。例4-8通過指針實現(xiàn)絕對地址的訪問。#defineucharunsignedchar/*定義符號uchar為數(shù)據(jù)類型符unsignedchar*/#defineuintunsignedint/*定義符號uint為數(shù)據(jù)類型符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_定義變量時,使用_at_關(guān)鍵詞指定變量的絕對地址,格式為:

[存儲類型]數(shù)據(jù)類型變量名_at_絕對地址;例: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á)式及語句。在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)算是對字節(jié)或字中的位(bit)進(jìn)行測試或移位處理,但并不改變參與運(yùn)算的變量的值。如果要求按位改變變量的值,則要利用相應(yīng)的賦值運(yùn)算。C51中位運(yùn)算符只能對整數(shù)進(jìn)行操作,不能對float、double、longdouble、void或其它復(fù)雜數(shù)據(jù)類型進(jìn)行操作。C51中的位運(yùn)算符如表4-7所示。表4-7位運(yùn)算符單片機(jī)原理及接口技術(shù)4.3.4逗號運(yùn)算符

在C51語言中,逗號“,”是一個特殊的運(yùn)算符,可以用它將兩個或兩個以上的表達(dá)式連接起來,稱為逗號表達(dá)式。

逗號運(yùn)算符的左側(cè)總是作為void(無值),這意味著其右邊表達(dá)式的值變?yōu)橐远禾柗珠_的整個表達(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語言提供了一個代替某些“if…else”語句的條件運(yùn)算符(?

,該運(yùn)算符是唯一的一個三目運(yùn)算符。其功能是先計算關(guān)系表達(dá)式關(guān)系表達(dá)式?表達(dá)式1:表達(dá)式2的值,當(dāng)關(guān)系表達(dá)式的值為True(非0值)時,計算表達(dá)式1的值,并將結(jié)果作為整個表達(dá)式的值;當(dāng)邏輯表達(dá)式的值為Flase(0值)時,計算表達(dá)式2的值,并將結(jié)果作為整個表達(dá)式的值。

例如:max=(a>b)?a:b;

表達(dá)式中若a>b,max=a;若a<b,max=b。即max是a和b中較大的數(shù)。如果用if…else語句改寫,則有:if(a>b)max=a;elsemax=b;單片機(jī)原理及接口技術(shù)4.4C51函數(shù)

在程序設(shè)計過程中,對于較大的程序一般采用模塊化結(jié)構(gòu)。通常將一個較大的程序分成若干個程序模塊,每個模塊包括子程序,實現(xiàn)一個特定的功能。在C51語言中,子程序模塊是由函數(shù)來實現(xiàn)的。C51語言的程序是由一個主函數(shù)和若干個子函數(shù)組成的,每個子函數(shù)完成一定的功能,由主函數(shù)(main())根據(jù)需要來調(diào)用。子函數(shù)可以被主函數(shù)調(diào)用,也可以被其它子函數(shù)或其本身調(diào)用形成子程序嵌套,但主函數(shù)不能被調(diào)用。當(dāng)被調(diào)用函數(shù)執(zhí)行完畢后,就發(fā)出返回(return)指令,恢復(fù)原來程序流的執(zhí)行。程序執(zhí)行時從主函數(shù)開始,到主函數(shù)最后一條語句結(jié)束。單片機(jī)原理及接口技術(shù)1.函數(shù)的分類從用戶使用角度劃分,函數(shù)分為庫函數(shù)和用戶自定義函數(shù)

庫函數(shù)是編譯系統(tǒng)為用戶設(shè)計的一系列標(biāo)準(zhǔn)函數(shù),用戶只需調(diào)用,而無需自己去編寫這些復(fù)雜的函數(shù),如前面所用到的頭文件reg51.h等,有的頭文件中包括一系列函數(shù),要使用其中的函數(shù)必須先使用#include包含語句,然后才能調(diào)用。用戶自定義函數(shù)是用戶根據(jù)任務(wù)編寫的函數(shù)。從參數(shù)形式上函數(shù)分為無參函數(shù)和有參函數(shù)。

有參函數(shù)即是在調(diào)用時,調(diào)用函數(shù)用實際參數(shù)代替形式參數(shù),調(diào)用完返回結(jié)果給調(diào)用函數(shù)。

4.4C51函數(shù)單片機(jī)原理及接口技術(shù)2.函數(shù)的定義用C51進(jìn)行程序設(shè)計的過程中,既可以用系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù),也可以使用用戶自己定義的函數(shù)。對于系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù),用戶使用時通過預(yù)處理器命令#include可將對應(yīng)的標(biāo)準(zhǔn)函數(shù)庫包含到程序中;而對于用戶自定義的函數(shù),在使用之前必須對其進(jìn)行定義,只有定義之后才能被調(diào)用。函數(shù)定義的一般格式如下:[存儲類說明符]函數(shù)類型函數(shù)標(biāo)識符(形式參數(shù)表)[reentrant][interruptm][usingn][存儲模式]形式參數(shù)說明{

函數(shù)體;}其中函數(shù)體是能夠完成一定功能的語句,由用戶自己編寫。單片機(jī)原理及接口技術(shù)(1)存儲類說明符:存儲類說明符有兩類:extern和static。(2)函數(shù)類型函數(shù)類型是用來說明函數(shù)返回值的類型。有簡單類型(char、unsignedchar、int、unsignedint、long、unsignedlong、float和bit)、復(fù)合類型(struct和union)和無類型(void)。(3)函數(shù)標(biāo)識符函數(shù)標(biāo)識符即函數(shù)名,是用戶為自定義函數(shù)所取的名字,以便調(diào)用函數(shù)時使用。(4)形式參數(shù)表形式參數(shù)表用于列舉在主調(diào)函數(shù)與被調(diào)函數(shù)之間進(jìn)行數(shù)據(jù)傳遞的形式參數(shù)。(5)reentrant修飾符在C51語言中,利用這個修飾符把函數(shù)定義為可重入函數(shù)。單片機(jī)原理及接口技術(shù)(6)interruptm修飾符為了在C51源程序中直接編寫中斷服務(wù)程序,C51編譯器對函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個擴(kuò)展關(guān)鍵字interrupt。關(guān)鍵字interrupt是函數(shù)定義時的一個選項,加上這個選項才可以將一個函數(shù)定義為中斷服務(wù)函數(shù)。51單片機(jī)的中斷源編號單片機(jī)原理及接口技術(shù)中斷函數(shù)的定義格式:void

函數(shù)名(void)

interruptn[usingm]1)interruptn:說明函數(shù)是中斷類型n的中斷服務(wù)子程序C51編譯器支持32個中斷函數(shù),中斷類型號為0~31。函數(shù)定義為中斷函數(shù)后,編譯器會在對應(yīng)的中斷服務(wù)程序入口處,生成LJMP指令,直接跳到中斷函數(shù)。中斷函數(shù)不能帶參數(shù),不能定義函數(shù)返回值,且程序不能直接調(diào)用中斷函數(shù)。編譯器會自動為中斷函數(shù)添加保護(hù)現(xiàn)場的代碼,進(jìn)入函數(shù)后,壓棧保護(hù)函數(shù)中使用了的ACC、B、DPTR、PSW寄存器的值,返回前出?;謴?fù)。單片機(jī)原理及接口技術(shù)2)usingm:指定函數(shù)使用第m個寄存器組,m可以為0、1、2、3,代表4個不同的工作寄存器組。定義函數(shù)時可省略usingm選項,此時編譯器自動選擇一個寄存器組作絕對寄存器組訪問;如定義則小心使用,要保證任何寄存器組的切換都只在控制的區(qū)域內(nèi)發(fā)生,否則產(chǎn)生不正確的函數(shù)結(jié)果。在函數(shù)的入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;函數(shù)退出之前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)。(8)存儲模式為了提高程序的效率和靈活性,C51允許采用混合存儲模式。若指定固定的存儲模式后,它將不再隨編譯模式而變。單片機(jī)原理及接口技術(shù)3.函數(shù)的調(diào)用函數(shù)調(diào)用的形式為:函數(shù)名(實際參數(shù)表);實參和形參必須在數(shù)目、類型及順序上嚴(yán)格保持一致,對于無參函數(shù)不存在實際參數(shù)表。函數(shù)的調(diào)用方式有三種:

①函數(shù)調(diào)用語句:即把被調(diào)函數(shù)名作為調(diào)用函數(shù)的一個語句,如fun1();。②被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對象,如result=2*get(a,b);此時get函數(shù)中的a,b應(yīng)為實參,其以返回值參與式中的運(yùn)算。③被調(diào)函數(shù)作為另一個函數(shù)的實際參數(shù)如m=max(a,get(a,b));函數(shù)get(a,b)作為函數(shù)max()的一個實際參數(shù)。單片機(jī)原理及接口技術(shù)3.函數(shù)的調(diào)用注:1)如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,在主調(diào)函數(shù)前應(yīng)對被調(diào)函數(shù)進(jìn)行說明,形式為:

返回值類型被調(diào)函數(shù)名(形式參數(shù)表);

2)如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,可以不對被調(diào)函數(shù)說明。下面以一個簡單例子來說明: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ù)前,不用說明。單片機(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ù)后,在前面對被調(diào)函數(shù)進(jìn)行說明。單片機(jī)原理及接口技術(shù)4.函數(shù)的嵌套與遞歸(1)函數(shù)的嵌套在C51語言中,函數(shù)的定義是相互平行、獨(dú)立的。即在函數(shù)定義時,一個函數(shù)體內(nèi)不能包含另一個函數(shù)。但是在一個函數(shù)的調(diào)用過程中可以調(diào)用另一個函數(shù),即可以嵌套調(diào)用函數(shù)。C51編譯器通常依靠堆棧來進(jìn)行參數(shù)傳遞,但由于C51的堆棧設(shè)在片內(nèi)RAM中,而片內(nèi)RAM的空間有限,因而嵌套的深度一般在5-10層以內(nèi)。(2)函數(shù)的遞歸調(diào)用如果在調(diào)用一個函數(shù)過程中出現(xiàn)了直接或間接調(diào)用該函數(shù)本身,則稱為函數(shù)的遞歸調(diào)用。遞歸調(diào)用是嵌套調(diào)用的一個特殊情況。在函數(shù)的遞歸調(diào)用中要避免出現(xiàn)無終止的自身調(diào)用,應(yīng)通過控制條件,使得遞歸的次數(shù)有限。單片機(jī)原理及接口技術(shù)例4-19函數(shù)的嵌套調(diào)用。#include<reg51.h>/*包含特殊功能寄存器庫函數(shù)*/#include<stdio.h>/*包含I/O函數(shù)庫函數(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ù)組是一個由若干同類型變量組成的集合,數(shù)組中的各個元素可以用數(shù)組名和下標(biāo)來唯一確定。數(shù)組在使用之前必須先對其進(jìn)行定義。根據(jù)數(shù)組中存放的數(shù)據(jù)可分為整型數(shù)組、字符數(shù)組等。不同的數(shù)組在定義、使用上基本相同,根據(jù)下標(biāo)維數(shù)的不同可以分為一維數(shù)組、二維數(shù)組和多維數(shù)組。2.指針指針是C語言中的精華。指針類型數(shù)據(jù)在C語言程序中使用非常廣泛,正確使用指針類型數(shù)據(jù),可以方便有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),動態(tài)地分配存儲器空間,直接處理內(nèi)存地址。4.5C51構(gòu)造數(shù)據(jù)類型

單片機(jī)原理及接口技術(shù)1.數(shù)組(1)一維數(shù)組一維數(shù)組只有一個下標(biāo),定義的一般形式如下:

數(shù)據(jù)類型說明符數(shù)組名[常量表達(dá)式]1)“數(shù)據(jù)類型說明符”是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。2)“數(shù)組名”是用戶定義的數(shù)組標(biāo)識符,它的取名方法與變量的取名方法相同。3)“常量表達(dá)式”用于說明該數(shù)組的長度,即該數(shù)組元素的個數(shù)。要求取值為整型常量,必須用方括號“[]”括起來。單片機(jī)原理及接口技術(shù)(2)二維數(shù)組二維數(shù)組有兩個下標(biāo),定義的一般形式如下:

數(shù)據(jù)類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]如:unsignedinta[3][4];定義了一個三行4列的數(shù)組,數(shù)組名為a,該數(shù)組的下標(biāo)共有3×4個,即: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ù)組元素逐個賦值如:x[0]=0;x[1]=x;…;x[9]=9;2)數(shù)組初始化賦值數(shù)組初始化賦值是指在數(shù)組說明時給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的,從而減少運(yùn)行時間,提高效率。例如:intx[10]={0,1,2,3,4,5,6,7,8,9};3)動態(tài)賦值動態(tài)賦值是在程序執(zhí)行過程中對數(shù)組賦值。如例4-20中是用循環(huán)語句配合scanf函數(shù)逐個對數(shù)組元素賦值。4)二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。單片機(jī)原理及接口技術(shù)

2.指針(1)指針變量的定義指針變量使用之前必須對它進(jìn)行定義,定義格式與一般變量的定義類似,一般形式為

數(shù)據(jù)類型說明符[存儲器類型]*指針變量名;數(shù)據(jù)類型說明符說明了該指針變量所指向的變量類型。(2)指針變量的引用指針變量是存放另一變量地址的特殊變量,指針變量只能存放地址。指針變量在使用時應(yīng)注意兩個運(yùn)算符:“&”和“*”。其中,“&”是取地址運(yùn)算符,“*”是指針運(yùn)算符或稱“間接訪問”運(yùn)算符。單片機(jī)原理及接口技術(shù)匯編語言和C語言的對照表注:上表省略了匯編語言程序中對符號地址n和m用EQU偽指令進(jìn)行具體地址定義的語句以及C語言對變量n、m和指針變量P進(jìn)行類型定義的語句,實際程序設(shè)計中,此步是不可缺少的。表中&為取地址運(yùn)算符,*為取內(nèi)容運(yùn)算符。單片機(jī)原理及接口技術(shù)說明:1)在C語言中,為了能夠?qū)崿F(xiàn)直接對內(nèi)存單元進(jìn)行操作,引入了指針類型的數(shù)據(jù)。一個變量的地址就稱為該變量的指針。2)如果有一個變量專門用來存放另一個變量的地址,則稱之為指針變量。一個指針變量存放的內(nèi)容是另一個變量在內(nèi)存中的地址,每一個變量都有它自己的指針(地址)。3)C語言中用“*”表示“指向”。如:整型變量i的地址存放在指針變量ip中,則

i=0x50;*ip=0x50;都是給同一個變量賦值。4)區(qū)分“&”和“*”運(yùn)算符。單片機(jī)原理及接口技術(shù)2.指針型數(shù)據(jù)的類型由于C51是結(jié)合51單片機(jī)硬件的,51單片機(jī)的不同存貯空間,有不同的地址范圍,即使對于同一外部數(shù)據(jù)存貯器,又有用@Ri尋址(Ri為八位)和用@DPTR尋址(DPTR為十六位)兩種尋址方式,而指針本身也是一個變量,有它存放的存貯區(qū)和數(shù)據(jù)長度。因此,在指針類型的定義中要說明:被指的變量的數(shù)據(jù)類型和存貯類型;指針變量本身的數(shù)據(jù)類型(占幾個字節(jié))和存貯類型(即指針本身存放在什么存貯區(qū))。指針類型的數(shù)據(jù)定義形式如下:數(shù)據(jù)類型[存儲器類型1]*[存儲器類型2]標(biāo)識符;單片機(jī)原理及接口技術(shù)

C51各類指針類型和其占用字節(jié)大小指針類型(存儲器類型1)大小通用指針3BytesXDATA指針2BytesCODE指針2BytesIDATA指針1ByteDATA指針1BytePDATA指針1Byte單片機(jī)原理及接口技術(shù)指向不同存儲區(qū)變量的通用指針指針能適用于指向任何存貯空間,此時指針長度為3字節(jié),第一字節(jié)表示存貯器類型編碼,第二、三字節(jié)分別表示所指地址的高位和低位。unsignedchar*ptr;//通用指針ptr,指針存放在默認(rèn)存儲區(qū)unsignedchar*idataiptr;//通用指針iptr,指針存放在idata存儲區(qū)指向固定存儲區(qū)變量的指針定義為data或idata,表示指針指向內(nèi)部數(shù)據(jù)存貯器;定義為pdata,表示指針指向外部數(shù)據(jù)存貯器,用@Ri間址。以上均為八位地址;定義為類型code/xdata,表示指針指向外部程序存貯器或外部數(shù)據(jù)存貯器指針,本身(即被指示地址)應(yīng)為十六位長度。

intcode*ptr;//指向code存儲區(qū)的指針ptr,指針存放在默認(rèn)存儲區(qū)intidata*pdataiptr;//指向idata存儲區(qū)的指針ptr,指針存放在pdata存儲區(qū)單片機(jī)原理及接口技術(shù)指針變量說明:longxdata*px;/*指針px指向xdata區(qū)的long型(每個數(shù)據(jù)占四個單元)變量,

指針自身在編譯模式默認(rèn)的存貯區(qū),指針長度為2個字節(jié)*/charxdata*datapd;/*指針pd指向xdata區(qū)的字符型變量,自身在data區(qū),指針

長度為2個字節(jié)*/datacharxdata*pd;/*與上例等效*/dataint*pn;(和int*datapn及int*pn等效)/*定義一個類型為int型的通用型

指針,指針自身在data區(qū),長度為3字節(jié)*/單片機(jī)原理及接口技術(shù)在上例的指針聲明中包含如下幾個內(nèi)容:1)指針變量名(如px)前面冠以“*”,表示px為指針型變量,此處*不帶取內(nèi)容之意。2)指針指向的存貯類型,即指向哪個存貯區(qū),它決定了指針本身的長度(見數(shù)據(jù)類型表)。存貯類型聲明的位置在數(shù)據(jù)類型和指針名(如*px)之間,如無此項聲明,則此指針型變量為通用型。3)指針指向的存貯區(qū)的數(shù)據(jù)類型,即被指向的存貯區(qū)以多少個單元作一個數(shù)據(jù)單位,當(dāng)程序通過指針對該區(qū)操作時,將按此規(guī)定的單元個數(shù)的內(nèi)容作為一個數(shù)據(jù)操作。4)指針變量自身的存貯類型,即指針處于什么區(qū)與自身的長度無關(guān),該聲明可位于聲明語句的開頭,也可在“*”和變量名之間。此項由編譯模式放在默認(rèn)區(qū),如無規(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)類型再定義結(jié)構(gòu)變量。定義一個結(jié)構(gòu)類型的一般形式為struct結(jié)構(gòu)名{結(jié)構(gòu)元素表};定義一個結(jié)構(gòu)變量的一般形式為:

struct結(jié)構(gòu)名變量名1,變量名2,…;其中,“結(jié)構(gòu)元素表”為結(jié)構(gòu)中的結(jié)構(gòu)成員,它可以由不同的數(shù)據(jù)類型組成。定義時需指明各個成員的數(shù)據(jù)類型。單片機(jī)原理及接口技術(shù)例定義一個結(jié)構(gòu)名為data結(jié)構(gòu)類型:structdata{intyear;intmonth;intday;};它由year、month和day3個成員組成,這三個結(jié)構(gòu)成員的數(shù)據(jù)類型都是整型(int),當(dāng)然也可以根據(jù)實際需要選用各種不同類型的變量作為結(jié)構(gòu)成員,將month和day的數(shù)據(jù)類型定義為字符型(char)。若結(jié)構(gòu)變量為data1和data2,定義如下:structdatadata1,data2;單片機(jī)原理及接口技術(shù)2)定義結(jié)構(gòu)類型的同時定義結(jié)構(gòu)變量。一般形式為struct結(jié)構(gòu)名{結(jié)構(gòu)元素表}變量名1,變量名2,……變量名n;3)使用typedef別名來定義結(jié)構(gòu)類型變量先用typedef為結(jié)構(gòu)起一個別名,然后用別名定義該結(jié)構(gòu)類型變量。一般形式為typedefstruct結(jié)構(gòu)名{結(jié)構(gòu)元素表}類型別名類型別名變量名1,變量名2,……變量名n;/*定義結(jié)構(gòu)變量名*/其中類型別名習(xí)慣于用大寫。單片機(jī)原理及接口技術(shù)(2)結(jié)構(gòu)變量的引用一般情況下,結(jié)構(gòu)變量的引用是通過對其結(jié)構(gòu)元素的引用來實現(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)類型的變量定義為結(jié)構(gòu)數(shù)組,結(jié)構(gòu)數(shù)組與一般變量數(shù)組的不同在于結(jié)構(gòu)數(shù)組的每一個元素都具有同一個結(jié)構(gòu)類型的變量,它們具有同一個結(jié)構(gòu)類型,含有相同的成員項。例4-26結(jié)構(gòu)數(shù)組的定義和引用structdocument{unsignedintnumber;unsignedintage;bitsex;};/*定義document的結(jié)構(gòu)類型*/structdocumentstudent[20];/*定義20個數(shù)組元素的結(jié)構(gòu)數(shù)組student,每個數(shù)組元素都是document結(jié)構(gòu)

類型*/student[5].age=18;/*對結(jié)構(gòu)數(shù)組成員進(jìn)行賦值*/單片機(jī)原理及接口技術(shù)3.共同體

結(jié)構(gòu)能夠把不同類型的數(shù)據(jù)組合在一起使用。結(jié)構(gòu)中定義的各個變量在內(nèi)存中占用不同的內(nèi)存單元,在位置上是分開的,彼此不互相重疊。在C51語言中,還提供一種數(shù)據(jù)類型,使不同類型的數(shù)據(jù)共同使用一塊內(nèi)存空間,空間的大小以最長的類型為主,這就是共同體數(shù)據(jù)類型,也稱作聯(lián)合類型(union)。4.枚舉枚舉數(shù)據(jù)類型是一個有名字的某些整型常量的集合。這些整型常量是該類型變量可取的所有合法值。枚舉定義時應(yīng)當(dāng)列出該類型變量的所有可取值。枚舉定義的格式與結(jié)構(gòu)和共同體基本類似,只是關(guān)鍵字變?yōu)閑num。單片機(jī)原理及接口技術(shù)4.6C51庫函數(shù)庫函數(shù)是編譯系統(tǒng)為用戶設(shè)計的一系列標(biāo)準(zhǔn)函數(shù),用戶只需調(diào)用,而無需自己去編寫這些復(fù)雜的函數(shù),如前面所用到的頭文件reg51.h、absacc.h等,有的頭文件中包括一系列函數(shù),要使用其中的函數(shù)必須先使用#include包含語句,然后才能調(diào)用。內(nèi)部庫函數(shù)

#include<intrins.h>_crol_,_cror_:將char型變量循環(huán)向左(右)移動指定位數(shù)后返回

_iror_,_irol_:將int型變量循環(huán)向左(右)移動指定位數(shù)后返回_lrol_,_lror_:將long型變量循環(huán)向左(右)移動指定位數(shù)后返回

_nop_:相當(dāng)于插入NOP_testbit_:相當(dāng)于JBCbitvar測試該位變量并跳轉(zhuǎn)同時清除單片機(jī)原理及接口技術(shù)2.直接訪問存儲區(qū)的頭文件#include<absacc.h>”

可以直接訪問指定地址的存儲區(qū)單元CBYTE、CWORD:直接訪問程序存儲區(qū);DBYTE、DWORD:訪問內(nèi)部數(shù)據(jù)區(qū);PBYTE、PWORD:訪問外部數(shù)據(jù)區(qū)當(dāng)前頁;XBYTE、XWORD:訪問外部數(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:求絕對值exp、log、sqrt、tan、pow:xy4.緩沖區(qū)處理函數(shù)#include<string.h>包括搜索、比較、拷貝、移動等函數(shù)memchr;memcmp;memcpy;memmove;strcat;strchr;strcmp;strcpy5.字符轉(zhuǎn)換與字符分類#include<ctype.h>isxdigit:判斷字符是否是16進(jìn)制數(shù)字字符

islower:是否是小寫isupper:是否是大寫

tolower:字符轉(zhuǎn)換成小寫字符toupper:字符轉(zhuǎn)換成大寫字符單片機(jī)原理及接口技術(shù)4.7C51程序編寫1.順序結(jié)構(gòu)順序結(jié)構(gòu)是最基本、最簡單的程序結(jié)構(gòu)。在這種結(jié)構(gòu)中,程序由低地址到高地址依次執(zhí)行。2.選擇結(jié)構(gòu)選擇結(jié)構(gòu)可使程序根據(jù)不同的情況,選擇執(zhí)行不同的分支。3.循環(huán)結(jié)構(gòu)在程序處理過程中,有時需要某一段程序重復(fù)執(zhí)行多次,這時就需要循環(huán)結(jié)構(gòu)來實現(xiàn)。

4.7.1

C51程序的基本結(jié)構(gòu)單片機(jī)原理及接口技術(shù)(1)if語句if語句是C51語言中一個基本的條件選擇語句,它是根據(jù)判定結(jié)果來決定執(zhí)行給出的兩個操作之一。通常有3種格式:1)if(表達(dá)式){語句;}2)if(表達(dá)式){語句1;}else{語句2;}3)if(表達(dá)式1){語句1;}esleif(表達(dá)式2){語句2;}elseif(表達(dá)式3){語句3;}……elseif(表達(dá)式n-1){語句n-1;}else{語句n;}

單片機(jī)原理及接口技術(shù)(2)switch/case語句

if語句通過嵌套可以實現(xiàn)多分支結(jié)構(gòu),但如果分支過多,則嵌套的if語句層數(shù)就多,結(jié)構(gòu)就更加復(fù)雜,程序可讀性降低。為此C51語言中提供了專門處理多分支結(jié)構(gòu)的switch/case語句。一般格式為switch(表達(dá)式){case常量表達(dá)式1:{語句1;}break;case常量表達(dá)式2:{語句2;}break;...case常量表達(dá)式n:{語句n;}break;default:{語句n+1;}}單片機(jī)原理及接口技術(shù)(3)while語句while語句在C51語言中用于實現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu),一般格式為while(表達(dá)式){語句;}/*循環(huán)體*/表達(dá)式是while語句能否循環(huán)的條件,后面的語句是循環(huán)體。當(dāng)表達(dá)式的結(jié)果為非0(“真”)時,就重復(fù)執(zhí)行循環(huán)體內(nèi)的語句;當(dāng)表達(dá)式的結(jié)果為0(“假”)時,則終止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的語句。它的特點(diǎn)是:先判斷條件,后執(zhí)行循環(huán)體。如條件成立,則再執(zhí)行循環(huán)體;如條件不成立,則退出循環(huán)。該方法常用來測試硬件上的某些信號變化。單片機(jī)原理及接口技術(shù)例4-35利用while語句編程實現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫*/#include<stdio.h>/*包含I/O函數(shù)庫*/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語句

do-while語句在C51語言中用于實現(xiàn)直到型循環(huán)結(jié)構(gòu),一般格式為do{語句;}/*循環(huán)體*/while(表達(dá)式);特點(diǎn)是:先執(zhí)行語句,后判斷表達(dá)式。若表達(dá)式的結(jié)果為非0(“真”),則再執(zhí)行循環(huán)體,然后又判斷,直到有表達(dá)式的結(jié)果為0(“假”)時,退出循環(huán),執(zhí)行do-while結(jié)構(gòu)的下一條語句。do-while語句在執(zhí)行時,循環(huán)體內(nèi)的語句至少會被執(zhí)行一次。單片機(jī)原理及接口技術(shù)例4-36利用do-while語句編程實現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫*/#include<stdio.h>/*包含I/O函數(shù)庫*/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語句

在C51語言中,for語句是使用最靈活、最方便,應(yīng)用最多的循環(huán)控制語句,同時也是最復(fù)雜的。它可以用于循環(huán)次數(shù)已經(jīng)確定的情況,也可以用于循環(huán)次數(shù)不確定的情況。一般格式為for(表達(dá)式1;表達(dá)2;表達(dá)式3){語句;}/*循環(huán)體*/在for循環(huán)中,一般表達(dá)式1為初始化表達(dá)式,用于給循環(huán)變量賦初值;表達(dá)式2為循環(huán)測試表達(dá)式,對循環(huán)變量進(jìn)行判斷;表達(dá)式3為增量尺度表達(dá)式,用于對循環(huán)變量的值進(jìn)行更新,使循環(huán)變量不滿足條件而退出循環(huán)。它的執(zhí)行過程如下:1)先求解表達(dá)式1的值。2)再求解表達(dá)式2的值。若表達(dá)式2的值為真,則執(zhí)行循環(huán)體中的語句,并求解表達(dá)式3,然后重復(fù)執(zhí)行步驟(2)的操作;若表達(dá)式2的值為假,則結(jié)束for循環(huán),執(zhí)行后面的語句。單片機(jī)原理及接口技術(shù)例4-37

利用for語句編程實現(xiàn)1~100的累加和,并輸出結(jié)果。#include<reg51.h>/*包含特殊功能寄存器庫*/#include<stdio.h>/*包含I/O函數(shù)庫*/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)的嵌套若在一個循環(huán)結(jié)構(gòu)的循環(huán)體中又包含一個完整的循環(huán)結(jié)構(gòu),這種結(jié)構(gòu)稱為循環(huán)的嵌套。外面的循環(huán)結(jié)構(gòu)稱為外循環(huán),里面的循環(huán)結(jié)構(gòu)稱為內(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語言中,允許三種循環(huán)結(jié)構(gòu)相互嵌套。例4-38用嵌套結(jié)構(gòu)構(gòu)造一個延時程序。

voiddelay(unsignedintx){unsignedcharj;while(x--)

溫馨提示

  • 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

提交評論