




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌 入 式 系 統(tǒng) C51單片機(jī)C語言程序設(shè)計(jì)本章內(nèi)容:C51語言概述C51數(shù)據(jù)類型和數(shù)據(jù)存儲(chǔ)類型C51運(yùn)算符和表達(dá)式C51程序結(jié)構(gòu)C51函數(shù)【任務(wù)導(dǎo)入】 基于C51語言的靜態(tài)LED顯示系統(tǒng)的實(shí)現(xiàn):利用AT89C51單片機(jī)的I/O端口驅(qū)動(dòng)兩個(gè)八段數(shù)碼管從“00”到“99”流水顯示,即通電后,顯示“00”,間隔一段時(shí)間后,顯示“01”,再間隔一段時(shí)間后,顯示“02”,直到“99”,然后再顯示“00”,往復(fù)循環(huán)。【任務(wù)分析】要實(shí)現(xiàn)用兩個(gè)數(shù)碼管循環(huán)顯示數(shù)字0099的功能,我們可把兩個(gè)數(shù)碼管的段選線分別連接到單片機(jī)的兩組I/O口的共16根I/O口線上,再通過程序讓單片機(jī)的兩組I/O口分時(shí)輸出09對(duì)應(yīng)的
2、段碼就可以了。 C51語言概述1、C語言和C51語言(1)C語言是由早期的BCPL語言發(fā)展而來的。1967年,劍橋大學(xué)的理查茲(Martin Richards)在對(duì)CPL語言進(jìn)行簡(jiǎn)化的基礎(chǔ)上設(shè)計(jì)了BCPL(Basic Combined Pogramming Language)語言。 1970年,美國(guó)貝爾實(shí)驗(yàn)室的湯普森(Ken Thompson)以BCPL語言為基礎(chǔ),設(shè)計(jì)出簡(jiǎn)單且接近硬件的B語言 。1972年,美國(guó)貝爾實(shí)驗(yàn)室的里奇(D. M. Ritchie)又以B語言為基礎(chǔ),最終設(shè)計(jì)出了C的語言 1978年,美國(guó) 電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。 1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)
3、制定了一個(gè)C語言標(biāo)準(zhǔn)通常稱為ANSI C。ANSI C在被國(guó)際標(biāo)準(zhǔn)化組織ISO所接受后,又經(jīng)過多次修正,形成了目前的C語言標(biāo)準(zhǔn)。(2)C51語言 用C51編寫單片機(jī)程序時(shí),需要根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語言不需要考慮這些問題。另外,C51包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語言也有一定的區(qū)別。其他的語法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法則與標(biāo)準(zhǔn)的C語言相同。 C語言編譯調(diào)試工具效率高,數(shù)據(jù)類型及運(yùn)算符豐富,經(jīng)過不斷完善,能滿足單片機(jī)的開發(fā)要求,形成了單片機(jī)C語言。為了和ANSI C區(qū)別,把51單片機(jī)C語言稱為C51語言。 (3)C51
4、特點(diǎn) 編程者不需要了解單片機(jī)的指令系統(tǒng),僅要求對(duì)單片 機(jī)的存儲(chǔ)器結(jié)構(gòu) 有初步的了解,至于存儲(chǔ)器的分配、尋址方式及數(shù)據(jù)類型等完全由編譯器管理。 程序有規(guī)范化的結(jié)構(gòu),可以分為不同的函數(shù),這種方式可以使程序結(jié)構(gòu)化,將可變的選擇與特殊操作組合在一起,增強(qiáng)程序的可讀性。 編程和程序的調(diào)試時(shí)間顯著縮短,從而提高了編程的效率,提供的庫(kù)函數(shù)包含許多標(biāo)準(zhǔn)的子程序,具有較強(qiáng)的數(shù)據(jù)處理能力,可以將編好的程序很容易地移植到新程序。 C51作為一種非常方便的語言得到了廣泛的支持,目前已經(jīng)成為單片機(jī)開發(fā)的主要編程語言。簡(jiǎn)單C51程序介紹【例1】 如圖1所示,在口上接有一個(gè)LED發(fā)光二極管,要求讓發(fā)光二極管發(fā)光。圖1 接有
5、LED的單片機(jī)基本電路 #include sbit P1_0=P10;void main( ) P1_0=0;while(1);程序如下:程序的開始是一個(gè)文件包含處理。這段程序中包含的是文件,以.h為后綴的稱為頭文件,該頭文件的作用是把特殊功能寄存器中的符號(hào)和地址對(duì)應(yīng)起來,這里主要是應(yīng)用到P1這個(gè)符號(hào),如果沒有包含文件,C51編譯器不知道P1具體指什么,在編譯過程中就會(huì)發(fā)生錯(cuò)誤。給取名為P1_0,是通過編譯器中增加的關(guān)鍵字sbit來定義的 程序最后是主函數(shù),每一個(gè)C51程序有且只有一個(gè)主函數(shù),函數(shù)后面使用一對(duì)大括號(hào)“”,在“”中書寫具體內(nèi)容?!纠?】 如圖1所示,要求口上接的LED發(fā)光二極管能
6、閃爍發(fā)光。#include #define uchar unsigned char#define uint unsigned intsbit P1_0=P10;void Mdelay (uint Delay); /* 被調(diào)函數(shù)申明*/void main(void ) for(;) P1_0=!P1_0; / 對(duì)P1_0取反 Mdelay(1000); void Mdelay (uint Delay)/ 延時(shí)子程序,由Delay參數(shù)確定延時(shí)時(shí)間 uchar i; for( ;Delay0; Delay-) for (i=0; i124;i+) ; 與上例相同宏定義,即用一個(gè)指定的標(biāo)識(shí)符來代替一個(gè)
7、字符串,如第二行用uchar來代替unsigned char; 函數(shù)申明,如果被調(diào)函數(shù)在主調(diào)函數(shù)后面,一般需要聲明 小結(jié)(1) C51程序和C程序一樣,也是由函數(shù)構(gòu)成的。一個(gè)C51程序至有且只有一個(gè)main函數(shù),可以有零個(gè)或多個(gè)其他函數(shù),因此函數(shù)是C51程序的基本單位。main函數(shù)可以直接書寫語句或者調(diào)用其他函數(shù)來實(shí)現(xiàn)功能,被調(diào)用的函數(shù)可以是編譯器提供的庫(kù)函數(shù),也可以是用戶根據(jù)需要編寫的函數(shù)(如例中的Mdelay函數(shù))。使用Keil C編寫的任何程序都可以直接調(diào)用其提供的庫(kù)函數(shù),調(diào)用時(shí)只需要包含具有該函數(shù)的頭文件即可。Keil C提供了100多個(gè)庫(kù)函數(shù)供用戶直接使用。(2) 一個(gè)函數(shù)由以下兩部
8、分組成。 函數(shù)的首部,包括函數(shù)名、函數(shù)類型、函數(shù)參數(shù)名、參數(shù)類型。如例中Mdelay函數(shù)的首部為void Mdelay (uint Delay) 函數(shù)類型 函數(shù)名 參數(shù)類型 參數(shù)名 函數(shù)體,即函數(shù)首部下面大括號(hào)里的內(nèi)容。(3) 一個(gè)C51程序從main函數(shù)開始執(zhí)行,不管main函數(shù)在什么位置。(4) C51中字母區(qū)分大小寫,如定義是sbit P1_0=P10,若后面寫成P1_0,在編譯時(shí)就會(huì)出現(xiàn)錯(cuò)誤。(5) C51書寫自由,一行可以寫幾個(gè)語句,一個(gè)語句也能寫在幾行上。(6) 每個(gè)語句必須以分號(hào)結(jié)束。(7) C51中的注釋可以采用兩種符號(hào)。第一種是“/*/”符號(hào),從“/*”開始直到“*/”為止,
9、中間的內(nèi)容都是注釋。第二種是“/”引導(dǎo)的注釋語句,這種注釋只對(duì)本行有效。2 C51數(shù)據(jù)類型和數(shù)據(jù)存儲(chǔ)類型 2.1 常量與變量1、常量和符號(hào)常量 在程序運(yùn)行過程中,其值不能改變的量稱為常量,如10、0、0 x45等。常量一般從字面形式即可以判斷,這樣的常量稱為字面常量或者直接常量。 常量也可以用一個(gè)標(biāo)識(shí)符來表示,稱之為符號(hào)常量?!纠?】 如圖1所示,要求點(diǎn)亮口上接的LED燈。程序如下。#define LIGHT 0 xfe#include void main( ) P1=LIGHT;while(1);定義符號(hào)常量LIGHT,在以后的程序中出現(xiàn)的所有LIGHT,實(shí)際上都是指0 xfe 使用符號(hào)常量
10、的優(yōu)點(diǎn)如下: (1) 含義清楚。如上面程序中,從LIGHT就知道它代表燈亮,因此定義符號(hào)常量時(shí),應(yīng)考慮“見名知意”。在一個(gè)規(guī)范的C51程序中不提倡使用很多直接常量。如若定義sum=10+20+30,則在檢查程序時(shí)往往會(huì)搞不清楚各個(gè)常數(shù)代表什么含義。(2) 在需要改變一個(gè)量時(shí),可以做到一改全改。如#define PORTA 0 x7fff,在程序中要使用端口0 x7fff,可以用PORTA來代替,如果端口地址發(fā)生變化,變成0 x3fff,只要把定義語句改為#define PORTA 0 x3fff就行了。 變量值可以改變的量稱為變量。 圖2 變量2.2 整型數(shù)據(jù)1、整型常量的表示方法2、整型變量
11、 整型常量即整常數(shù),包括正整數(shù)、負(fù)整數(shù)和0,不能是小數(shù)。 可以是十進(jìn)制、八進(jìn)制(以0開頭)和十六進(jìn)制(以0 x開頭)。 整型變量的基本類型是int,可以根據(jù)數(shù)值的范圍將變量定義為基本整型、短整型或長(zhǎng)整型,在int之前分別加上修飾符:short(短整型)或long(長(zhǎng)整型)。在實(shí)際應(yīng)用中,變量的值常常是正的(如年齡、學(xué)號(hào)等),為了充分利用變量的表數(shù)范圍,可以將上面的三類定義成無符號(hào)型,即對(duì)以上三類分別加上修飾符unsigned。 表4-1 整型變量的數(shù)據(jù)類型類 型字 節(jié) 數(shù)數(shù)值范圍int2-215215-1unsigned int20216-1short int2-215215-1unsigne
12、d short int20216-1long int4-231231-1unsigned long int40232-1 C51中變量必須先定義才能使用,定義整型變量的方式為 修飾符 變量名 例如:int a; /定義一個(gè)整型變量a unsigned int a1,a2;/定義兩個(gè)整型變量a1,a2 long b; /定義一個(gè)長(zhǎng)整型變量b unsigned long b1,b2; /定義兩個(gè)長(zhǎng)整型變量b1,b22.3 實(shí)型數(shù)據(jù)1、實(shí)型常量的表示方法2實(shí)型變量實(shí)數(shù)又稱為浮點(diǎn)數(shù),實(shí)數(shù)有以下兩種表示形式。(1)、十進(jìn)制小數(shù)形式。由數(shù)字和小數(shù)點(diǎn)組成,如、等。(2)、指數(shù)形式。如34e2或34E2都代表
13、34102。 標(biāo)準(zhǔn)C語言中的實(shí)型變量分為單精度(float)、雙精度(double)和長(zhǎng)雙精度(long double)三種,但Keil C不支持后兩種,所以這里不做介紹。 float型占用4個(gè)字節(jié),能提供的有效數(shù)字是有限的,在有效位以外的數(shù)字會(huì)被舍去 。C51中實(shí)型數(shù)的使用應(yīng)該注意以下幾點(diǎn):(1)、在8位單片機(jī)中一般不要使用實(shí)型數(shù),這樣會(huì)降低程序的運(yùn)行速度,增加程序的長(zhǎng)度。(2)、程序中如果確實(shí)用到了實(shí)型數(shù),一般不是因?yàn)橐褂眯?shù)點(diǎn),而是因?yàn)橛闷渌愋偷淖兞糠秶粔虼蟆?3)、很多時(shí)候,可以用長(zhǎng)整型來代替實(shí)型。2.4 字符型數(shù)據(jù)1、字符型常量的表示方法 C51中字符型常量是用單引號(hào)括起來的一
14、個(gè)字符,如a、x、? 等都是字符型常量。C51還允許一些特殊形式的字符型常量,就是以一個(gè)“”開頭的字符序列。 表2 轉(zhuǎn)義字符及其含義字符形式含 義ASCII代碼n換行,將當(dāng)前位置移到下一行開頭10t水平制表,跳到下一個(gè)Tab位置9b退格,將當(dāng)前位置移到前一列8r回車,將當(dāng)前位置移到本行開頭13f換頁,將當(dāng)前位置移到下頁開頭12反斜杠符“”92單引號(hào)字符39雙引號(hào)字符34ddd13位八進(jìn)制數(shù)代表的字符xhh12位十六進(jìn)制數(shù)代表的字符2、字符型變量的表示方法 字符型變量用來存放字符常量,一個(gè)字符型變量只能存放一個(gè)字符。字符型變量的定義形式為: char 變量名 如:char a; 表示定義了一個(gè)字
15、符型變量a,a中可以存放一個(gè)字符,可以用下面的賦值語句給a賦值: a=c; 定義一個(gè)字符型變量,系統(tǒng)會(huì)為其分配一個(gè)字節(jié)的存儲(chǔ)空間,實(shí)際上,給字符型變量賦值后,并不是存儲(chǔ)字符型變量本身,而是存儲(chǔ)該字符型變量的ASCII碼,如上面是將c的ASCII碼99存儲(chǔ)在a中。由于ASCII碼也一定是整數(shù),字符型變量可以和前面所敘述的整型變量一樣,通過整型數(shù)據(jù)來賦值,如: char a=99;2.5 數(shù)組類型1、一維數(shù)組的定義 數(shù)組的維數(shù)是指表示數(shù)組使用的下標(biāo)個(gè)數(shù),如果數(shù)組中每個(gè)元素只帶有一個(gè)下標(biāo),稱這樣的數(shù)組為一維數(shù)組。一維數(shù)組的定義形式為:類型說明符 數(shù)組名常量表達(dá)式;如: int a4;2、一維數(shù)組的引
16、用 C51中,一個(gè)數(shù)組不能整體應(yīng)用,數(shù)組名是一個(gè)地址常量,不能對(duì)其賦值,只能使用數(shù)組中的元素。方法如下: 數(shù)組名下標(biāo) 下標(biāo)可以是整型變量或整型表達(dá)式,如a0、ai(i是一個(gè)整型變量)。3、一維數(shù)組的初始化(1)、在定義數(shù)組時(shí)對(duì)數(shù)組元素初始化,如: int a4=1,2,3,4; 經(jīng)過初始化后,a0=1、a1=2、a2=3、a3=4。(2)、可以只給一部分元素賦值,如: int a4=1,2; 經(jīng)過初始化后,a0=1、a1=2、a2=0、a3=0。(3)、對(duì)全部數(shù)組元素賦值時(shí),可以不指定數(shù)組長(zhǎng)度。如: “int a4=1,2,3,4;”可以寫成“int a=1,2,3,4;”。4、字符數(shù)組 字符
17、數(shù)組是指數(shù)組中元素的數(shù)據(jù)類型是字符類型的一維數(shù)組。字符數(shù)組引用、初始化的方法都與一維數(shù)組相同,只是要注意字符數(shù)組的元素是字符,有特殊的字面表示格式。 字符數(shù)組初始化的方法也和一維數(shù)組相同。如: char s5=1, 2, 3, 4, 5; char s5= 1, 2; char s=1, 2, 3, 4, 5; 2.6 指針類型 指針的含義是地址,所謂變量的指針就是指變量的地址,定義指針類型的變量實(shí)際上是定義一種用來存儲(chǔ)地址的變量。單片機(jī)中存儲(chǔ)器的地址有兩種 一種是由8位二進(jìn)制數(shù)(1字節(jié))來表示的地址,如內(nèi)部數(shù)據(jù)存儲(chǔ)器 。還有一種是由16位二進(jìn)制數(shù)(2字節(jié))來表示的地址,如程序存儲(chǔ)器、外部數(shù)據(jù)
18、存儲(chǔ)器等。 1、基于存儲(chǔ)器的指針類型 所謂基于存儲(chǔ)器的指針類型是指在定義指針變量時(shí),就確定好它存儲(chǔ)的是什么地方變量的地址,如是在內(nèi)部數(shù)據(jù)存儲(chǔ)器,還是外部數(shù)據(jù)存儲(chǔ)器,或者是程序存儲(chǔ)器,這樣,這些指針的長(zhǎng)度就可以具體確定(1字節(jié)或2字節(jié))。 具體定義為: char xdata *ptr;(1)、定義指針類型變量時(shí),在變量名前加“*”,變量名取名規(guī)則和前面一般變量相同。(2)、xdata 是指ptr里存儲(chǔ)的是定義在外部數(shù)據(jù)存儲(chǔ)器里變量的地址,所以ptr占2個(gè)字節(jié)。 2、一般指針類型 一般指針包括3字節(jié),其中的2字節(jié)用于存儲(chǔ)地址,另外1字節(jié)用于存儲(chǔ)類型,如表4-3所示。表3 一般指針構(gòu)成地 址第1字節(jié)
19、第2字節(jié)第3字節(jié)內(nèi) 容存儲(chǔ)器類型地址高8位地址低8位 其中第1字節(jié)表示存儲(chǔ)器類型,存儲(chǔ)器類型編碼如表4-4所示。 表4 一般指針存儲(chǔ)器類型存儲(chǔ)器類型內(nèi)部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存器一個(gè)頁面(256字節(jié))內(nèi)部數(shù)據(jù)存儲(chǔ)器程序存儲(chǔ)器值12345 如一個(gè)一般指針指向地址為0 x1234的外部數(shù)據(jù)存儲(chǔ)器時(shí),其指針】值如表4-5所示。 表5 指向外部數(shù)據(jù)存儲(chǔ)器的指針值地 址第1字節(jié)第2字節(jié)第3字節(jié)內(nèi) 容0 x020 x120 x342.7 Keil C51中特有的數(shù)據(jù)類型1、位型變量 位型變量實(shí)際是定義一個(gè)二進(jìn)制位來存儲(chǔ)數(shù)據(jù),其值有“0”和“1”兩種。定義形式如下: bit 變量名;如: bit
20、flag;/定義一個(gè)位變量flag使用位變量時(shí)還要注意以下幾點(diǎn)。(1)、不能定義位型數(shù)組。(2)、不能定義位型指針。2、sfr型數(shù)據(jù) 8051單片機(jī)內(nèi)部的特殊功能寄存器并不能直接被C51所接受,為了定義這些特殊功能寄存器,增加了sfr、sfr16、sbit這3個(gè)關(guān)鍵詞。(1)、sfr是定義特殊功能寄存器和其地址的對(duì)應(yīng)關(guān)系,其用法為 sfr 變量名=地址值;(2)、在特殊功能寄存器中,有一些是由兩個(gè)地址連續(xù)的8位寄存器組成,如DPTR是由DPH和DPL組成,可以分開定義這兩個(gè)特殊功能寄存器,也可以用sfr16來定義,如: sfr16 DPTR=0 x82;(3)、sbit是定義特殊功能寄存器中可
21、以位尋址的相應(yīng)位,sbit的用法有以下三種。 bit 位變量名=地址值; sbit 位變量名=SFR名稱變量位地址值; sbit 位變量名=SFR地址變量位地址值;2.8 數(shù)據(jù)的存儲(chǔ)類型表6 C51存儲(chǔ)類型與8051存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存 儲(chǔ) 區(qū)描 述data片內(nèi)RAM的低128字節(jié),可在一個(gè)周期內(nèi)直接尋址bdata片內(nèi)RAM的位尋址區(qū),16字節(jié)idata片內(nèi)RAM的256字節(jié),必須采用間接尋址xdata外部數(shù)據(jù)存儲(chǔ)區(qū),使用DPTR間接尋址pdata外部存儲(chǔ)區(qū)的256字節(jié),通過P0口的地址對(duì)其尋址。使用MOVX Ri,需要兩個(gè)指令周期code程序存儲(chǔ)區(qū),使用DPTR尋址3 運(yùn)算符和表達(dá)式3.1
22、算術(shù)運(yùn)算符和算術(shù)表達(dá)式 (1)、+ 加法運(yùn)算符,如4+3。(2)、- 減法運(yùn)算符,如5-3。(3)、* 乘法運(yùn)算符,如5*8。(4)、/ 除法運(yùn)算符,如10/3。(5)、% 求模運(yùn)算符或取余運(yùn)算符,“%”兩側(cè)應(yīng)該都為整型數(shù)據(jù),如10%3。 需要說明,基本的算術(shù)運(yùn)算符都是雙目運(yùn)算符,即需要兩個(gè)操作數(shù);對(duì)于“/”,若兩個(gè)整數(shù)相除,結(jié)果為整數(shù),如有小數(shù)自動(dòng)舍去(注意不是四舍五入),如10/3,結(jié)果是3,而不是,如果需要得到真實(shí)結(jié)果,需要寫成。1、基本的算術(shù)運(yùn)算符(1)、+ 自增運(yùn)算符。(2)、- 自減運(yùn)算符。 需要說明,+和-是單目運(yùn)算符;+和-只能用于變量,不能用與常量和表達(dá)式;+j 先自增,再使
23、用,j+ 先使用,后自增,如: a=2;b=+a; 結(jié)果是b=3,a=3。 a=2;b=a+; 結(jié)果是b=2,a=3。2、自增/自減運(yùn)算符 用算術(shù)運(yùn)算符和括號(hào)將操作數(shù)(運(yùn)算對(duì)象)連接起來,形成符合C51語法規(guī)則的表達(dá)式,稱為算術(shù)表達(dá)式,操作數(shù)包括常量、變量、函數(shù)等,如a*b+(5-c/3)。 C51規(guī)定了運(yùn)算符的優(yōu)先性和結(jié)合性,在表達(dá)式求值的時(shí)候,先按運(yùn)算符的優(yōu)先性運(yùn)算,如先乘除求余,再運(yùn)算加減,如a-b*c,b的左側(cè)是減號(hào),右側(cè)是乘號(hào),乘號(hào)的優(yōu)先性大于減號(hào),因此,相當(dāng)于a-(b*c)。如果在一個(gè)表達(dá)式中前后運(yùn)算符的優(yōu)先性相同,則按規(guī)定的結(jié)合方向處理,C51規(guī)定了算術(shù)運(yùn)算符的方向是自左向右,如
24、a+b-c,應(yīng)先執(zhí)行a+b的運(yùn)算,再與c相減。3、算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先性與結(jié)合性4、各類數(shù)值性數(shù)據(jù)間的混合運(yùn)算 C51中,整型數(shù)據(jù)、字符型數(shù)據(jù)、實(shí)型數(shù)據(jù)都可以進(jìn)行混合運(yùn)算,轉(zhuǎn)換規(guī)則如圖3所示。圖3 數(shù)據(jù)類型轉(zhuǎn)換3.2 賦值運(yùn)算符和賦值表達(dá)式1、賦值運(yùn)算符 符號(hào)“=”為賦值運(yùn)算符,其作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量,如x=5的作用是將常數(shù)5賦給變量x。也可以將一個(gè)表達(dá)式的值賦給變量,如x=5+y。2、類型轉(zhuǎn)換 賦值運(yùn)算符的兩側(cè)如果類型不一樣,也是可以賦值的,但賦值時(shí)需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換, 3賦值表達(dá)式賦值表達(dá)式的一般形式為變量 賦值運(yùn)算符 表達(dá)式如a=5、a=5+6、a=b=5等都是賦值表達(dá)式。
25、注意:賦值運(yùn)算符的優(yōu)先性低于算術(shù)運(yùn)算符。3.3 逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式 在C51中,多個(gè)表達(dá)式可以用逗號(hào)分開,如3+5,5+6,7+8,其中的逗號(hào)稱為逗號(hào)運(yùn)算符,由逗號(hào)運(yùn)算符組成的表達(dá)式稱為逗號(hào)表達(dá)式,其一般形式為表達(dá)式1,表達(dá)式2,表達(dá)式n 逗號(hào)表達(dá)式的求解過程是:先求表達(dá)式1,再求表達(dá)式2,直到最后一個(gè)表達(dá)式,但整個(gè)表達(dá)式的值是最后一個(gè)表達(dá)式的值。如3+5,5+6,7+8逗號(hào)表達(dá)式的值為15 注意:逗號(hào)運(yùn)算符的優(yōu)先性低于賦值運(yùn)算符。3.4 關(guān)系運(yùn)算符和關(guān)系表達(dá)式1、關(guān)系運(yùn)算符C51中提供了以下6種關(guān)系運(yùn)算符。(1) 小于。(2) 大于。(4)= 大于等于。(5)= 等于。(6)!= 不等于
26、。優(yōu)先性的次序如下:(1)、前4種關(guān)系運(yùn)算符(、=)的優(yōu)先性相同,后2種(=、!=)的優(yōu)先性也相同,前4種的優(yōu)先性高于后2種。(2)、關(guān)系運(yùn)算符的優(yōu)先性低于算術(shù)運(yùn)算符。(3)、關(guān)系運(yùn)算符的優(yōu)先性高于賦值運(yùn)算符。2、關(guān)系表達(dá)式 用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子稱為關(guān)系表達(dá)式,如:ab、a+bb+c、a!=b。 關(guān)系表達(dá)式的值只有兩種:“真”和“假”。在C51中,運(yùn)算結(jié)果如果是“真”,則用數(shù)值“1”表示;運(yùn)算結(jié)果如果是“假”,則用“0”表示。3.5 邏輯運(yùn)算符和邏輯表達(dá)式1邏輯運(yùn)算符C51提供了以下3種邏輯運(yùn)算符。(1)& 邏輯與。(2)| 邏輯或。(3)! 邏輯非?!?!”的優(yōu)先性高于算術(shù)運(yùn)
27、算符,而“&”和“|”的優(yōu)先性相同,處于關(guān)系運(yùn)算符和賦值運(yùn)算符之間。2、邏輯表達(dá)式 用邏輯運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子稱為邏輯表達(dá)式,邏輯表達(dá)式的運(yùn)算結(jié)果用“1”表示“真”,用“0”表示“假”。但在判斷一個(gè)量是否為“真”時(shí),以0代表“假”,而以非0代表“真”,如(1)若a=5,!a的值為0;若a=-2,結(jié)果也一樣。(2)若a=5、b=8,則a&b的值為1;若a=0、b=8,則a&b的值為0。 3.6 位操作運(yùn)算符和表達(dá)式 C51提供了如下的位操作運(yùn)算符。(1)& 按位與。(2)| 按位或。(3) 按位異或。(4) 按位取反。(5) 位右移。 4 C51程序結(jié)構(gòu) 在結(jié)構(gòu)上可以把C51程序分為
28、3類,即順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。4.1 順序結(jié)構(gòu) 順序結(jié)構(gòu)是一種最基本、最簡(jiǎn)單的編程結(jié)構(gòu),在這種結(jié)構(gòu)下,程序按低地址向高地址順序執(zhí)行指令代碼,下面通過一個(gè)例子來熟悉C51的順序結(jié)構(gòu)?!纠?】 求兩個(gè)數(shù)的和。 定義兩個(gè)變量,先對(duì)其進(jìn)行賦值,再求出兩個(gè)數(shù)的和,程序代碼如下。 main( ) int a, b, sum; a=3; b=2;sum=a+b;4.2 選擇結(jié)構(gòu)1、if語句(1)if(表達(dá)式) 語句如果表達(dá)式為“真”,則執(zhí)行語句,否則執(zhí)行if語句后面的語句,如: if (a5) b=3;(2)if(表達(dá)式) 語句1 else 語句2 如果表達(dá)式為“真”,則執(zhí)行語句1,否則執(zhí)行語句2,
29、如: if (a10) b=1;else if (a6) b=2;else if (a2) b=3;else b=4;【例6】 電路如圖5所示。要求:通電初始,燈全滅;按住K1,8個(gè)LED燈全亮;松開K1,燈全滅。圖5 帶8個(gè)LED燈和2個(gè)按鈕的單片機(jī)電路程序如下:#include reg51.hvoid main( ) P1=0 xff; / 把P1口全部置1,8個(gè)燈滅 for(; ;) P3=P3|0 x01; / 把口置1 if (P3&0 x01)=0) / 判斷K1是否按下 P1=0 x00; / K1按下后,點(diǎn)亮全部燈 else P1=0 xff; / K1松開后,熄滅全部燈 2、
30、if語句的嵌套if(表達(dá)式1) if (表達(dá)式2) 語句1 else 語句2else if (表達(dá)式3) 語句3 else 語句4使用if嵌套語句特別要注意if和else配對(duì),else總是和最近的if配對(duì) 3、條件運(yùn)算符 可以用max=(ab)? a:b來表示。其中(ab)? a:b為條件表達(dá)式,執(zhí)行過程是:如果(ab)為“真”,表達(dá)式的值為a;如果(ab)為“假”,表達(dá)式的值為b。條件運(yùn)算符的一般格式為:表達(dá)式1?表達(dá)式2:表達(dá)式3如:if (ab) max=a; else max=b;4、switch語句 實(shí)際問題中,往往遇到以一個(gè)變量或表達(dá)式的值為判斷條件,將此變量或表達(dá)式的值分成幾段,
31、每一段對(duì)應(yīng)一種選擇或操作,這種情況用if語句來嵌套非常麻煩,于是,C51提供了switch語句。 switch語句的一般結(jié)構(gòu)如下:switch (表達(dá)式) case 常量表達(dá)式1:語句1,break; case 常量表達(dá)式2:語句2,break; case 常量表達(dá)式n:語句n,break; default:語句n+1,break;說明:(1)、switch語句后面的表達(dá)式可以是任何類型。 、若表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式值相同,就 開始執(zhí)行其后面的語句;如果沒有一個(gè)case后面的常量表 達(dá)式值與表達(dá)式值相同,則執(zhí)行default后面的語句。(3)、每一個(gè)case后面的常量表達(dá)式
32、值必須不同。、執(zhí)行完一個(gè)case后面的語句后,系統(tǒng)并不跳出,而是執(zhí)行 后面的case語句,直到結(jié)束。如果需要執(zhí)行完當(dāng)前case語 句后,系統(tǒng)就跳出,需要在后面加break,如: case 常量表達(dá)式:語句;break;4.3 循環(huán)結(jié)構(gòu)構(gòu)成循環(huán)結(jié)構(gòu)的主要有while、do-while和for等語句。 1、while 循環(huán)語句while語句的一般表達(dá)形式為:while (表達(dá)式) 語句當(dāng)表達(dá)式的判斷為“真”時(shí),執(zhí)行大括號(hào)內(nèi)的語句,否則不執(zhí)行。2、do-while 循環(huán)語句 do-while語句是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立,其一般形式為: do 語句 while(表達(dá)式); while和
33、do-while語句雖然都是循環(huán)語句,但是兩者是有區(qū)別的,do-while語句不管條件是否成立,至少都會(huì)執(zhí)行一次循環(huán)體;而while語句,如果條件不成立,則不會(huì)執(zhí)行循環(huán)體。 3、for 循環(huán)語句for語句的一般形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句for循環(huán)語句的執(zhí)行過程如下。(1)先求解表達(dá)式1。(2)求解表達(dá)式2,如果結(jié)果為“真”,即條件成立,則執(zhí)行循環(huán)體語句;如果結(jié)果為“假”,轉(zhuǎn)到第(5)步。(3)求解表達(dá)式3。(4)轉(zhuǎn)回第(2)步。(5)退出for循環(huán)語句,執(zhí)行下面的語句。for循環(huán)中有幾種特例,分析如下。(1)表達(dá)式1可以沒有,但其分號(hào)不能省略。(2)表達(dá)式2也可以沒有,
34、同樣分號(hào)不能省略,這樣認(rèn)為條件永遠(yuǎn)滿足。(3)表達(dá)式3也可以省略。(4)如果三個(gè)表達(dá)式都省略,即for(; ;),它的作用相當(dāng)于while(1),構(gòu)成了一個(gè)無限循環(huán)的過程。4、break語句和continue語句 在一個(gè)循環(huán)語句中,可以通過判斷條件來退出循環(huán),也可以通過break語句來強(qiáng)制退出循環(huán)。 continue語句用于結(jié)束本次循環(huán),即跳過循環(huán)體下面的語句,而直接進(jìn)行下一次是否循環(huán)的判斷?!纠?1】 電路如圖5所示。要求:開機(jī)后,全部燈不亮;按下K1后,則從VD1開始依次點(diǎn)亮,至VD8后停止并全部熄滅;待再次按下K1,重復(fù)上面過程;如果中間K2被按下,則燈立即全部熄滅,并返回初始狀態(tài)。#i
35、nclude reg51.h#include intrins.hvoid Delay( unsigned int delaytime)/ 延時(shí)子程序 unsigned char i; for( ; delaytime0;delaytime-) for( i=0; i=124; i+);void main( )unsigned char light=0 xfe; unsigned char i; for(;) P3=P3|0 x03; if (P3&0 x01)= =0) for(i=0;i=7;i+) light=0 xfe; Delay(1000); if (P3&0 x02)= =0) b
36、reak; light=_crol_(light, i); P1=light; P1=0 xff;5 C51函數(shù)5.1 函數(shù)的定義 一個(gè)完整的C51程序可由一個(gè)主函數(shù)和若干個(gè)子函數(shù)組成,由主函數(shù)調(diào)用子函數(shù),子函數(shù)之間也可以互相調(diào)用,同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意次。 從函數(shù)的形式上劃分,函數(shù)有無參函數(shù)和有參函數(shù)兩種形式,下面分別討論兩種函數(shù)的定義方法。1、無參函數(shù)的定義 無參函數(shù)的定義形式為: 類型標(biāo)識(shí)符 函數(shù)名(void) 函數(shù)體 類型標(biāo)識(shí)符是指定函數(shù)返回值的類型,如果函數(shù)沒有返回值,則可以定義“void”類型,函數(shù)名的取名規(guī)則和變量的取名規(guī)則一樣。2、有參函數(shù)的定義有參函數(shù)的定義形
37、式為類型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)列表) 函數(shù)體 3、函數(shù)參數(shù)傳遞 函數(shù)之間參數(shù)的傳遞由函數(shù)調(diào)用時(shí)主調(diào)函數(shù)的實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)和被調(diào)函數(shù)的形式參數(shù)(簡(jiǎn)稱形參)之間的數(shù)據(jù)傳遞完成。所謂的實(shí)際參數(shù)是指調(diào)用時(shí)函數(shù)名后面括號(hào)里的表達(dá)式,其個(gè)數(shù)和被調(diào)函數(shù)的形式參數(shù)個(gè)數(shù)一致,以int max (int x, int y)為例,定義的形式參數(shù)有x和y兩個(gè),當(dāng)主調(diào)函數(shù)調(diào)用時(shí),將會(huì)寫成如下形式: a=max(5,9); a是假設(shè)主調(diào)函數(shù)中的一個(gè)變量,5和9是實(shí)際參數(shù),在調(diào)用時(shí),把5賦給x、9賦給y。5.2 函數(shù)的調(diào)用1、函數(shù)的調(diào)用形式函數(shù)調(diào)用的一般形式為函數(shù)名(實(shí)參列表)函數(shù)在調(diào)用時(shí)一般有三種調(diào)用方式。(1)、
38、把函數(shù)作為一個(gè)語句,如: Delay(); 這時(shí)不要求函數(shù)有返回值,只要求函數(shù)完成一定的功能操作。、函數(shù)在一個(gè)表達(dá)式中,出現(xiàn)函數(shù)表達(dá)式,這要求函數(shù)帶回 一個(gè)確定的值以參加表達(dá)式的運(yùn)算。(3)、函數(shù)作為參數(shù)調(diào)用,如: c=max(a,max(b,c); max(b,c)的返回值是作為外部max的一個(gè)參數(shù)。2調(diào)用函數(shù)的聲明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)必須同時(shí)具備以下一些條件。(1)、被調(diào)函數(shù)一定存在,可以自己編寫,也可以是庫(kù)函數(shù)。(2)、如果是庫(kù)函數(shù),一般應(yīng)在文件開頭用#include命令將調(diào)用庫(kù)函數(shù)時(shí)所用到的信息包含到文件中。(3)、如果使用用戶自定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(主
39、調(diào)函數(shù))在同一文件中,一般還應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用的函數(shù)做聲明。函數(shù)原型的一般形式有以下兩種。(1)、函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,)(2)、函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,參數(shù)類型2 參數(shù)名2,)注意:如果被調(diào)函數(shù)在主調(diào)函數(shù)的后面,可以不用聲明。 5.3 局部變量和全局變量 一個(gè)C51程序中的變量可以僅在一個(gè)函數(shù)中使用,也可以在所有的函數(shù)中使用,這就要引入局部變量和全局變量的概念。1局部變量 在一個(gè)函數(shù)內(nèi)部定義的變量稱為局部變量,它只在這個(gè)函數(shù)內(nèi)有效。 2全局變量 一個(gè)源文件可以包含一個(gè)函數(shù)或若干個(gè)函數(shù),在函數(shù)之外定義的變量稱為全局變量,全局變量在本文件的任何函數(shù)中都可以使用 。庫(kù)函數(shù)介紹1函數(shù)名_crol_2函數(shù)名_cror_3函數(shù)名_irol_4函數(shù)名_iror_5函數(shù)名_lrol_6函數(shù)名_lror_7函數(shù)名_nop_8函數(shù)名 _testbit_5.5 中斷程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五暑期工勞務(wù)派遣與就業(yè)環(huán)境優(yōu)化合同
- 二零二五年度物流公司貨車司機(jī)服務(wù)質(zhì)量考核與獎(jiǎng)勵(lì)協(xié)議
- 2025年度網(wǎng)絡(luò)安全防護(hù)等級(jí)評(píng)定安全協(xié)議書
- 2025年度汽車零部件貨物運(yùn)輸安全與質(zhì)量協(xié)議
- 二零二五年度環(huán)保產(chǎn)業(yè)技術(shù)人才招聘與綠色創(chuàng)新協(xié)議
- 2025年度環(huán)保型清潔公司員工聘用合同書
- 二零二五年度水利設(shè)施監(jiān)控維保及災(zāi)害預(yù)警服務(wù)合同
- 二零二五年度海鮮水產(chǎn)店轉(zhuǎn)讓與經(jīng)營(yíng)協(xié)議
- 二零二五年度倆人共同創(chuàng)業(yè)經(jīng)營(yíng)咖啡廳合伙協(xié)議
- 二零二五年度農(nóng)村土地租賃合同模板(現(xiàn)代農(nóng)業(yè)物流園區(qū))
- 醫(yī)學(xué)專家談靈芝孢子粉課件
- 開心麻花《白蛇前傳》劇本
- 全部編版三年級(jí)語文下冊(cè)生字讀音、音序、偏旁及組詞
- 六年級(jí)下冊(cè)英語全冊(cè)教案(冀教版)
- 血小板血漿(PRP)課件
- 腹部開放性損傷急救
- 二輪 河流專題(精心)
- 球墨鑄鐵管安裝規(guī)范及圖示課件
- ERCP講義教學(xué)課件
- 《人類行為與社會(huì)環(huán)境》課件
- 兒科病毒性腦炎課件
評(píng)論
0/150
提交評(píng)論