版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
09:44180C51單片機(jī)的軟件基礎(chǔ)單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第1頁。09:442內(nèi)容80C51單片機(jī)的指令系統(tǒng)4.1C51程序設(shè)計基礎(chǔ)4.2C51語言的語句4.3
C51的函數(shù)4.4C51的程序結(jié)構(gòu)4.5單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第2頁。09:443
單片機(jī)應(yīng)用系統(tǒng)是由硬件和軟件共同組成的。要使單片機(jī)實現(xiàn)所需要的控制功能,必須有控制軟件,沒有控制軟件的單片機(jī)是毫無用處的。
機(jī)器語言是計算機(jī)唯一能識別的語言,用匯編語言和高級語言編寫的程序(稱為源程序)最終都必須翻譯成機(jī)器語言的程序(稱為目標(biāo)程序),計算機(jī)才能識別。匯編語言是能夠利用單片機(jī)所有特性直接控制硬件的語言,它直接使用CPU的指令系統(tǒng)和尋址方式,從而得到占用空間小、執(zhí)行速度快的高質(zhì)量程序。對于一些實時控制要求高的場合,匯編語言是必不可少的。但對于較復(fù)雜的單片機(jī)應(yīng)用系統(tǒng),它的編寫效率很低。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第3頁。09:444
為了提高軟件的開發(fā)效率,編程人員采用高級語言C語言來開發(fā)單片機(jī)應(yīng)用程序。
目前許多軟件公司致力于單片機(jī)C編譯器的開發(fā)研究,許多C編譯器的效率已接近匯編語言的水平,對于較復(fù)雜的應(yīng)用程序,C語言產(chǎn)生的代碼效率甚至超出了匯編語言。同時目前單片機(jī)片內(nèi)程序存儲器的發(fā)展十分迅速,許多型號的單片機(jī)片內(nèi)ROM已經(jīng)達(dá)到64KB甚至更大,且具備在系統(tǒng)編程(ISP)功能,進(jìn)一步推動了C語言在單片機(jī)應(yīng)用系統(tǒng)開發(fā)中的應(yīng)用。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第4頁。09:4454.2C51程序設(shè)計基礎(chǔ)1.頭文件不同。
C51系列單片機(jī)頭文件集中體現(xiàn)了各芯片的不同功能,如定時器、中斷、I/O等數(shù)量和功能的不同。2.數(shù)據(jù)類型不同。由于80C51系列單片機(jī)包含了位操作空間和豐富的位操作指令,可靈活地進(jìn)行位指令操作。
3.數(shù)據(jù)存儲類型不同。C51中的存儲類器型有code、data、idata、xdata,以及bdata、pdata類型。C51與ANSIC不同,它分為SMALL、COMPACT、LARGE模式,各種不同的模式對應(yīng)不同的實際硬件系統(tǒng),也將有不同的編譯結(jié)果。4.2.1C51和標(biāo)準(zhǔn)ANSIC的區(qū)別單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第5頁。09:446
4.在函數(shù)的使用上有所不同。單片機(jī)資源有限,不允許太多的程序嵌套。C51有更為豐富的庫函數(shù)。ANSIC中的printf和scanf,通常用于屏幕打印和接收字符,在C51中,主要用于串行通信口數(shù)據(jù)的發(fā)送和接收。5.在編譯上有所不同。由于80C51系列單片機(jī)是8位機(jī),擴(kuò)展16位字符Unicode不被C51支持,并且ANSIC所具備的遞歸特性不被C51所支持。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第6頁。09:4474.2.2C51程序結(jié)構(gòu)分析
例2-1第1章1.1.5節(jié)中介紹了點亮一個發(fā)光二極管的控制系統(tǒng),在圖1-2硬件不變的基礎(chǔ)上,編寫并調(diào)試讓二極管以間隔1s的時間亮滅閃爍的程序。#include<reg52.h>//52系列單片機(jī)頭文件sbitled1=P1^0;//聲明單片機(jī)P1口的第一位unsignedinti,j;//聲明無符號整型變量i,jvoidmain()//主函數(shù){while(1)//大循環(huán)
{ led1=0;//點亮發(fā)光二極管D1 for(i=1000;i>0;i--)//延時
for(j=110;j>0;j--); led1=1;//關(guān)閉發(fā)光二極管D1 for(i=1000;i>0;i--)//延時
for(j=110;j>0;j--); }}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第7頁。09:448
1.文件包含指令#include“文件名”或#include<文件名>
上述兩種格式略有區(qū)別。前者表示先從當(dāng)前源文件所在的目錄中查找被包含的文件,如果找不到,再到軟件安裝文件夾處去查找,也就是到Keil/C51/INC文件夾下尋找。后者表示直接到軟件安裝文件夾處去查找,這種方法一般用于包含頭文件,如#include<reg52.h>,#include<stdio.h>等。例2-1單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第8頁。09:449
2.數(shù)據(jù)類型聲明和函數(shù)聲明例2-1中程序的第二行聲明led1是可尋址位的類型數(shù)據(jù),它的意思是將P1口鎖存器的第0位重新命名為led1,以后我們要操作P1口的第0位時,就可直接操作led1。程序的第三行unsignedinti,j聲明i,j是無符號整數(shù)型變量。例2-1單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第9頁。09:4410
3.主函數(shù)mainC語言的程序都是由若干個函數(shù)組成的,每個程序有且只有一個主函數(shù)。
一個C程序總是從main()函數(shù)開始執(zhí)行的。main后的小括號通常為空,說明該函數(shù)為無參函數(shù),程序?qū)懺谄浜蟮拇罄ㄌ栔小hile(1)為循環(huán)控制語句,該控制語句使程序始終執(zhí)行while(1)后大括號中的語句。led1=0;使P1口的第0位輸出0信號,點亮發(fā)光二極管,led1=1使P1口的第0位輸出1信號,熄滅發(fā)光二極管,兩條for語句用于拖延時間。#include<reg52.h>//52系列單片機(jī)頭文件sbitled1=P1^0;//聲明單片機(jī)P1口的第一位unsignedinti,j;//聲明無符號整型變量i,jvoidmain()//主函數(shù){while(1)//大循環(huán)
{ led1=0;//點亮發(fā)光二極管D1 for(i=1000;i>0;i--)//延時
for(j=110;j>0;j--); led1=1;//關(guān)閉發(fā)光二極管D1 for(i=1000;i>0;i--)//延時
for(j=110;j>0;j--); }}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第10頁。09:44114.2.3C51的標(biāo)識符和關(guān)鍵字
標(biāo)識符常用來聲明源程序中某個對象的名稱,比如變量與常量的聲明,數(shù)組和結(jié)構(gòu)的聲明,自定義函數(shù)的聲明以及數(shù)據(jù)類型的聲明等。如
intcount;//count為整型變量的標(biāo)識符
charname[20];//name為包含20個元素的數(shù)組的標(biāo)識符
說明:C51的標(biāo)識符可以由字母、數(shù)字(0~9)和下劃線組成,最多可支持32個字符。其中標(biāo)識符的第一個字符必須為字母或下劃線,例如count2是正確的,而2count則是錯誤的。通常以下劃線開頭的標(biāo)識符是編譯系統(tǒng)專用的,因此在編寫C語言源程序時一般不要使用以下劃線開頭的標(biāo)識符。而且C語言是區(qū)分大小寫的,name與NAME是兩個不同的標(biāo)識符
。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第11頁。09:44124.2.3C51的標(biāo)識符和關(guān)鍵字
關(guān)鍵字是C51編譯器已定義保留的特殊標(biāo)識符,又稱為保留字,它們具有固定的名稱和功能,如int、if、for等等。在KeilC51開發(fā)環(huán)境的文本編輯器中編寫C程序,系統(tǒng)會把關(guān)鍵字以不同顏色顯示。在C語言的程序編寫中不允許標(biāo)識符與關(guān)鍵字相同。與其他計算機(jī)語言相比,C語言的關(guān)鍵字較少,ANSIC標(biāo)準(zhǔn)共規(guī)定了32個關(guān)鍵字,單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第12頁。09:4413表4-7ANSIC標(biāo)準(zhǔn)關(guān)鍵字序號關(guān)鍵字用途說明1auto存儲種類說明說明局部變量為自動變量,為默認(rèn)值2break程序語句退出最內(nèi)層循環(huán)體3case程序語句switch語句中的選擇項4char數(shù)據(jù)類型聲明聲明字符型數(shù)據(jù)5const存儲類型聲明在程序執(zhí)行過程中不可更改的常量值6continue程序語句轉(zhuǎn)向下一次循環(huán)7default程序語句switch語句中的“其他”分支8do程序語句構(gòu)成do…while循環(huán)結(jié)構(gòu)9double數(shù)據(jù)類型聲明雙精度浮點數(shù)10else程序語句構(gòu)成if…else選擇結(jié)構(gòu)11enum數(shù)據(jù)類型聲明枚舉12extern存儲種類聲明在其他程序模塊中聲明了的全局變量13float數(shù)據(jù)類型聲明單精度浮點數(shù)14for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)15goto程序語句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第13頁。09:4414續(xù)表4-7ANSIC標(biāo)準(zhǔn)關(guān)鍵字16if程序語句構(gòu)成if…else選擇結(jié)構(gòu)17int數(shù)據(jù)類型聲明整型數(shù)18long數(shù)據(jù)類型聲明長整型數(shù)19register存儲種類聲明寄存器變量20return程序語句函數(shù)返回21short數(shù)據(jù)類型聲明短整型數(shù)22signed數(shù)據(jù)類型聲明有符號數(shù),二進(jìn)制數(shù)據(jù)的最高位為符號位23sizeof運算符計算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)24static存儲種類聲明靜態(tài)變量25struct數(shù)據(jù)類型聲明結(jié)構(gòu)類型數(shù)據(jù)26switch程序語句構(gòu)成switch選擇結(jié)構(gòu)27typedef數(shù)據(jù)類型聲明為系統(tǒng)固有的數(shù)據(jù)類型起別名28union數(shù)據(jù)類型聲明聯(lián)合類型數(shù)據(jù)29unsigned數(shù)據(jù)類型聲明無符號數(shù)據(jù)30void數(shù)據(jù)類型聲明無類型數(shù)據(jù)31volatile數(shù)據(jù)類型聲明該變量在程序執(zhí)行中可被隱含地改變32while程序語句構(gòu)成while和do…while循環(huán)結(jié)構(gòu)單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第14頁。09:4415表4-8
KeilC51編譯器擴(kuò)展的關(guān)鍵字
序號關(guān)鍵字用途說明1_at_地址定位為變量定義存儲空間絕對地址2alien函數(shù)特性說明聲明與PL/M51兼容的函數(shù)3bdata存儲器類型聲明可位尋址的內(nèi)部RAM4bit數(shù)據(jù)類型聲明定義一個位變量或位類型函數(shù)5code存儲器類型聲明程序存儲器空間(ROM)6compact存儲模式使用外部分頁RAM的存儲模式7data存儲器類型聲明直接尋址的內(nèi)部RAM8idata存儲器類型聲明間接尋址的內(nèi)部RAM9interrupt中斷函數(shù)聲明定義一個中斷服務(wù)函數(shù)10large存儲模式使用外部RAM的存儲模式11pdata存儲器類型聲明分頁尋址的外部RAM12_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級13reentrant可重入函數(shù)聲明定義一個可重入函數(shù)14sbit數(shù)據(jù)類型聲明定義一個可位尋址的變量15sfr特殊功能寄存器聲明聲明一個8位的特殊功能寄存器16sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器17small存儲模式使用內(nèi)部RAM的存儲模式18_task_任務(wù)聲明定義實時多任務(wù)函數(shù)19using寄存器組選擇選擇工作寄存器組20xdata存儲器類型聲明外部RAM單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第15頁。09:44164.2.4C51的數(shù)據(jù)結(jié)構(gòu)具有一定格式的數(shù)字或數(shù)值稱為數(shù)據(jù),數(shù)據(jù)是計算機(jī)操作的對象。數(shù)據(jù)的不同格式稱為數(shù)據(jù)類型,數(shù)據(jù)按一定的類型進(jìn)行的排列、組合、架構(gòu)成為數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計的基礎(chǔ)。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第16頁。09:44171.數(shù)據(jù)類型概述
C51中常用的數(shù)據(jù)類型有整型、字符型、實型等。
C51中數(shù)據(jù)有常量與變量之分,它們分別屬于以上這些類型。由以上這些數(shù)據(jù)類型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),因此在程序中用到的所有的數(shù)據(jù)都必須為其指定類型。
圖4-13C51的數(shù)據(jù)類型單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第17頁。09:44182.常量與變量在程序運行過程中,其值不能被改變的量稱為“常量”,其值可以改變的量稱為“變量”。(1)常量使用常量時可以直接給出常量的值,如3,5,0xfe等;也可以用一些符號來替代常量的值,這稱之為“符號常量”。例4-5在第二章圖2-30所示的流水燈電路中,要求點亮P1.0所接LED發(fā)光二極管。程序如下:#include<reg52.h>#defineLight00xfevoidmain(){P1=Light0;}程序中用#defineLight00xfe來定義符號Light0,以后在程序中所有出現(xiàn)Light0的地方均會用0xfe來代替,這個程序的執(zhí)行結(jié)構(gòu)就是P1=0xfe,即接在P1.0引腳上的LED被點亮。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第18頁。09:4419…...30H34H35H31H32H33H…...(2)變量
變量在內(nèi)存中占據(jù)一定的存儲單元,在這些存儲單元中存放變量的值,那么應(yīng)該為這個存儲單元命名。
MOV30H,#01HMOV31H,#02HMOV32H,#03HMOV33H,#04H例如某儀表有4位LED數(shù)碼管,分別顯示一個字串“1234”,編程時將30H~33H作為顯示緩沖區(qū),用匯編語言編寫如下:
變量X101H02H03H04Hx1=01H;x2=02H;x3=03H;x4=04H;變量X2變量X3變量X4用C編寫為:
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第19頁。09:4420…...30H34H35H31H32H33H…...變量主要由兩部分組成:一個是變量名,一個是變量值。每個變量都有一個變量名,在內(nèi)存中占據(jù)一定的存儲地址,在相應(yīng)的內(nèi)存單元中存放該變量的值,
變量X101H02H03H04Hx1=01H;x2=02H;x3=03H;x4=04H;變量X2變量X3變量X4變量地址變量值單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第20頁。09:4421在C語言中,要求對所有用到的變量作強(qiáng)制定義,也就是“先定義,后使用”。變量的定義格式如下:[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表其中,數(shù)據(jù)類型和變量名表是必須的,存儲種類和存儲器類型是可選項。例如:inta,b;/*定義兩個整型變量*/unsignedintdatai[60];/*定義了60個長度的整型數(shù)組,編譯器為其分配120個存儲單元。data關(guān)鍵字為存儲器類型,表示用于存取前128個字節(jié)的片內(nèi)數(shù)據(jù)存儲器*/。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第21頁。09:44223.基本數(shù)據(jù)類型數(shù)據(jù)類型關(guān)鍵字位數(shù)取值范圍有符號字符型char8-128~127無符號字符型unsignedchar80~255有符號整型int16-32768~32767無符號整型unsignedint160~65535有符號長整型long32-2147483648~2147483647無符號長整型unsignedlong320~4294967295浮點型float32±1.175494E-38~±3.402823E+38位型bit10,1可尋址位sbit10,1特殊功能寄存器sfr80~25516位特殊功能寄存器sfr16160~65535單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第22頁。09:4423sfr16用來定義51單片機(jī)內(nèi)部的16位特殊功能寄存器,如sfr16T2=0xCC。sbit用來定義51單片機(jī)內(nèi)部RAM中的可尋址位或特殊功能寄存器中的可尋址位,可以用以下三種方法定義(并以程序狀態(tài)字PSW中的最低位—奇偶標(biāo)志位P為例來說明):(1)sbit位變量名=位地址,如sbitP=0xD0;(2)sbit位變量名=特殊功能寄存器名^位位置,如sbitP=PSW^0;(3)sbit位變量名=字節(jié)地址^位位置,如sbitP=0xD0^0。以上三種方法所定義的位變量指向的是同一個物理地址。
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第23頁。09:44244.構(gòu)造類型以基本數(shù)據(jù)類型為基礎(chǔ),由基本類型數(shù)據(jù)按一定規(guī)則組成的較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),即構(gòu)造類型。構(gòu)造類型包括數(shù)組類型、結(jié)構(gòu)體類型、共同體類型等。
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第24頁。09:4425
(1)數(shù)組類型數(shù)組是一種構(gòu)造類型的數(shù)據(jù),通常用來處理具有相同屬性的一批數(shù)據(jù)。
一維數(shù)組的定義方式為:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];其中類型說明符用來說明數(shù)組中每個元素的數(shù)據(jù)類型;數(shù)組名的定名規(guī)則遵循標(biāo)識符定名規(guī)則;方括號中的常量表達(dá)式表示該數(shù)組所包含的元素的個數(shù)。常量表達(dá)式中可以包括常量和符號常量,不能包含變量。也就是說,C51不允許對數(shù)組的大小作動態(tài)定義,即數(shù)組的大小不依賴于程序運行過程中變量的值。
例:inta[8];單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第25頁。09:4426數(shù)組必須先定義,后使用。C51語言規(guī)定只能逐個引用數(shù)組元素而不能一次引用整個數(shù)組。
1)在定義數(shù)組時對數(shù)組元素賦以初值。例如:
inta[8]={0,1,2,3,4,5,6,7};2)可以只給一部分元素賦值。例如:
inta[8]={0,1,2,3,4};3)如果想使一個數(shù)組中全部元素值為0:inta[8]={0,0,0,0,0,0,0,0};()inta[8]={0*8};()4)在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。
inta[5]={1,2,3,4,5};()inta[]={1,2,3,4,5};()5)可以對數(shù)組的某個元素賦值。a[1]=1;()a[3]=3;()單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第26頁。09:4427
(2)結(jié)構(gòu)類型
結(jié)構(gòu)變量是將互相關(guān)聯(lián)的、多個不同類型的變量結(jié)合在一起形成的一個組合型變量,簡稱結(jié)構(gòu)。構(gòu)成結(jié)構(gòu)的各個不同類型的變量稱為結(jié)構(gòu)元素(或成員),其定義規(guī)則與變量的定義相同。
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第27頁。09:44282)定義結(jié)構(gòu)變量。結(jié)構(gòu)定義的格式為:struct結(jié)構(gòu)名變量表;structdate{//定義名稱為date的結(jié)構(gòu)類型unsignedcharmonth;unsignedcharday;unsignedcharyear;}3)訪問結(jié)構(gòu)變量中的成員。訪問使用“.”運算符,
structdatedate1,date2;date1.year=07;date1.month=1;date1.day=25;
1)首先聲明結(jié)構(gòu)類型。結(jié)構(gòu)類型定義的格式為:
struct結(jié)構(gòu)名{
結(jié)構(gòu)成員說明
}
其中結(jié)構(gòu)成員說明的格式為:
類型標(biāo)識符成員名;單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第28頁。09:4429
5.指針類型指針變量的定義一般形式:[存儲類型]
數(shù)據(jù)類型*指針名;3變量a2000a_pointer*a_pointera=*a_pointer&a=a_pointera=3;*a_pointer=3合法標(biāo)識符指針變量本身的存儲類型指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量不是‘*’運算符例int*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值指針變量與其所指向的變量之間的關(guān)系單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第29頁。09:44304.2.5變量的存儲種類和存儲器類型
變量是一種在程序執(zhí)行過程中,其數(shù)值不斷變化的量。同ANSIC一樣,C51規(guī)定變量必須先定義后使用。C51對變量進(jìn)行定義的格式如下:[存儲種類]數(shù)據(jù)類型
[存儲器類型]變量名表其中,存儲種類和存儲器類型是可選項。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第30頁。09:4431
存儲種類是指變量在程序執(zhí)行過程中的作用范圍。變量的存儲種類可以分為兩大類:靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式是指在程序運行期間分配固定的存儲空間,直到程序執(zhí)行完畢才將存儲空間釋放的方式。而動態(tài)存儲方式則是在程序運行期間根據(jù)需要動態(tài)的分配存儲空間的方式。存儲種類不同,變量的生存期就不同。變量的存儲種類具體有四種,分別為: 自動(auto) 外部(extern) 靜態(tài)(static) 寄存器(register)單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第31頁。09:4432(1)自動變量
自動(auto),“auto”也可省略不寫
作用范圍:在定義它的函數(shù)體或復(fù)合語句內(nèi)部。在定義它的函數(shù)體或復(fù)合語句被執(zhí)行時,C51才為該變量分配存儲空間,當(dāng)函數(shù)調(diào)用結(jié)束返回或復(fù)合語句執(zhí)行結(jié)束時,就自動釋放這些存儲空間,這些存儲空間又可被其他的函數(shù)體或復(fù)合語句使用,因此這類局部變量稱為自動變量。
使用自動變量能最有效地使用單片機(jī)的存儲空間。
自動變量的作用范圍只在函數(shù)內(nèi)部,所以如果在不同函數(shù)中出現(xiàn)相同名稱的變量,那么它們之間沒有任何關(guān)系。例如:chara,b;//定義a,b為字符型、自動變量,等價于“autochara,b;”autointx,y;//定義x,y為整型、自動變量單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第32頁。09:4433例4-6觀察自動變量的作用范圍。#include<reg52.h>/*包含頭文件*/#include<stdio.h>/*包含原型函數(shù)*/voidinitUart(void);/*定義初始化串口子函數(shù)*/voidmain(void)/*main函數(shù)*/{charab='a';/*自動變量,字符型變量ab的值為'a'*/initUart();/*初始化串口*/{charab='b';/*自動變量、字符型變量ab的值為'b'*/printf("%c\n",ab);/*輸出字符b*/}printf("%c\n",ab);/*輸出字符a*/while(1);}/***初始化串口****/voidinitUart(void){/*
晶振頻率為11.0592MHz時,波特率設(shè)置為9600*/SCON=0x50;TMOD|=0x20;TH1=0xfd;TR1=1;TI=1;}例4-6單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第33頁。09:4434
(2)外部變量外部變量是在函數(shù)的外部定義的,它的作用域為從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),外部變量可以被程序中各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。有時需要用extern來聲明外部變量,以擴(kuò)展外部變量的作用域。這里包括兩種情況,一種是當(dāng)某個外部變量在定義前被使用時,需要用extern聲明。第二種情況是,當(dāng)一個C程序由多個源程序文件組成時,如果兩個文件要用到同一個變量,不可以在兩個文件中都進(jìn)行定義,否則在進(jìn)行程序的連接時會出現(xiàn)“重復(fù)定義”的錯誤。正確的做法是:在一個文件中定義該變量,在另一個文件中不再定義,只是在使用時用extern加以聲明即可。
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第34頁。09:4435例4-7通過以下例題觀察外部變量的作用范圍。#include<reg52.h>/*包含頭文件*/#include<stdio.h>/*包含原型函數(shù)*/voidinitUart(void);/*定義初始化串口子函數(shù)*/unsignedintab=1234;voidmain(void)/*主函數(shù)*/{externcd;initUart();/*初始化串口*/printf("ab=%u,cd=%u\n",ab,cd);while(1);}cd=5678;/***初始化串口****/voidinitUart(void){/*
晶振頻率為11.0592MHz時,波特率設(shè)置為9600*/SCON=0x50;TMOD|=0x20;TH1=0xfd;TR1=1;TI=1;}例4-7單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第35頁。09:4436
(3)靜態(tài)變量靜態(tài)變量用關(guān)鍵字“static”聲明。靜態(tài)變量又分為內(nèi)部靜態(tài)變量(又稱局部靜態(tài)變量)和外部靜態(tài)變量(又稱全局靜態(tài)變量)。內(nèi)部靜態(tài)變量是在函數(shù)內(nèi)部定義的,外部靜態(tài)變量在函數(shù)外部定義的。從編譯的角度來看二者都是靜態(tài)分布存儲空間的。內(nèi)部靜態(tài)變量與自動變量有類似之處,其作用域同樣限于定義內(nèi)部靜態(tài)變量函數(shù)內(nèi)部,但不同的是內(nèi)部靜態(tài)變量是始終存在并占有存儲單元,其初值只是在進(jìn)入時賦值一次,而不是在進(jìn)出函數(shù)時被建立或消除。退出函數(shù)后變量的值仍然保存但不能訪問。如果在某種情況下,我們希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值。這時就應(yīng)該指定該局部變量為內(nèi)部靜態(tài)變量。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第36頁。09:4437例4-8
觀察內(nèi)部靜態(tài)變量的特點及其與自動變量的區(qū)別。#include<reg52.h>/*包含頭文件*/#include<stdio.h>/*包含原型函數(shù)*/voidinitUart(void);/*定義初始化串口子函數(shù)*/voidmain(){chari;initUart();/*初始化串口*/for(i=0;i<3;i++){staticintx=1;inty=1;printf("x=%d",x);printf("y=%d\n",y);x++;y++;} while(1);}/***初始化串口****/voidinitUart(void){/*
晶振頻率為11.0592MHz時,波特率設(shè)置為9600*/SCON=0x50;TMOD|=0x20;TH1=0xfd;TR1=1;TI=1;}例4-8單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第37頁。09:4438(4)寄存器變量(register)
寄存器變量用關(guān)鍵字“register”聲明。因為單片機(jī)系統(tǒng)中訪問速度最快的是寄存器,所以可以把需要快速存取或使用頻繁的變量放到寄存器中,這樣可以提高整個系統(tǒng)的運行速度。但是C51編譯器能夠自動識別程序中使用頻繁的變量,并自動將其作為寄存器變量,而不需要程序設(shè)計者指定。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第38頁。09:4439
51子系列的ROM編址圖
52子系列的ROM編址圖2.存儲器類型
存儲器類型均為code單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第39頁。09:4440RAM的編址片內(nèi)數(shù)據(jù)存儲器
51系列的RAM編址圖片外數(shù)據(jù)存儲器存儲器類型為data存儲器類型為idata存儲器類型為pdata、xdata單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第40頁。09:44412.存儲器類型
表4-10C51編譯器可識別的存儲器類型存儲器類型對應(yīng)的存儲空間說明data直接尋址的片內(nèi)數(shù)據(jù)存儲器的低128B,訪問速度最快bdata可位尋址的片內(nèi)數(shù)據(jù)存儲器(地址20H~2FH共16B),允許位與字節(jié)混合訪問idata間接尋址片內(nèi)數(shù)據(jù)存儲器256B,可訪問片內(nèi)全部RAM空間pdata分頁尋址片外數(shù)據(jù)存儲器的256B,使用指令MOVX@Ri訪問,頁地址由P2口提供xdata片外數(shù)據(jù)存儲器64KB,使用指令MOVX@DPTR訪問code尋址程序存儲器64KB,使用MOVC指令訪問變量定義格式為:chardataa;charidatab;charpdatac;charxdatad;charbdatae;通過以上方式可以把一個字符型變量定位在數(shù)據(jù)存儲器的不同空間內(nèi),由于在不同的存儲器空間采用的尋址方式不同,所以訪問速度也不同。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第41頁。09:4442表4-11存儲器、存儲器類型、尋址方式與訪問速度對照表
存儲器地址空間容量C51編譯器中變(常)量存儲器類型匯編語言中的尋址方式訪問速度內(nèi)部數(shù)據(jù)區(qū)工作寄存器區(qū)00H~1FH32data,idata寄存器尋址最快位地址區(qū)20H~2FH16bdata,data位尋址、直接尋址快數(shù)據(jù)緩沖區(qū)30H~7FH80data,idata直接尋址、寄存器間接尋址data快idata中80H~FFH128idata寄存器間接尋址中特殊功能寄存器區(qū)80H~FFH128data直接尋址快內(nèi)(外)部程序區(qū)0000H~FFFFH65536code變址間接尋址最慢外部數(shù)據(jù)區(qū)0000H~FFFFH65536xdata、pdata寄存器間接尋址pdata慢xdata最慢單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第42頁。09:44433.存儲模式存儲模式用來決定未標(biāo)明存儲器類型的變量的默認(rèn)存儲器類型。
C51編譯器允許采用三種存儲模式:小編譯模式(SMALL)、緊湊編譯模式(COMPACT)、大編譯模式(LARGE)。SMALL模式:所有未標(biāo)明存儲器類型的變量都默認(rèn)位于片內(nèi)數(shù)據(jù)存儲器。與使用data指定存儲器類型的作用一樣。此模式對變量訪問的效率很高,但所有的數(shù)據(jù)對象和堆棧的總大小不能超過內(nèi)部RAM的大小。COMPACT模式:所有未標(biāo)明存儲器類型的變量都默認(rèn)位于片外數(shù)據(jù)存儲器的一頁(256字節(jié))內(nèi),但堆棧位于片內(nèi)數(shù)據(jù)存儲器內(nèi),這和使用pdata指定存儲器類型的作用一樣,該模式適用于變量不超過256字節(jié)的情況。地址的高字節(jié)往往通過P2口輸出,其值必須在啟動代碼中設(shè)置。這種模式的效率不如SMALL模式高,訪問的速度要慢一些。LARGE模式:所有未標(biāo)明存儲器類型的變量都默認(rèn)位于片外數(shù)據(jù)存儲器內(nèi),這和使用xdata指定存儲器類型的作用一樣,使用數(shù)據(jù)指針DPTR進(jìn)行尋址,尋址空間可達(dá)到64KB,但效率較前兩種模式低。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第43頁。09:44444.2.6絕對地址的訪問
所定義的變量經(jīng)過編譯之后具有浮動地址,其絕對地址必須經(jīng)過BL51連接定位后才能確定。若需要對系統(tǒng)中的某個確定的具體地址空間進(jìn)行訪問,特別是對外設(shè)的操作,必須對絕對地址進(jìn)行訪問。1.采用預(yù)定義宏C51編譯器提供了宏定義來對單片機(jī)的code區(qū)、data區(qū)、pdata區(qū)和xdata區(qū)等不同存儲區(qū)域進(jìn)行絕對地址的訪問。
CBYTE以字節(jié)方式尋址code區(qū);CWORD以字方式尋址code區(qū);DBYTE以字節(jié)方式尋址data區(qū);DWORD以字方式尋址data區(qū);PBYTE以字節(jié)方式尋址pdata區(qū);PWORD以字方式尋址pdata區(qū);XBYTE以字節(jié)方式尋址xdata區(qū);XWORD以字方式尋址xdata區(qū)。這些宏定義包含在absacc.h文件中。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第44頁。09:4445DBYTE[0x16]=a=3表示把無符號字符型變量a(其值為3)傳送給片內(nèi)數(shù)據(jù)存儲器中地址為16H的單元;。例#include<reg52.h>#include<absacc.h>voidmain(void){ unsignedchara; unsignedintb; DBYTE[0x16]=a=3; b=XWORD[0x2000]=8; while(1);}XWORD是以字方式尋址xdata區(qū),即每次尋址兩個字節(jié),所以b=XWORD[0x2000]=8表示對片外數(shù)據(jù)存儲器地址為2000H*2的單元(其值為8)進(jìn)行操作,也就是把4000H和4001H兩個單元內(nèi)的數(shù)據(jù)傳送給無符號整型變量b。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第45頁。09:44462.采用擴(kuò)展關(guān)鍵字_at_采用_at_關(guān)鍵字可以指定變量在存儲空間中的絕對地址,一般格式如下:數(shù)據(jù)類型[存儲器類型]標(biāo)識符_at_地址常數(shù)例如:intidatai_at_0x40;//變量i定位于idata空間,地址為40Hcharxdataname[120]_at_0x7000;//字符型數(shù)組name定位于xdata空間,地址從7000H開始注意:(1)用_at_定義的絕對變量不能初始化;(2)bit類型的函數(shù)及變量不能定位到一個絕對地址;(3)用_at_定義的變量必須是全局變量。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第46頁。09:4447例4-9將片內(nèi)RAM60H開始的16個單元賦值00到16,再將片內(nèi)RAM60H開始的16個單元傳送到片外RAM1000H開始單元。解:程序如下:#include<reg52.h>#defineucharunsignedcharuchardatatext1[16]_at_0x60;ucharxdatatext2[16]_at_0x1000;voidmain(void){uchari; for(i=0;i<16;i++)text1[i]=i;for(i=0;i<16;i++)text2[i]=text1[i];while(1);}例4-9單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第47頁。09:44483.采用指針變量定義一個指針變量,然后把地址常數(shù)賦予該變量,就可以通過該指針變量對該絕對地址進(jìn)行訪問了。例如#defineucharunsignedcharvoidmain(void){ ucharxdata*xdp; uchardata*dp; xdp=0x1000; *xdp=0x66; dp=0x30; *dp=0x77;}運行結(jié)果:指針變量xdp的值為1000H,dp的值為30H,xdata區(qū)地址為1000H的單元中的數(shù)據(jù)為66H,data區(qū)地址為30H的單元中的數(shù)據(jù)為77H。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第48頁。09:44494.采用連接定位控制命令在對用戶程序進(jìn)行連接時,可利用code、xdata、pdata、data、bdata等連接定位控制命令指定變量的絕對地址,但這種方法局限性較大,這里不做詳細(xì)介紹。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第49頁。09:44504.2.7C51的預(yù)處理預(yù)處理功能包括宏定義、文件包含和條件編譯
3個主要部分。預(yù)處理命令不同于C語言語句,具有以下特點:(1)預(yù)處理命令以“#”開頭,后面不加分號;(2)預(yù)處理命令在編譯前執(zhí)行;(3)多數(shù)預(yù)處理命令習(xí)慣放在文件的開頭。1.宏定義不帶參數(shù)的宏定義的格式為:#define新名稱原內(nèi)容例:#defineucharunsignedchar該指令的作用是用#define后面的第一個字母組合代替該字母后面的所有內(nèi)容。例:#definePI3.14,以后在程序中用PI代替3.14。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第50頁。09:44512.包含文件包含文件的含義是在一個程序文件中包含其他文件的內(nèi)容。用文件包含命令可以實現(xiàn)文件包含功能,命令格式為:#include<文件名>或#include“文件名”例如,在文件中第一句經(jīng)常為:#include<reg52.h>,在編譯預(yù)處理時,對#include命令進(jìn)行文件包含處理。實際上就是將文件reg52.h中的全部內(nèi)容復(fù)制插入到#include<reg52.h>的命令處。
單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第51頁。09:44523.條件編譯命令
提供一種在編譯過程中根據(jù)所求條件的值有選擇地包含不同代碼的手段,實現(xiàn)對程序源代碼的各部分有選擇的進(jìn)行編譯,稱為條件編譯。
#if語句中包含一個常量表達(dá)式,若該表達(dá)式的求值結(jié)果不等于0時,則執(zhí)行其后的各行,直到遇到#endif、#elif或#else語句為止(預(yù)處理elif相當(dāng)于elseif)。在#if語句中可以使用一個特殊的表達(dá)式defined(標(biāo)識符):當(dāng)標(biāo)識符已經(jīng)定義時,其值1;否則,其值為0。#ifndef(hdr)#definehdr#include(hdr.h)#endif為了保證hdr.h文件的內(nèi)容只被包含一次,可以像下面這樣用條件語句把該文件的內(nèi)容包含起來:單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第52頁。09:44534.2.8C51的運算符與表達(dá)式
運算符就是完成某種特定運算的符號.包括算術(shù)運算符、賦值運算符、關(guān)系運算符、邏輯運算符、位運算符、條件運算符等。按照表達(dá)式中運算對象的個數(shù)又可將運算符分為單目運算符、雙目運算符和三目運算符。單目運算符只需一個運算對象,雙目運算符要求有兩個運算對象,三目運算符則要求有三個運算對象。表達(dá)式是由運算符和運算對象所組成的具有特定含義的式子。運算符和表達(dá)式可以組成C語言程序的各種語句。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第53頁。09:44541.算術(shù)運算符
算術(shù)運算符包括以下幾種:+加或取正值運算符-減或取負(fù)值運算符*乘運算符/除運算符%取余運算符++自增運算符--自減運算符單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第54頁。09:4455自增、自減運算符的作用是使變量的值加1或減1。++i先使i的值加1,然后再使用;--i先使i的值減1,然后再使用;i++使用完i的值以后,再使i的值加1;i--使用完i的值以后,再使i的值減1。例4-10觀察自增、自減運算符的用法和功能。voidmain(){inti=8;inta,b,c,d,e,f;a=++i;b=--i;c=i++;d=i--;e=-i++;f=-i--;while(1);}例4-10單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第55頁。09:44562.賦值運算符
“=”就是賦值運算符,其功能是將一個數(shù)據(jù)賦給一個變量。a=8;b=5;c=a/b;a=b=6;以上語句執(zhí)行時,先計算出右邊表達(dá)式的值,再將該值賦給左邊的變量。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第56頁。09:44573.關(guān)系運算符關(guān)系運算符的功能就是判斷兩個數(shù)的關(guān)系。C語言有以下六種關(guān)系運算符:>大于<小于>=大于等于<=小于等于==測試等于!=測試不等于關(guān)系運算符的優(yōu)先級低于算術(shù)運算符,高于賦值運算符。六種關(guān)系運算符中前四種具有相同的優(yōu)先級,后兩種具有相同的優(yōu)先級,而且前四種的優(yōu)先級高于后兩種。注意賦值運算符“=”和測試等于“==”關(guān)系運算符不一樣!兩個表達(dá)式用關(guān)系運算符連接起來就構(gòu)成了關(guān)系表達(dá)式。關(guān)系表達(dá)式的值為邏輯值,即只有真(true)和假(false)兩種狀態(tài),在C語言中用1表示真,用0表示假。若關(guān)系表達(dá)式的條件成立,則表達(dá)式的值為真(1),否則為假(0)。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第57頁。09:4458例4-11觀察關(guān)系運算符的用法和功能。voidmain(){inta,b,c,d,e,f;a=(5>6);b=(3<5);c=(12>=10);d=(10<=9);e=(7==8);f=(7!=8);while(1);}例4-11單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第58頁。09:44594.邏輯運算符邏輯運算符的功能是通過邏輯運算求條件式的邏輯值。C語言有以下三種邏輯運算符:&&邏輯與||邏輯或!邏輯非邏輯表達(dá)式的格式如下:邏輯與:條件式1&&條件式2邏輯或:條件式1||條件式2邏輯非:!條件式三種邏輯運算中,邏輯非的優(yōu)先級別最高,且高于算術(shù)運算符;邏輯或的優(yōu)先級別最低,低于關(guān)系運算符,但高于賦值運算符。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第59頁。09:4460例4-12觀察邏輯運算符的用法和功能。voidmain(){inta,b,c,d,e,f,g,h,i;a=(5>6)&&(3<2);b=(3<5)&&(7>6);c=(5>6)&&(7>6);d=(10<=9)||(7>6);e=(10>=9)||(7>6);f=(10<=9)||(7<6);g=!(3<2);h=!(3>2);i=(7==8)&&(3<2)+(3<2)||(5>6)+!(5>6);while(1);}例4-12單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第60頁。09:44615.位運算符位運算符的功能是對變量按位進(jìn)行運算,但并不改變運算變量的值。C語言有以下六種位運算符:&按位與|按位或~按位取反^按位異或<<左移>>右移對于異或邏輯運算,當(dāng)參與運算的兩個二進(jìn)制數(shù)相同時結(jié)果為假(0),不同時結(jié)果為真(1)。六種位運算符的優(yōu)先級由高到低的順序為:按位取反、左移、右移、按位與、按位異或、按位或。a:10111001b:&1000001110000001位運算就是將參與運算的兩個變量的各個二進(jìn)制位分別對應(yīng)進(jìn)行與、或、異或等操作。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第61頁。09:4462例4-13觀察位運算符的用法和功能。voidmain(){unsignedchari,j,a,b,c,d,e,f,g;charx=0xa6;i=0x36;j=0x98;a=i&j;b=i|j;c=i^j;d=~i;e=i<<2;f=j>>3;g=x>>2;while(1);}例4-13單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第62頁。09:44636.復(fù)合賦值運算符復(fù)合賦值運算符是C語言的一種特色,它簡化了代碼的編寫。該類運算符的功能是將某個變量先與表達(dá)式進(jìn)行指定的運算,再將運算結(jié)果賦予該變量。C語言有以下十種復(fù)合賦值運算符:+=加并賦值運算符-=減并賦值運算符*=乘并賦值運算符/=除并賦值運算符%=取余并賦值運算符<<=左移并賦值運算符>>=右移并賦值運算符&=按位與并賦值運算符|=按位或并賦值運算符^=按位異或并賦值運算符單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第63頁。09:4464C語言中凡是雙目運算都可以用復(fù)合賦值運算符來表示,格式如下:變量復(fù)合賦值運算符表達(dá)式如a+=5,相當(dāng)于a=a+5;a*=b-6,相當(dāng)于a=a*(b-6),y/=x+9,相當(dāng)于y=y/(x+9)。例4-14觀察復(fù)合運算符的用法和功能。voidmain(){ inti,j,a,b,c; i=0x36;j=0x98; a=0x23;b=0x34;a&=i; b|=j; c^=j; i<<=2;j>>=3;i<<=2;while(1);}例4-14單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第64頁。09:44657.條件運算符條件運算符是三目運算符,格式如下:判斷結(jié)果=(判斷式)?結(jié)果1:結(jié)果2其含義是先求判斷式的值,若為真,則判斷結(jié)果=結(jié)果1;若為假,則判斷結(jié)果=結(jié)果2。例4-15觀察條件運算符的用法和功能。voidmain(){chara,b,max;a=10;b=16;max=a>b?a:b;while(1);}max=16單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第65頁。09:44668.指針和地址運算符變量前面加“*”說明該變量為指針,所以操作時取的不是變量的值,而是將指針變量所指向的目標(biāo)變量的值賦給左邊的變量;取地址運算是將目標(biāo)變量的地址賦給左邊的變量?!?”和“&”運算符均為單目運算符。*指針運算符(取內(nèi)容)&取地址運算符(取地址)一般形式分別如下:取內(nèi)容:變量=*指針變量取地址:指針變量=&目標(biāo)變量例4-16觀察指針和地址運算符的用法和功能。voidmain(){chara,b,*m;a=10;m=&a;b=*m;while(1);}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第66頁。09:44674.3
C51語言的語句C51語言的語句是單片機(jī)執(zhí)行的操作命令,每條語句都以分號結(jié)尾。注意:變量、函數(shù)的聲明部分也以分號結(jié)尾,但不是語句。4.3.1表達(dá)式語句由一個表達(dá)式加上一個分號就構(gòu)成了表達(dá)式語句。如:i=7;j=a=b;i++;單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第67頁。09:44684.3.2復(fù)合語句{ i=7; j=a=b; i++;}用大括號“{}”將多條語句括起來就組成了復(fù)合語句,也稱為功能塊。復(fù)合語句中的每一條語句都必須以“;”結(jié)束,而不允許將“;”寫在“}”外。復(fù)合語句不需要以“;”結(jié)束。C語言中將復(fù)合語句視為一條單語句,也就是說在語法上等同于一條單語句。對于一個函數(shù)而言,函數(shù)體就是一個復(fù)合語句。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第68頁。09:44694.3.3空語句空語句是僅由一個分號“;”組成的語句。空語句什么也不做。語句格式:;4.3.4函數(shù)調(diào)用語句函數(shù)調(diào)用的一般形式加上分號就構(gòu)成了函數(shù)調(diào)用語句。語句格式:函數(shù)名(實際參數(shù)表);執(zhí)行函數(shù)調(diào)用語句就是調(diào)用函數(shù)體并把實際參數(shù)賦予函數(shù)定義中的形式參數(shù),然后執(zhí)行被調(diào)函數(shù)體中的語句。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第69頁。09:44704.3.5控制語句控制語句用于控制程序的流程,以實現(xiàn)程序的各種結(jié)構(gòu)方式。C51的控制語句有以下幾類:1.選擇語句if(1)if分支結(jié)構(gòu)if(表達(dá)式){語句序列;}其它語句功能:如果表達(dá)式的值為真,則執(zhí)行語句,否則不執(zhí)行語句。流程圖如圖4-23所示。圖4-23if分支結(jié)構(gòu)單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第70頁。09:4471例4-17仿真電路如圖4-24所示,當(dāng)開關(guān)K閉合時上面四個發(fā)光二極管先亮,下面四個二極管后亮,當(dāng)開關(guān)K打開時僅下面四個發(fā)光二極管亮。試編寫程序。圖4-24例4-17仿真電路圖程序如下:#include<reg52.h>sbitk=P3^4;voidmain(){while(1){if(k==0){P1=0xf0;}P1=0x0f;}}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第71頁。09:4472(2)if-else分支結(jié)構(gòu)
if(表達(dá)式) {語句序列1;}else {語句序列2;}其它語句;功能:如果表達(dá)式的值為真,則執(zhí)行語句序列1,否則執(zhí)行語句序列2。流程圖如圖4-25所示。
圖4-25if-else分支結(jié)構(gòu)示意圖單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第72頁。09:4473例4-18在例4-17中,當(dāng)開關(guān)K閉合時8個發(fā)光二極管亮,K斷開時8個發(fā)光二極管滅。試編寫程序。圖4-24例4-17仿真電路圖解:程序如下:#include<reg52.h>sbitk=P3^4;voidmain(){while(1){if(k==0)P1=0x00;else P1=0xff;}}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第73頁。09:4474(3)ifelseif分支結(jié)構(gòu)if(表達(dá)式1){語句序列1;}elseif(表達(dá)式2){語句序列2;}elseif(表達(dá)式3){語句序列3;}…elseif(表達(dá)式n){語句序列n;}else{語句序列n+1;}其它語句;流程圖如圖4-26所示。
圖4-26ifelseif分支結(jié)構(gòu)示意圖單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第74頁。09:4475例4-19假設(shè)從鍵盤輸入數(shù)據(jù)x,請編寫一程序,判斷x大于0、等于0、還是小于0;并輸出如下判斷結(jié)果:1當(dāng)x>0時0當(dāng)x=0時-1當(dāng)x<0時Y=解:程序設(shè)計如下:#include<reg52.h>#include<stdio.h> voidinitUart(void); voidmain(){intx,y;x=8;if(x>0)y=1;elseif(x==0)y=0;elsey=-1;initUart();printf("x=%d,y=%d\n",x,y);while(1);}/**初始化串口**/voidinitUart(void){/*晶振頻率為11.0592MHz時,波特率設(shè)置為9600*/SCON=0x50;/*串口為模式1,允許接收*/TMOD|=0x20;/*定時器1為模式2*/TH1=0xfd;/*設(shè)置TH1的初值*/TR1=1;TI=1;}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第75頁。09:44762.switch語句switch語句是多分支選擇語句,也稱開關(guān)語句。一般格式如下:switch(表達(dá)式){ case常量表達(dá)式1:語句序列1; case常量表達(dá)式2:語句序列2; …… case常量表達(dá)式n:語句序列n; default:語句序列n+1;}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第76頁。09:4477每個case和default出現(xiàn)的順序不影響執(zhí)行結(jié)果,但每個常量表達(dá)式的值必須互不相同。該語句的執(zhí)行過程如下:(1)求switch后括號內(nèi)的表達(dá)式的值,并將其值與各case后的常量表達(dá)式值進(jìn)行比較;(2)當(dāng)表達(dá)式的值與某個常量表達(dá)式相等時,則執(zhí)行該常量表達(dá)式后邊的語句序列;(3)接著執(zhí)行下一個常量表達(dá)式后邊的語句序列,直到后邊所有的語句序列都執(zhí)行完(即執(zhí)行到語句序列n+1);(4)如果表達(dá)式的值與所有case后的常量表達(dá)式都不相等,則執(zhí)行default后面的語句序列。但是我們通常只是需要當(dāng)某個常量表達(dá)式的值與switch后表達(dá)式的值相等時就執(zhí)行該case后的語句序列,并不希望程序一直執(zhí)行下去,直到語句序列n+1。要達(dá)到這一目的,只需要在每個語句序列的后邊加上“break”語句即可。單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第77頁。09:4478格式如下:switch(表達(dá)式){ case常量表達(dá)式1:語句序列1; break; case常量表達(dá)式2:語句序列2; break; …… case常量表達(dá)式n:語句序列n; break; default:語句序列n+1;}單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第78頁。09:4479其流程見圖4-27。
圖4-27switch分支結(jié)構(gòu)示意圖單片機(jī)--80C51單片機(jī)的軟件基礎(chǔ)-2全文共107頁,當(dāng)前為第79頁。09:4480例4-20仿真電路如圖4-28所示,編寫程序,當(dāng)只有K1閉合時,LED1亮,只有K2閉合時,LED2亮,依此類推。試編寫程序。
圖4-28例4-20仿真電路圖解:程序設(shè)計如下:#include<reg51.h>voidmain(){ unsignedchark; while(1){ P1|=0xf0; k=P1; k=k&0xf0;//屏蔽低四位switch(k) { case0xe0:P1=0xfe;break; case0xd0:P1=0xfd;break; case0xb0
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育賽事招投標(biāo)及合同管理標(biāo)準(zhǔn)
- 商務(wù)中心辦公室租賃協(xié)議范本
- 2024版高速公路運輸合同書
- 藝術(shù)品鑒定師聘任合同證書
- 文化設(shè)施石材施工合同
- 2024租賃物維修與保養(yǎng)服務(wù)合同
- 2024甲方乙方關(guān)于房地產(chǎn)開發(fā)的合同
- 二零二五年度特種鋼板租賃及運輸服務(wù)合同3篇
- 二零二五年度二樓商鋪租賃與顧客忠誠度提升合同2篇
- 2024版酒店早餐服務(wù)外包協(xié)議樣本版B版
- 2025年中國南水北調(diào)集團(tuán)限公司總部招聘工作人員(27人)高頻重點提升(共500題)附帶答案詳解
- 2024年新技術(shù)、新產(chǎn)品、新工藝、新材料的應(yīng)用培訓(xùn)課件
- 2024年銷售崗位工作總結(jié)
- 數(shù)字化解決方案設(shè)計師職業(yè)技能競賽參考試題庫(含答案)
- 2025新年春節(jié)專用對聯(lián)蛇年春聯(lián)帶橫批
- 2025年中聯(lián)重科公司發(fā)展戰(zhàn)略和經(jīng)營計劃
- Unit8 Chinese New Year 第一課時(說課稿)-2024-2025學(xué)年譯林版(三起)英語六年級上冊
- JGJT46-2024《施工現(xiàn)場臨時用電安全技術(shù)標(biāo)準(zhǔn)》條文解讀
- 半結(jié)構(gòu)化面試題100題
- 申論公務(wù)員考試試題與參考答案
- 基因編輯技術(shù)PPT課件
評論
0/150
提交評論