版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
單片機(jī)C51語(yǔ)言基礎(chǔ)
及C51程序設(shè)計(jì)
2021/5/91主要內(nèi)容:C51語(yǔ)言概述C51的標(biāo)識(shí)符與關(guān)鍵字C51的變量及數(shù)據(jù)類(lèi)型C51的運(yùn)算符及表達(dá)式C51的程序結(jié)構(gòu)C51開(kāi)發(fā)環(huán)境C51編程實(shí)例2021/5/92一、C51語(yǔ)言概述單片機(jī)C51語(yǔ)言是ANSIC的擴(kuò)展。C51語(yǔ)言除了具有C語(yǔ)言的優(yōu)點(diǎn)外,同時(shí)具有匯編語(yǔ)言的硬件操作能力。運(yùn)行于單片機(jī)平臺(tái),支持的微處理器種類(lèi)繁多,可移植性好。對(duì)于兼容的8051系列單片機(jī),只要將一個(gè)硬件型號(hào)下的程序稍加修改,甚至不加改變,就可移植到另一個(gè)不同型號(hào)的單片機(jī)中運(yùn)行。具有高級(jí)語(yǔ)言的特點(diǎn),盡量減少底層硬件寄存器的操作。單片機(jī)C51語(yǔ)言提供了完備的數(shù)據(jù)類(lèi)型、運(yùn)算符及函數(shù)供使用。C51語(yǔ)言代碼執(zhí)行的效率方面十分接近匯編語(yǔ)言,且比匯編語(yǔ)言的程序易于理解,便于代碼共享。2021/5/93二、C51的標(biāo)識(shí)符與關(guān)鍵字標(biāo)識(shí)符即特定的字符或字符串,用來(lái)給變量、函數(shù)、符號(hào)常量、自定義類(lèi)型等命名。用標(biāo)識(shí)符給C語(yǔ)言程序中各種對(duì)象命名時(shí),要用字母、下劃線和數(shù)字組成的字符序列,并要求首字符是字母或下劃線,不能是數(shù)字。字母的大小寫(xiě)是有區(qū)別的。通常下劃線開(kāi)頭的標(biāo)識(shí)符是編譯系統(tǒng)專(zhuān)用的,因此在編寫(xiě)C語(yǔ)言源程序時(shí)一般不使用以下劃線開(kāi)頭的標(biāo)識(shí)符,而將下劃線用作分段符。C51編譯器規(guī)定標(biāo)識(shí)符最長(zhǎng)可達(dá)255個(gè)字符,但只有前32個(gè)字符在編譯時(shí)有效,因此標(biāo)識(shí)符的長(zhǎng)度一般不要超過(guò)32個(gè)字符。關(guān)鍵字是一種已被系統(tǒng)使用過(guò)的具有特定含義的標(biāo)識(shí)符。用戶不得再用關(guān)鍵字給變量等命名。C語(yǔ)言關(guān)鍵字較少,ANSIC標(biāo)準(zhǔn)一共規(guī)定了32個(gè)關(guān)鍵字,見(jiàn)表2021/5/94關(guān)鍵字用途說(shuō)明auto存儲(chǔ)種類(lèi)說(shuō)明用以說(shuō)明局部變量,缺省值為此break程序語(yǔ)句退出最內(nèi)層循環(huán)case程序語(yǔ)句Switch語(yǔ)句中的選擇項(xiàng)char數(shù)據(jù)類(lèi)型說(shuō)明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲(chǔ)種類(lèi)說(shuō)明在程序執(zhí)行過(guò)程中不可更改的常量值continue程序語(yǔ)句轉(zhuǎn)向下一次循環(huán)default程序語(yǔ)句Switch語(yǔ)句中的失敗選擇項(xiàng)do程序語(yǔ)句構(gòu)成do…while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類(lèi)型說(shuō)明雙精度浮點(diǎn)數(shù)else程序語(yǔ)句構(gòu)成if…else選擇結(jié)構(gòu)enum數(shù)據(jù)類(lèi)型說(shuō)明枚舉類(lèi)型extern存儲(chǔ)種類(lèi)說(shuō)明在其他程序模塊中說(shuō)明了的全局變量float數(shù)據(jù)類(lèi)型說(shuō)明單精度浮點(diǎn)數(shù)for程序語(yǔ)句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語(yǔ)句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)ANSIC語(yǔ)言的關(guān)鍵字2021/5/95if程序語(yǔ)句構(gòu)成if…else選擇結(jié)構(gòu)int數(shù)據(jù)類(lèi)型說(shuō)明基本整型數(shù)long數(shù)據(jù)類(lèi)型說(shuō)明長(zhǎng)整型數(shù)register存儲(chǔ)種類(lèi)說(shuō)明使用CPU內(nèi)部寄存器的變量return程序語(yǔ)句函數(shù)返回short數(shù)據(jù)類(lèi)型說(shuō)明短整型數(shù)signed數(shù)據(jù)類(lèi)型說(shuō)明有符號(hào)數(shù),二進(jìn)制數(shù)據(jù)的最高位為符號(hào)位sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類(lèi)型的字節(jié)數(shù)static存儲(chǔ)種類(lèi)說(shuō)明靜態(tài)變量struct數(shù)據(jù)類(lèi)型說(shuō)明結(jié)構(gòu)類(lèi)型數(shù)據(jù)switch程序語(yǔ)句構(gòu)成Switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類(lèi)型說(shuō)明重新進(jìn)行數(shù)據(jù)類(lèi)型定義union數(shù)據(jù)類(lèi)型說(shuō)明聯(lián)合類(lèi)型數(shù)據(jù)unsigned數(shù)據(jù)類(lèi)型說(shuō)明無(wú)符號(hào)數(shù)數(shù)據(jù)void數(shù)據(jù)類(lèi)型說(shuō)明無(wú)類(lèi)型數(shù)據(jù)volatile數(shù)據(jù)類(lèi)型說(shuō)明該變量在程序執(zhí)行中可被隱含地改變while程序語(yǔ)句構(gòu)成while和do…while循環(huán)結(jié)構(gòu)2021/5/96KeilC51編譯器除了有ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字外,還根據(jù)51單片機(jī)的特點(diǎn)擴(kuò)展了相應(yīng)的關(guān)鍵字。在KeilC51開(kāi)發(fā)環(huán)境的文本編輯器中編寫(xiě)C程序,系統(tǒng)可以把保留字以不同的顏色顯示,缺省顏色為藍(lán)色。下表為KeilC51編譯器擴(kuò)展的關(guān)鍵字。關(guān)鍵字用途說(shuō)明bit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函數(shù)sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器(8位)sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器data存儲(chǔ)器類(lèi)型說(shuō)明直接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類(lèi)型說(shuō)明可位尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類(lèi)型說(shuō)明間接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類(lèi)型說(shuō)明“分頁(yè)”尋址的8051外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類(lèi)型說(shuō)明8051外部數(shù)據(jù)存儲(chǔ)器code存儲(chǔ)器類(lèi)型說(shuō)明8051程序存儲(chǔ)器interrupt中斷函數(shù)聲明定義一個(gè)中斷函數(shù)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)using寄存器組定義定義8051的工作寄存器組2021/5/971.C51的變量
在程序執(zhí)行過(guò)程中,數(shù)值可以發(fā)生改變的量稱(chēng)為變量。變量名與存儲(chǔ)單元地址相對(duì)應(yīng),變量值與存儲(chǔ)單元的內(nèi)容相對(duì)應(yīng)。例如三、C51的變量及數(shù)據(jù)類(lèi)型2021/5/98【存儲(chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名(標(biāo)準(zhǔn)C)(標(biāo)準(zhǔn)C)*括號(hào)項(xiàng)——可以缺?。ǖ栌腥笔≈担〤51變量定義的四要素:(C51特有)(標(biāo)準(zhǔn)C+C51)2021/5/99【存儲(chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名共有四個(gè)說(shuō)明符:1、auto(自動(dòng)型)——變量的作用范圍在定義它的函數(shù)體或語(yǔ)句塊內(nèi)。執(zhí)行結(jié)束后,變量所占內(nèi)存即被釋放。2、extern(外部型)——在一個(gè)源文件中被定義為外部型的變量,在其它源文件中需要通過(guò)extern說(shuō)明方可使用。3、static(靜態(tài)型)——利用static可使變量定義所在的函數(shù)或語(yǔ)句塊執(zhí)行結(jié)束后,其分配的內(nèi)存單元繼續(xù)保留。4、register(寄存器型)——將變量對(duì)應(yīng)的儲(chǔ)存單元指定為通用寄存器,以提高程序運(yùn)行速度。缺省存儲(chǔ)種類(lèi)為auto(自動(dòng))型變量2021/5/910數(shù)據(jù)的不同格式叫做數(shù)據(jù)類(lèi)型*有符號(hào)數(shù)類(lèi)型可以忽略signed標(biāo)識(shí)符標(biāo)準(zhǔn)C語(yǔ)言的數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名2021/5/911C51擴(kuò)充數(shù)據(jù)類(lèi)型:bit、sfr或sfr16、sbitbit型關(guān)鍵詞bit用于定義一個(gè)位變量,語(yǔ)法規(guī)則:bitbit_name
[=0或1];例如:bitdoor=0;//定義一個(gè)叫door的位變量且初值為0標(biāo)準(zhǔn)C的變量定義舉例:
inta=5; //定義一個(gè)初值為5的整形變量a
語(yǔ)法規(guī)則:intint_name[=常數(shù)];
注意:上述變量的物理地址是由編譯器分配的2021/5/912sfr或sfr16型關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,語(yǔ)法規(guī)則:
sfr
或
sfr16sfr_name=
字節(jié)地址常數(shù);51MCU中有21個(gè)SFR,如何定義與這些單元相關(guān)的變量?2021/5/913例如,sfrP0=0x80;//定義P0口地址80H
sfrPCON=0x87;//定義PCON地址87H
sfr16DPTR=0x82;//定義DPTR的低端地址82H注意:SFR字節(jié)地址變量的物理地址是由MCU資源決定的2021/5/914sbit型部分SFR具有位地址,如何定義與這些位地址相關(guān)的變量?CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7
D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6
D0^5
D0^4
D0^3
D0^2
D0^1
D0^0
絕對(duì)位地址相對(duì)位地址字節(jié)地址兩種位地址表達(dá)形式:絕對(duì)位地址、相對(duì)位地址2021/5/9151)將SFR的絕對(duì)位地址定義為位變量名
sbit
bit_name=
位地址常數(shù);例如,sbitCY=0xD7;3)將SFR的相對(duì)位位置定義位變量名
sbitbit_name=
sfr_name
^
位位置;例如,sbitCY=PSW^7;2)將SFR的相對(duì)位地址定義為位變量名
sbit
bit_name=
sfr字節(jié)地址
^
位位置;例如,sbitCY=0xD0^7;關(guān)鍵詞sbit用于定義SFR位地址變量,三種定義形式:2021/5/916C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit變量。用一條預(yù)處理命令#include<REG51.H>把這個(gè)頭文件包含到C51程序中,無(wú)需重新定義即可直接使用它們的名稱(chēng)。2021/5/917應(yīng)用舉例:2021/5/918【存儲(chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名51單片機(jī)的三個(gè)邏輯存儲(chǔ)空間:片內(nèi)數(shù)據(jù)存儲(chǔ)器,片外數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器。2021/5/919建立C51存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系data區(qū)code區(qū)xdata區(qū)bdata區(qū)pdata區(qū)idata區(qū)2021/5/920C51的存儲(chǔ)類(lèi)型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系表
SMALL系統(tǒng)COMPACT系統(tǒng)LARGE系統(tǒng)編譯模式2021/5/921三種編譯模式分別對(duì)應(yīng)于三種缺省存儲(chǔ)類(lèi)型:【存儲(chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名C51編譯器可根據(jù)當(dāng)前采取的編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類(lèi)型約定:若無(wú)特殊聲明,一般均為“SMALL編譯模式”2021/5/922變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線,變量名長(zhǎng)度隨編譯系統(tǒng)而定。變量名具有字母大小寫(xiě)的敏感性,如SUM和sum代表不同的變量?!敬鎯?chǔ)類(lèi)別】
數(shù)據(jù)類(lèi)型
【存儲(chǔ)器類(lèi)型】
變量名變量名不得使用標(biāo)準(zhǔn)C語(yǔ)言和C51語(yǔ)言的關(guān)鍵字。2021/5/923unsignedchardatasystem_status=0;
//定義system_status為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于data區(qū)中且初值為0。變量定義舉例變量名為system_status位于片內(nèi)RAM區(qū)無(wú)符號(hào)字符型自動(dòng)型初值為零2021/5/924unsignedcharbdatastatus_byte;
unsignedintcodeunit_id[2]={0x1234,0x89ab};
staticcharm,n;
//定義status_byte為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于bdata區(qū)//定義unit_id[2]為無(wú)符號(hào)整型自動(dòng)變量,該變量位于code區(qū)中,是長(zhǎng)度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個(gè)位于data區(qū)中的有符號(hào)字符型靜態(tài)變量。2021/5/9252.C51的指針
定義了一個(gè)指向由“數(shù)據(jù)類(lèi)型”說(shuō)明的變量的指針變量;被指向變量和指針變量位于C編譯器默認(rèn)的內(nèi)存區(qū)域中。標(biāo)準(zhǔn)C語(yǔ)言指針的一般定義形式為:數(shù)據(jù)類(lèi)型*指針變量名;例如:inta=’A’;int*p1=&a;表示:p1是一個(gè)指向int型變量的指針變量p1的值是int型變量a的地址a和p1兩個(gè)變量都位于C編譯器默認(rèn)的內(nèi)存區(qū)域中2021/5/926在C51里定義指針,需要額外說(shuō)明兩個(gè)問(wèn)題:
1)指針變量自身位于哪個(gè)存儲(chǔ)區(qū)域?2)被指向變量位于哪個(gè)存儲(chǔ)區(qū)中?C51指針的一般定義形式:
數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)型1】*【存儲(chǔ)類(lèi)型2】
指針變量名;數(shù)據(jù)類(lèi)型——被指向變量的數(shù)據(jù)類(lèi)型,不能缺省存儲(chǔ)類(lèi)型1——被指向變量所在的存儲(chǔ)區(qū)類(lèi)型,缺省時(shí)根據(jù)該變量的定義語(yǔ)句確定存儲(chǔ)類(lèi)型2——指針變量所在的存儲(chǔ)區(qū)類(lèi)型,缺省時(shí)根據(jù)C51編譯模式的默認(rèn)值確定指針變量名——按C51變量名的規(guī)則選取2021/5/927例1charxdataa=‘A’;char*ptr=&a;舉例說(shuō)明C51指針定義的用法(SMALL編譯模式下)【解】ptr是一個(gè)指向char型變量的指針變量;它本身位于SMALL編譯模式默認(rèn)的data存儲(chǔ)區(qū)里;它的值是位于xdata存儲(chǔ)區(qū)里的char型變量a的地址;“存儲(chǔ)類(lèi)型1”缺省時(shí),靠被指向變量的定義確定存儲(chǔ)類(lèi)型。數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)型1】*【存儲(chǔ)類(lèi)型2】
指針變量名;2021/5/928例2charxdataa=‘A’;char*ptr=&a;charidatab=‘B’;*ptr=&b;【解】Ptr先指向位于xdata存儲(chǔ)區(qū)的char型變量a,后指向位于idata存儲(chǔ)區(qū)的char型變量b;“存儲(chǔ)類(lèi)型1”缺省時(shí),ptr指針具有一定隨意性。數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)型1】*【存儲(chǔ)類(lèi)型2】
指針變量名;2021/5/929例3charxdataa=‘A’;charxdata*ptr=&a;【解】a是位于xdata存儲(chǔ)區(qū)里的char型變量;ptr是固定指向xdata存儲(chǔ)區(qū)中char型變量的指針變量;“存儲(chǔ)類(lèi)型1”存在時(shí),ptr指針具有固定指向性。數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)型1】*【存儲(chǔ)類(lèi)型2】
指針變量名;2021/5/930例4charxdataa=‘A’;charxdata*idataptr=&a;【解】ptr是固定指向xdata存儲(chǔ)區(qū)的char型變量的指針變量;它自身存放在idata存儲(chǔ)區(qū)中;“存儲(chǔ)類(lèi)型2”存在時(shí),ptr
指針具有明確的存儲(chǔ)區(qū)域。數(shù)據(jù)類(lèi)型【存儲(chǔ)類(lèi)型1】*【存儲(chǔ)類(lèi)型2】
指針變量名;2021/5/931四、C51的運(yùn)算符及表達(dá)式1算術(shù)運(yùn)算符和算術(shù)表達(dá)式(1)、基本算術(shù)運(yùn)算符+加法運(yùn)算符,或正值符號(hào);-減法運(yùn)算符,或負(fù)值符號(hào);
×乘法運(yùn)算符;/除法運(yùn)算符;
%模(求余)運(yùn)算符;例11%3=2,結(jié)果是11除以3所得余數(shù)為2。在上述運(yùn)算符中,加、減和乘法符合一般的算術(shù)運(yùn)算規(guī)則。除法運(yùn)算時(shí),如果是兩個(gè)整數(shù)相除,其結(jié)果為整數(shù);如果是兩個(gè)浮點(diǎn)數(shù)相除,其結(jié)果為浮點(diǎn)數(shù)。而對(duì)于取余運(yùn)算,則要求兩個(gè)運(yùn)算對(duì)象均為整型數(shù)據(jù)。2021/5/932C語(yǔ)言規(guī)定了算術(shù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。
優(yōu)先級(jí)---指當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí),執(zhí)行運(yùn)算的先后次序。按運(yùn)算符優(yōu)先級(jí)別的高低順序執(zhí)行運(yùn)算。
結(jié)合性---指當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符優(yōu)先級(jí)別相同時(shí)的運(yùn)算順序。算術(shù)運(yùn)算符中取負(fù)運(yùn)算的優(yōu)先級(jí)最高,其次是乘法、除法和取余,加法和減法的優(yōu)先級(jí)最低。也可以根據(jù)需要,在算術(shù)表達(dá)式采用括號(hào)來(lái)改變優(yōu)先級(jí)的順序。如:a+b/c;該表達(dá)式中,除號(hào)優(yōu)先級(jí)高于加號(hào),故先運(yùn)算b/c所得結(jié)果,之后再與a相加。(a+b)*(c-d)-e;該表達(dá)式中,括號(hào)優(yōu)先級(jí)最高,其次是“*”,最后是減號(hào)。故先運(yùn)算(a+b)和(c-d),然后再將二者結(jié)果相乘,最后與e相減。2021/5/933(2)、自增減運(yùn)算符自增減運(yùn)算符的作用是使變量值自動(dòng)加1或減1。
++自增運(yùn)算符;
--自減運(yùn)算符;
++和--運(yùn)算符只能用于變量,不能用于常量和表達(dá)式。如++(a+1)是錯(cuò)誤的。如:++i、--i在使用i之前,先使i值加(減)1。
i++、i--在使用i之后,再使i值加(減)1。粗略的看,++i和i++的作用都相當(dāng)于i=i+1,但++i和i++的不同之處在于++i先執(zhí)行i=i+1,再使用i的值;而i++則是先使用i的值,再執(zhí)行i=i+1。如:若i值原來(lái)為5.則
j=++i;j的值為6,i的值也為6;
j=i++;j的值為5,i的值為6;2021/5/934(3)、類(lèi)型轉(zhuǎn)換運(yùn)算符兩側(cè)的數(shù)據(jù)類(lèi)型不同時(shí),要轉(zhuǎn)換成同種類(lèi)型。轉(zhuǎn)換的方法有兩種,一是自動(dòng)轉(zhuǎn)換,是編譯系統(tǒng)在編譯時(shí)自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換,順序是:
bit→char→int→long→float,signed→unsigned。二是強(qiáng)制類(lèi)型轉(zhuǎn)換,是通過(guò)類(lèi)型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的。其一般形式:(類(lèi)型說(shuō)明符)(表達(dá)式)
功能:把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類(lèi)型說(shuō)明符所表示的類(lèi)型。如:(double)a將a強(qiáng)制轉(zhuǎn)換成double類(lèi)型(int)(x+y)將x+y值強(qiáng)制轉(zhuǎn)換成int類(lèi)型
(float)(5%3)將模運(yùn)算5%3的值強(qiáng)制轉(zhuǎn)換成float類(lèi)型。2021/5/9352關(guān)系運(yùn)算符、關(guān)系表達(dá)式及優(yōu)先級(jí)(1)、C51提供六種關(guān)系運(yùn)算符﹤小于;﹤=小于等于;﹥大于;﹥=大于等于==測(cè)試等于;==!=測(cè)試不等于;(2)、關(guān)系運(yùn)算符的優(yōu)先級(jí)
1)<、>、<=、>=的優(yōu)先級(jí)相同,兩種==、==相同;前4種優(yōu)先級(jí)高于后兩種。2)關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符。3)關(guān)系運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符。如:c>a+b等效于c>(a+b);a>b!=c等效于(a>b)!=c
a=b>c等效于a=(b>c)
(3)、關(guān)系運(yùn)算符的結(jié)合性為左結(jié)合如:a=4,b=3,c=1,則f=a>b>c,則a>b的值為1,1>c的值為0,故f=0。
(4)、關(guān)系表達(dá)式用關(guān)系運(yùn)算符和將兩個(gè)表達(dá)式(可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、字符表達(dá)式)連接起來(lái)的式子。
(5)、關(guān)系表達(dá)式的結(jié)果真和假。C51中用0表示假,1表示真。2021/5/9363邏輯運(yùn)算符和邏輯表達(dá)式及優(yōu)先級(jí)(1)、C51提供3種邏輯運(yùn)算符!邏輯“非”(NOT)
&&邏輯“與”(AND)
||邏輯“或”(OR)“&&”和“||”是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對(duì)象;而“!”是單目運(yùn)算符,只要求有一個(gè)運(yùn)算對(duì)象。(2)、邏輯運(yùn)算符的優(yōu)先級(jí)在邏輯運(yùn)算中,邏輯非的優(yōu)先級(jí)最高,且高于算術(shù)運(yùn)算符;邏輯或的優(yōu)先級(jí)最低,低于關(guān)系運(yùn)算符,但高于賦值運(yùn)算符。(3)、邏輯表達(dá)式用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子稱(chēng)為邏輯表達(dá)式。其值應(yīng)為邏輯量真和假,邏輯表達(dá)式和關(guān)系表達(dá)式的值相同,以0代表假,1代表真。
(4)、邏輯運(yùn)算符的結(jié)合性為從左到右。例:如a=4,b=5則:
!a為假。因?yàn)閍=4(非0)為真,所以!a為假(0)。
a||b為真。因?yàn)閍,b為真,所以兩者相或?yàn)檎妗?/p>
a&&b為真。
!a&&b為假(0)。!優(yōu)先級(jí)高于&&,先執(zhí)行!a為假(0),0&&b=0,結(jié)果為假。2021/5/9374C51位操作及其表達(dá)式
C51提供6種位運(yùn)算符:
&位與;
|位或;
^位異或;
~位取反;
<<左移;
>>右移;除按位取反運(yùn)算符“~”以外,以上位操作運(yùn)算符都是雙目運(yùn)算符,及要求運(yùn)算符兩側(cè)各有一個(gè)運(yùn)算對(duì)象。(1)、“按位與”運(yùn)算符“&”
運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象,若兩者相應(yīng)的位都為1,則該位結(jié)果為1,否則為0,即:0&0=0、0&1=0、1&0=0、1&1=0
如:a=45h=01000101b,b=0deh=11011110b,則表達(dá)式c=a&b=44h
按位與的主要用途:
1)清零。用0去和需要清零的位按位與運(yùn)算。
2)取指定位。2021/5/938
(2)、“按位或”運(yùn)算符“|”
運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象,若兩者相應(yīng)的位中有一位為1,則該位結(jié)果為1,否則為0,即:0|0=0、0|1=1、1|0=1、1|1=1
如:a=30h=00110000b,b=0fh=00001111b,則表達(dá)式c=a|b=3fh
按位或的主要用途是將一個(gè)數(shù)的某些位置1,則需要將這些位和1按位或,其余的位和0進(jìn)行按位或運(yùn)算則不變。
(3)、“異或”運(yùn)算符“^”
運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象,若兩者相應(yīng)的位相同,則結(jié)果為0;若兩則相應(yīng)的位相異,結(jié)果為1,即:0^0=0、0^1=1、1^0=1、1^1=0
如:a=0a5h,b=3dh,則表達(dá)式c=a^b=98h
按位異或的主要用途:
1)使特定位翻轉(zhuǎn)(0變1,1變0):需要翻轉(zhuǎn)的位和1按位異或運(yùn)算,不需要翻轉(zhuǎn)的位和0按位異或運(yùn)算。原數(shù)和自身按位異或后得0。
2)不用臨時(shí)變量而交換兩數(shù)的值。(4)、“位取反”運(yùn)算符“~”“~”是一個(gè)單目運(yùn)算符,用來(lái)對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即0變1,1變0。(5)、位左移和位右移運(yùn)算符(<<,>>)位左移、位右移運(yùn)算符“<<”和“>>”,用來(lái)將一個(gè)二進(jìn)制位的全部左移或右移若干位;移位后,空白位補(bǔ)0,而溢出的位舍棄。
如:a=15h,則a=a<<2=54h;a=a>>2=05h2021/5/9396、賦值和復(fù)合賦值運(yùn)算符
符號(hào)“=”稱(chēng)為賦值運(yùn)算符,其作用是將一個(gè)數(shù)據(jù)的值賦予一個(gè)變量。賦值表達(dá)式的值就是被賦值變量的值。在賦值運(yùn)算符的前面加上其他運(yùn)算符就可以構(gòu)成復(fù)合賦值運(yùn)算符。在C51中共有10種復(fù)合運(yùn)算符,這10種賦值運(yùn)算符均為雙目運(yùn)算符。即:
+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=,~=。采用這種復(fù)合賦值運(yùn)算的目的,是為了簡(jiǎn)化程序,提高C程序編譯效率。如:
a+=b相當(dāng)于a=a+ba%=b相當(dāng)于a=a%ba-=b相當(dāng)于a=a-ba<<=3相當(dāng)于a=a<<3a*=b相當(dāng)于a=a*ba>>=2相當(dāng)于a=a>>2a/=b相當(dāng)于a=a/b……等等。
7、其他運(yùn)算符(共有10個(gè))
[]:數(shù)組的下標(biāo)。
():括號(hào)。
.:結(jié)構(gòu)/聯(lián)合變量指針成員。
&:取內(nèi)容。?:三目運(yùn)算符。,:逗號(hào)運(yùn)算符。
Sizeof:sizeof運(yùn)算符用于在程序中測(cè)試某一數(shù)據(jù)類(lèi)型占用多少字節(jié)。2021/5/940五、C51的程序結(jié)構(gòu)
C51語(yǔ)言程序是由函數(shù)組成的。函數(shù)是C51語(yǔ)言的基本模塊。用C51語(yǔ)言設(shè)計(jì)程序就是編寫(xiě)函數(shù)。從來(lái)源看,函數(shù)可分為用戶自定義函數(shù)和標(biāo)準(zhǔn)庫(kù)函數(shù)兩大類(lèi)。在一個(gè)C51語(yǔ)言程序中有且只能有一個(gè)名為main的主函數(shù)。C51語(yǔ)言程序的執(zhí)行部分是由語(yǔ)句組成的。程序的各種主要功能都是由語(yǔ)句實(shí)現(xiàn)的。C語(yǔ)言的語(yǔ)句可分為流程控制語(yǔ)句、表達(dá)式語(yǔ)句、復(fù)合語(yǔ)句、空語(yǔ)句。C51語(yǔ)言中新增了兩種函數(shù)類(lèi)型——中斷函數(shù)和重入函數(shù)。2021/5/9411、語(yǔ)句與流程控制基本語(yǔ)句:賦值、函數(shù)調(diào)用、復(fù)合語(yǔ)句及空語(yǔ)句等分支語(yǔ)句:if-else、switch語(yǔ)句等循環(huán)語(yǔ)句:for、while、do-while語(yǔ)句等輔助控制語(yǔ)句:break、continue語(yǔ)句2021/5/9422、函數(shù)中斷函數(shù)重入函數(shù)標(biāo)準(zhǔn)庫(kù)函數(shù)
2021/5/943[return_type]funcname([args])[{small|compact|large}][reentrant][interruptn][usingn]{
局部變量定義 可執(zhí)行語(yǔ)句}C51語(yǔ)言中函數(shù)定義的一般格式:
其中,大括號(hào)以外的部分稱(chēng)為函數(shù)頭;大括號(hào)以內(nèi)的部分稱(chēng)為函數(shù)體。如果函數(shù)體內(nèi)無(wú)語(yǔ)句,則稱(chēng)之為空函數(shù)??蘸瘮?shù)不執(zhí)行任何操作,定義它的目的只是為了以后程序功能的擴(kuò)充。2021/5/944
從函數(shù)的定義格式可以看出,C51語(yǔ)言在4個(gè)方面對(duì)標(biāo)準(zhǔn)C語(yǔ)言的函數(shù)進(jìn)行了擴(kuò)展:指定函數(shù)的存儲(chǔ)模式;指定函數(shù)是可再入的;指定函數(shù)是一個(gè)中斷函數(shù);指定函數(shù)所用的工作寄存器組。
用C51語(yǔ)言設(shè)計(jì)程序,就是編寫(xiě)函數(shù)。在構(gòu)成C51語(yǔ)言設(shè)計(jì)程序的若干個(gè)函數(shù)中,有且僅有一個(gè)是主函數(shù)main()。因?yàn)镃51語(yǔ)言程序的執(zhí)行都是從main()函數(shù)開(kāi)始的,也是在main()函數(shù)中結(jié)束整個(gè)程序運(yùn)行的,其他函數(shù)只有在執(zhí)行main()函數(shù)的過(guò)程中被調(diào)用才能被執(zhí)行。2021/5/945
同變量一樣,函數(shù)也必須先定義后使用。所有函數(shù)在定義時(shí)都是相互獨(dú)立的,一個(gè)函數(shù)中不能再定義其他函數(shù),但可以相互調(diào)用。函數(shù)調(diào)用的一般規(guī)則是:主函數(shù)可以調(diào)用其他普通函數(shù);普通函數(shù)之間可以相互調(diào)用;普通函數(shù)不能調(diào)用主函數(shù)。
從用戶使用的角度看,函數(shù)可以分成兩大類(lèi):標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)。下面重點(diǎn)介紹C51語(yǔ)言中新增的中斷函數(shù)、重入函數(shù)和常用的標(biāo)準(zhǔn)庫(kù)函數(shù)。2021/5/94651系列單片機(jī)通常有5個(gè)中斷源,為了方便使用,C51語(yǔ)言對(duì)它們進(jìn)行了編號(hào),見(jiàn)下表:51系列單片機(jī)的中斷源及其編號(hào)
中斷函數(shù):2021/5/947
當(dāng)CPU正在執(zhí)行一個(gè)特定任務(wù)時(shí),可能有更緊急的事情需要CPU處理,這就涉及中斷優(yōu)先級(jí)。高優(yōu)先級(jí)中斷可以中斷正在處理的低優(yōu)先級(jí)中斷程序,因此最好給每種不同優(yōu)先級(jí)程序分配不同的工作寄存器組,以達(dá)到壓棧保護(hù)的目的。
中斷函數(shù)的定義格式:函數(shù)類(lèi)型函數(shù)名()interrupt中斷編號(hào)using工作寄存器組編號(hào)
{
可執(zhí)行語(yǔ)句
}2021/5/948
例如,下列程序片段為定時(shí)器/計(jì)數(shù)器0的中斷服務(wù)程序,指定使用第2組工作寄存器。
…… unsignedintCNT1; unsignedcharCNT2;
voidTimer()interrupt1using2 { if(++CNT1==1000) //CNT1計(jì)數(shù)到1000 { CNT2++; //CNT2開(kāi)始計(jì)數(shù)
CNT1=0; //CNT1清零
} }
……2021/5/949
在編寫(xiě)中斷函數(shù)時(shí),應(yīng)特別注意以下幾點(diǎn):(1)中斷函數(shù)為無(wú)參函數(shù),即不能在中斷函數(shù)中定義任何變量,否則將導(dǎo)致編譯錯(cuò)誤。(2)中斷函數(shù)沒(méi)有返回值,即應(yīng)將中斷函數(shù)定義為void類(lèi)型。(3)中斷函數(shù)不能直接被調(diào)用,否則將導(dǎo)致編譯錯(cuò)誤。(4)中斷函數(shù)使用浮點(diǎn)運(yùn)算時(shí)要保存浮點(diǎn)寄存器的狀態(tài)。(5)如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)用函數(shù)所使用的寄存器組必須與中斷函數(shù)相同。(6)由于中斷的產(chǎn)生不可預(yù)測(cè),中斷函數(shù)對(duì)其他函數(shù)的調(diào)用可能形成遞歸調(diào)用,必要時(shí)可將被中斷函數(shù)調(diào)用的其他函數(shù)定義成再入函數(shù)。2021/5/950重入函數(shù):
在主函數(shù)和中斷函數(shù)中都可調(diào)用的函數(shù)容易產(chǎn)生問(wèn)題。51系列單片機(jī)一般使用寄存器傳遞函數(shù)參數(shù),局部變量一般存放在片內(nèi)RAM中。由于片內(nèi)RAM的容量很小(只有128B),函數(shù)再入時(shí)會(huì)破壞或覆蓋上次調(diào)用的數(shù)據(jù)。為此,C51語(yǔ)言提供了關(guān)鍵字reentrant,用于將相應(yīng)的函數(shù)指定為可重入函數(shù)。所謂重入函數(shù),是指可以在函數(shù)體內(nèi)間接調(diào)用其自身的函數(shù)。2021/5/951
重入函數(shù)可以被遞歸調(diào)用和多重調(diào)用,而不用擔(dān)心變量被覆蓋,因?yàn)槊看魏瘮?shù)調(diào)用中的局部變量都會(huì)被單獨(dú)保存起來(lái)。
重入函數(shù)的定義格式:
函數(shù)類(lèi)型函數(shù)名(形參列表)reentrant {
局部變量說(shuō)明 可執(zhí)行語(yǔ)句
}2021/5/952標(biāo)準(zhǔn)庫(kù)函數(shù):
根據(jù)51系列單片機(jī)本身的特點(diǎn),C51語(yǔ)言編譯系統(tǒng)在C語(yǔ)言的基礎(chǔ)上又?jǐn)U展了以下幾種庫(kù)函數(shù):(1)C51S.LIB: Small模式,無(wú)浮點(diǎn)運(yùn)算。(2)C51FPS.LIB: Small模式,有浮點(diǎn)運(yùn)算。(3)C51C.LIB: Compact模式,無(wú)浮點(diǎn)運(yùn)算。(4)C51FPC.LIB: Compact模式,有浮點(diǎn)運(yùn)算。(5)C51L.LIB: Large模式,無(wú)浮點(diǎn)運(yùn)算。(6)C51FPL.LIB: Large模式,有浮點(diǎn)運(yùn)算。
所謂標(biāo)準(zhǔn)庫(kù)函數(shù),是指由編譯系統(tǒng)提供的、用戶可以直接調(diào)用的函數(shù)。在程序設(shè)計(jì)中,多使用庫(kù)函數(shù)使程序代碼簡(jiǎn)單,結(jié)構(gòu)清晰,易于調(diào)試和維護(hù)。2021/5/953
每個(gè)庫(kù)函數(shù)都在相應(yīng)的頭文件中給出了函數(shù)原型聲明。在使用庫(kù)函數(shù)時(shí),必須在源程序的開(kāi)頭處用#include命令將有關(guān)的頭文件包含進(jìn)來(lái),例如:
#include<reg51.h> #include<stdio.h> … voidmain(){…}
值得注意的是,C51語(yǔ)言中的某些庫(kù)函數(shù)的參數(shù)和調(diào)用格式與標(biāo)準(zhǔn)C語(yǔ)言有所不同,如isdigit()函數(shù)的返回值類(lèi)型是bit而不是int。2021/5/954
在C51語(yǔ)言中,調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)的方式有以下兩種:(1)作為表達(dá)式的一部分。例如,求y=|x|+3可以通過(guò)調(diào)用abs()函數(shù)來(lái)實(shí)現(xiàn):y=abs(x)+3;(2)作為獨(dú)立的語(yǔ)句完成某種操作。例如:printf("*****\n");可以在標(biāo)準(zhǔn)輸出設(shè)備上輸出一行5個(gè)連續(xù)的“*”號(hào)。KeilC51提供了相當(dāng)豐富的標(biāo)準(zhǔn)庫(kù)函數(shù),并把它們分門(mén)別類(lèi)地歸屬到不同的頭文件中,標(biāo)準(zhǔn)庫(kù)函數(shù)的原型、功能描述、返回值、重入屬性以及應(yīng)用舉例在KeilC51集成開(kāi)發(fā)環(huán)境提供的幫助文檔中均可以查到。2021/5/955
以數(shù)學(xué)類(lèi)庫(kù)函數(shù)abs()為例,查閱標(biāo)準(zhǔn)庫(kù)函數(shù)的方法(1)在KeilC51集成開(kāi)發(fā)環(huán)境下,單擊工程管理器中的Books標(biāo)簽,即可看到KeilC51提供的幫助文檔,如圖3.15所示。KeilC51的幫助文檔2021/5/956(2)在下圖所示的界面中,雙擊C51庫(kù)函數(shù)(C51LibraryFunctions)選項(xiàng),打開(kāi)C51庫(kù)函數(shù)幫助窗口,如圖所示。KeilC51的庫(kù)函數(shù)2021/5/957(3)在圖的左側(cè)窗口找到abs并單擊,則在圖的右側(cè)窗口中可以看到有關(guān)庫(kù)函數(shù)abs()的介紹內(nèi)容,包括該函數(shù)所屬的頭文件、函數(shù)原型、功能描述、再入屬性以及應(yīng)用舉例等,如圖所示。庫(kù)函數(shù)abs()的幫助文檔2021/5/9581.Keil的編譯環(huán)境μVision3
Keil是德國(guó)KeilSoftware公司的51單片機(jī)開(kāi)發(fā)軟件包,包括C編譯器、匯編編譯器、連接器、庫(kù)管理及仿真調(diào)試器,通過(guò)一個(gè)windows下的集成開(kāi)發(fā)環(huán)境uVisoin3組合起來(lái)。六、開(kāi)發(fā)環(huán)境2021/5/959μVision3的軟件界面包括四大組成部分,即菜單工具欄,工程管理窗
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 24625-2024變頻器供電同步電動(dòng)機(jī)設(shè)計(jì)與應(yīng)用指南
- 保密及技術(shù)成果歸屬合同
- 預(yù)售房屋買(mǎi)賣(mài)合同范本
- 設(shè)備抵押合同范本2024年
- 員工分紅協(xié)議書(shū)范文2024年
- 員工培訓(xùn)協(xié)議-合同范本
- 辦公樓租賃合同范本模板
- 施工合同中的情勢(shì)變更分析
- 標(biāo)準(zhǔn)住宅出租協(xié)議樣本
- 合作意向協(xié)議書(shū)范文2024,項(xiàng)目合作意向協(xié)議書(shū)
- 啤酒終端銷(xiāo)售培訓(xùn)課件
- 電磁感應(yīng)實(shí)驗(yàn):研究電磁感應(yīng)現(xiàn)象與法拉第電磁感應(yīng)定律
- 納米技術(shù)課件
- 手足口病(PPT課件)
- 貴州退役軍人事務(wù)廳事業(yè)單位筆試真題2023
- 華爾街之狼:掌握直線銷(xiāo)售的藝術(shù)
- 2024年江蘇國(guó)信集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 《建設(shè)美麗中國(guó)》課件
- 2024年全國(guó)高考體育單招考試語(yǔ)文試卷試題(含答案詳解)
- 多葉片微風(fēng)風(fēng)力發(fā)電項(xiàng)目融資計(jì)劃書(shū)
- 普通診所污水、污物、糞便處理方案 及周邊環(huán)境情況說(shuō)明
評(píng)論
0/150
提交評(píng)論