第4章-單片機(jī)的C51編程語(yǔ)言_第1頁(yè)
第4章-單片機(jī)的C51編程語(yǔ)言_第2頁(yè)
第4章-單片機(jī)的C51編程語(yǔ)言_第3頁(yè)
第4章-單片機(jī)的C51編程語(yǔ)言_第4頁(yè)
第4章-單片機(jī)的C51編程語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章單片機(jī)的C51編程語(yǔ)言2023/7/281第4章_單片機(jī)的C51編程語(yǔ)言第4章單片機(jī)的C51編程語(yǔ)言4.1C51編程語(yǔ)言概述 4.2C51的標(biāo)識(shí)符和關(guān)鍵字 4.3C51的變量與數(shù)據(jù)類(lèi)型 4.4C51語(yǔ)言的數(shù)組、指針與結(jié)構(gòu) 4.5C51的運(yùn)算符和表達(dá)式 4.6C51語(yǔ)言的程序結(jié)構(gòu) 4.7C51語(yǔ)言的函數(shù) 4.8中斷服務(wù)程序 4.9C51的預(yù)處理 4.10C51的庫(kù)函數(shù) 4.11使用C5I編譯器時(shí)的注意事項(xiàng) 2023/7/282第4章_單片機(jī)的C51編程語(yǔ)言4.1C51編程語(yǔ)言概述C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,可產(chǎn)生緊湊代碼C語(yǔ)言可以進(jìn)行許多機(jī)器級(jí)函數(shù)控制而不用匯編語(yǔ)言。C語(yǔ)言目前已成為電子工程師進(jìn)行單片機(jī)系統(tǒng)編程時(shí)的首選編程語(yǔ)言。用C語(yǔ)言來(lái)編寫(xiě)目標(biāo)系統(tǒng)軟件,會(huì)大大縮短開(kāi)發(fā)周期,且明顯地增加軟件的可讀性,便于改進(jìn)和擴(kuò)充?;?1系列單片機(jī)的C語(yǔ)言或C語(yǔ)言編譯器簡(jiǎn)稱(chēng)為C51語(yǔ)言或C51。2023/7/283第4章_單片機(jī)的C51編程語(yǔ)言C51語(yǔ)言編程與匯編語(yǔ)言編程相比的優(yōu)勢(shì)1.可讀性好、編程調(diào)試靈活方便2.生成的代碼編譯效率高3.完全模塊化4.可移植性好5.便于項(xiàng)目維護(hù)管理2023/7/284第4章_單片機(jī)的C51編程語(yǔ)言單片機(jī)C51與標(biāo)準(zhǔn)ANSlC編譯器的主要區(qū)別以Keil公司的KeilC5l(以下簡(jiǎn)稱(chēng)C5l)編譯器為例C5l系列頭文件集中體現(xiàn)了各系列芯片的不同功能C5l比ANSIC多一種“位”類(lèi)型數(shù)據(jù)存儲(chǔ)類(lèi)型有很大的區(qū)別函數(shù)的使用上,由于單片機(jī)系統(tǒng)的資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套C5l與標(biāo)準(zhǔn)ANSIC庫(kù)函數(shù),由于部分庫(kù)函數(shù)不適合單片機(jī)處理系統(tǒng),因此被排除在外,如字符屏幕和圖形函數(shù)。也有一些庫(kù)函數(shù)繼續(xù)使用,但這些庫(kù)函數(shù)是廠家針對(duì)硬件特點(diǎn)相應(yīng)開(kāi)發(fā)的,它們與ANSIC的構(gòu)成及用法都有很大的區(qū)別,如printf和scanf。在ANSIC中這兩個(gè)函數(shù)通常用于屏幕打印和接收字符,而在C5l中,它們則主要用于串行通信口數(shù)據(jù)的發(fā)送和接收。2023/7/285第4章_單片機(jī)的C51編程語(yǔ)言C51的開(kāi)發(fā)過(guò)程例4-1設(shè)圖1-2系統(tǒng)要求是:當(dāng)S1閉合時(shí),報(bào)警燈亮;而S1打開(kāi)時(shí),報(bào)警燈滅。用C51語(yǔ)言編寫(xiě)實(shí)現(xiàn)該功能的程序,程序名為ex4-1.c:#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRsbitP32=P3^2; //定義P3.2為P32sbitP20=P2^0; //定義P2.0為P20main(){ while(1){ P32=1; if(P32==0){ P20=1; }else{ P20=0; } }}在C51中,使用“/**/”和“//”符號(hào)進(jìn)行注釋。注釋不影響程序的功能,用于說(shuō)明程序的用途、功能,增加程序的可讀性和可維護(hù)性。編譯后注釋不存在,不影響運(yùn)行文件的大小。優(yōu)秀的程序設(shè)計(jì)人員要養(yǎng)成良好的注釋習(xí)慣,一般在程序的開(kāi)始要寫(xiě)注釋?zhuān)砻鞒绦虻囊?、功能,編?xiě)人員,編寫(xiě)日期,版本號(hào)等信息。2023/7/286第4章_單片機(jī)的C51編程語(yǔ)言使用任何文本編輯軟件,或KEILC集成的編輯系統(tǒng)書(shū)寫(xiě)C以上程序。使用KEILC的C51編譯器和連接軟件(用KEILC集成開(kāi)發(fā)工具uVision中的Buildtarget批處理),生成可以寫(xiě)入單片機(jī)的目標(biāo)文件,通常為HEX文件(ex4-1.hex)用程序燒錄器將該文件寫(xiě)入單片機(jī),單片機(jī)上電即可運(yùn)行。同時(shí)Buildtarget還生成許多中間文件,用于程序的調(diào)試,例如,從ex4-1.lst文件中可以看見(jiàn)C程序編譯后生成的匯編程序,由此可以理解單片機(jī)硬件具體的執(zhí)行過(guò)程,還可以對(duì)C程序編程的效率進(jìn)行了解。2023/7/287第4章_單片機(jī)的C51編程語(yǔ)言ex4-1.lst文件

0000?C0001:0000 D2B2SETBP320002 20B204JBP32,?C00030005 D2A0SETBP200007 80F7SJMP?C00010009?C0003:0009 C2A0CLRP20000B 80F3SJMP?C0001可以看出,C編譯器編譯的結(jié)果與我們大多人用匯編語(yǔ)言的編程結(jié)果相同,但是C51語(yǔ)言的可讀性更好,特別是當(dāng)程序更加復(fù)雜時(shí),C51語(yǔ)言有明顯的優(yōu)勢(shì)。2023/7/288第4章_單片機(jī)的C51編程語(yǔ)言

標(biāo)識(shí)符用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象的名字,這些對(duì)象可以是語(yǔ)句、數(shù)據(jù)類(lèi)型、函數(shù)、變量、數(shù)組等。

C語(yǔ)言是區(qū)分大小寫(xiě)的一種高級(jí)語(yǔ)言。標(biāo)識(shí)符由字符串、數(shù)字和下劃線等組成,第一個(gè)字符必須是字母或下劃線錯(cuò)誤的標(biāo)識(shí)符,編譯時(shí)會(huì)有錯(cuò)誤提示。

C5l中有些庫(kù)函數(shù)的標(biāo)識(shí)符是以下劃線開(kāi)頭的,所以一般不要以下劃線開(kāi)頭命名標(biāo)識(shí)符。C51的標(biāo)識(shí)符和關(guān)鍵字2023/7/289第4章_單片機(jī)的C51編程語(yǔ)言表4-1ANSIC標(biāo)準(zhǔn)關(guān)鍵字關(guān)鍵字用途說(shuō)明auto存儲(chǔ)種類(lèi)說(shuō)明用于聲明局部變量,為默認(rèn)值break程序語(yǔ)句退出最內(nèi)層循環(huán)體case程序語(yǔ)句switch語(yǔ)句中的選擇項(xiàng)char數(shù)據(jù)類(lèi)型聲明單字節(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)型聲明雙精度浮點(diǎn)數(shù)else程序語(yǔ)句構(gòu)成if…else條件結(jié)構(gòu)enum數(shù)據(jù)類(lèi)型聲明枚舉類(lèi)型數(shù)據(jù)extern存儲(chǔ)種類(lèi)說(shuō)明在其他程序模塊中聲明了的全局變量float數(shù)據(jù)類(lèi)型聲明單精度浮點(diǎn)數(shù)for程序語(yǔ)句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語(yǔ)句構(gòu)成goto循環(huán)結(jié)構(gòu)if程序語(yǔ)句構(gòu)成if…else條件結(jié)構(gòu)int數(shù)據(jù)類(lèi)型聲明整型數(shù)2023/7/2810第4章_單片機(jī)的C51編程語(yǔ)言long數(shù)據(jù)類(lèi)型聲明長(zhǎng)整型數(shù)register存儲(chǔ)種類(lèi)說(shuō)明使用CPU內(nèi)部寄存器變量return程序語(yǔ)句函數(shù)返回short數(shù)據(jù)類(lèi)型聲明短整型signed數(shù)據(jù)類(lèi)型聲明有符號(hào)整型數(shù)sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類(lèi)型的字節(jié)數(shù)static存儲(chǔ)種類(lèi)說(shuō)明靜態(tài)變量struct數(shù)據(jù)類(lèi)型聲明結(jié)構(gòu)體類(lèi)型數(shù)據(jù)switch程序語(yǔ)句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類(lèi)型聲明重新進(jìn)行數(shù)據(jù)類(lèi)型定義union數(shù)據(jù)類(lèi)型聲明聯(lián)合類(lèi)型數(shù)據(jù)unsigned數(shù)據(jù)類(lèi)型聲明無(wú)符號(hào)數(shù)據(jù)void數(shù)據(jù)類(lèi)型聲明無(wú)類(lèi)型數(shù)據(jù)或函數(shù)volatile數(shù)據(jù)類(lèi)型聲明聲明該變量在程序執(zhí)行中可被隱含地改變while程序語(yǔ)句構(gòu)成while和do…while循環(huán)結(jié)構(gòu)2023/7/2811第4章_單片機(jī)的C51編程語(yǔ)言表4-2C51編譯器擴(kuò)充關(guān)鍵字關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行絕對(duì)地址定位_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級(jí)_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)alien函數(shù)特性聲明用于聲明與PL/M51兼容的函數(shù)bdata存儲(chǔ)器類(lèi)型聲明可位尋址的MCS-51內(nèi)部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明一個(gè)位變量或位類(lèi)型函數(shù)code存儲(chǔ)器類(lèi)型聲明MCS-51的程序存儲(chǔ)空間compact存儲(chǔ)器模式按compact模式分配變量的存儲(chǔ)空間data存儲(chǔ)器類(lèi)型聲明直接尋址MCS-51的內(nèi)部數(shù)據(jù)寄存器2023/7/2812第4章_單片機(jī)的C51編程語(yǔ)言idata存儲(chǔ)器類(lèi)型聲明間接尋址MCS-51的內(nèi)部數(shù)據(jù)寄存器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)large存儲(chǔ)器模式按large模式分配變量的存儲(chǔ)空間pdata存儲(chǔ)器類(lèi)型聲明分頁(yè)尋址的MCS-5外部數(shù)據(jù)空間sbit位變量聲明聲明一個(gè)位變量sfr特殊功能寄存器聲明聲明一個(gè)8位特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位特殊功能寄存器small存儲(chǔ)器模式按small模式分配變量的存儲(chǔ)空間using寄存器組定義定義MCS-5的工作寄存器組xdata存儲(chǔ)器類(lèi)型聲明定義MCS-5外部數(shù)據(jù)空間2023/7/2813第4章_單片機(jī)的C51編程語(yǔ)言4.3C51的變量與數(shù)據(jù)類(lèi)型1.常量常量又稱(chēng)為標(biāo)量,它的值在程序執(zhí)行過(guò)程中不能改變,常量的數(shù)據(jù)類(lèi)型有整型、浮點(diǎn)型字符型和字符串型等。實(shí)際使用中用#define定義在程序中經(jīng)常用到的常量,或者可能需要根據(jù)不同的情況進(jìn)行更改的常量,例如譯碼地址。而不是在程序中直接使用常量值。這樣一方面有助于提高程序的可讀性,另一方面也便于程序的修改和維護(hù),例如:#definePI3.14 //以后的編程中用PI代替浮點(diǎn)數(shù)常量3.14,便于閱讀#defineSYSCLK12000000 //長(zhǎng)整型常量用SYSCLK代替12MHz時(shí)鐘#defineTRUE1 //用字符TRUE,在邏輯運(yùn)算中代替1#defineSTAR‘*’ //用STAR表示字符“*”#defineuintunsignedint //用uint代替unsignedint,簡(jiǎn)化編輯2023/7/2814第4章_單片機(jī)的C51編程語(yǔ)言例如語(yǔ)句:if(key==TRUE){},與語(yǔ)句if(key==1){}相同。C51語(yǔ)言(匯編語(yǔ)言也是同樣)編輯時(shí),除注釋外,要使用英文符號(hào),例如上述定義的字符“*”,在程序中是用英文的單引號(hào),而不是中文符號(hào)單引號(hào);2023/7/2815第4章_單片機(jī)的C51編程語(yǔ)言常量分為:1)整型常量。整型常量值:可用十進(jìn)制表示,如128,-35等;也可以用十六進(jìn)制表示,如0x1000。2)浮點(diǎn)型常量。如0.12、-10.3等。3)字符型常量。字符型常量是用單引號(hào)括起來(lái)的一個(gè)字符,如‘A’、‘0’、‘=’等,編譯程序?qū)堰@些字符型常量轉(zhuǎn)換為ASCII碼,例如‘A’等于0x41。對(duì)于不可顯示的控制字符,可直接寫(xiě)出字符的ASCII碼,或者在字符前加上反斜杠“\”組成轉(zhuǎn)義符。轉(zhuǎn)義符可以完成一些特殊功能和格式控制。4)字符串型常量。字符串型常量用一對(duì)雙引號(hào)括起一串字符來(lái)表示,如“Hello”、“OK”等。字符串型常量由雙引號(hào)作為界限符。當(dāng)字符串中需要出現(xiàn)雙引號(hào)時(shí),需使用轉(zhuǎn)義字符“\”來(lái)表示。2023/7/2816第4章_單片機(jī)的C51編程語(yǔ)言表4-3常用的轉(zhuǎn)義符轉(zhuǎn)義字符含義ASCII碼16進(jìn)制(10進(jìn)制)\0空字符(NULL)0x00\n換行符(LF)0x0A\r回車(chē)符(CR)0x0D\t水平制表符(HT)0x09\’單引號(hào)0x27\”雙引號(hào)0x22\\反斜杠0x5C2023/7/2817第4章_單片機(jī)的C51編程語(yǔ)言變量變量是一種在程序執(zhí)行過(guò)程中,其數(shù)值不斷變化的量。C51規(guī)定變量必須先定義后使用。C51的變量主要有表4-4中的各種數(shù)據(jù)類(lèi)型,而sfr、sfr16、sbit三種數(shù)據(jù)類(lèi)型用于對(duì)MCS-51單片機(jī)的特殊功能寄存器(SFR)的操作,不是我們傳統(tǒng)意義上的變量。C51對(duì)變量定義的格式如下:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表2023/7/2818第4章_單片機(jī)的C51編程語(yǔ)言存儲(chǔ)種類(lèi)[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表變量的存儲(chǔ)種類(lèi)反映了變量的作用范圍和壽命,將影響到編譯器對(duì)變量在RAM中位置的安排。C51有四種存儲(chǔ)種類(lèi):auto(自動(dòng))、extern(外部)、static(靜態(tài))、register(寄存器)。如果不聲明變量的存儲(chǔ)種類(lèi),則該變量將為auto變量。2023/7/2819第4章_單片機(jī)的C51編程語(yǔ)言存儲(chǔ)種類(lèi)與PC機(jī)的C編程相比,C51的存儲(chǔ)類(lèi)型復(fù)雜很多,這是由于MCS-51單片機(jī)存儲(chǔ)器類(lèi)型的多樣性決定的??梢酝ㄟ^(guò)存儲(chǔ)器類(lèi)型的定義,將變量安排在不同的存儲(chǔ)區(qū)域。存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型是可選項(xiàng)。如果沒(méi)有定義變量的存儲(chǔ)種類(lèi)或存儲(chǔ)器類(lèi)型,C51編譯器將根據(jù)變量定義的位置以及存儲(chǔ)器模式,由C51編譯器分配變量的在RAM中的位置(地址)。2023/7/2820第4章_單片機(jī)的C51編程語(yǔ)言數(shù)據(jù)類(lèi)型[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表數(shù)據(jù)類(lèi)型決定變量的類(lèi)型以及在存儲(chǔ)器中的長(zhǎng)度,變量名表中各個(gè)變量用逗號(hào)隔開(kāi)。例如:inti,j,k; //定義三個(gè)整型變量i,j,kunsignedintsi,sk; //定義無(wú)符號(hào)整型變量si,skbitmy_bit; //定義位變量my_bit2023/7/2821第4章_單片機(jī)的C51編程語(yǔ)言局部變量和全局變量根據(jù)變量作用域的不同,變量可分為。1)局部變量:局部變量也稱(chēng)為內(nèi)部變量,是指在函數(shù)內(nèi)部或以花括號(hào)“{}”括起來(lái)的功能模塊內(nèi)部定義的變量。局部變量只在定義它的函數(shù)或功能模塊內(nèi)有效,在該函數(shù)或功能模塊以外不能使用。在C5l語(yǔ)言中局部變量必須定義在函數(shù)或功能模塊的開(kāi)頭。2)全局變量。全局變量也稱(chēng)為外部變量,是指在程序開(kāi)始處或各個(gè)功能函數(shù)的外面定義的變量。在程序開(kāi)始處定義的全局變量對(duì)于整個(gè)程序都有效,可供程序中所有的函數(shù)共同使用;而在各功能函數(shù)外面定義的全局變量只對(duì)全局變量定義語(yǔ)句后定義的函數(shù)有效,在全局變量定義之前定義的函數(shù)不能使用該變量。一般在程序開(kāi)始處定義全局變量。2023/7/2822第4章_單片機(jī)的C51編程語(yǔ)言全局變量的缺點(diǎn)(1)全局變量由C編譯器在動(dòng)態(tài)區(qū)外的固定存儲(chǔ)區(qū)域中存儲(chǔ),它在整個(gè)程序執(zhí)行期間均占用存儲(chǔ)空間,這將增大程序執(zhí)行時(shí)所占的內(nèi)存。(2)全局變量是外部定義的,這將破壞函數(shù)的模塊化結(jié)構(gòu),不利于函數(shù)的移植。(3)由于多個(gè)模塊均可對(duì)全局變量進(jìn)行修改,處理不當(dāng)時(shí)可能導(dǎo)致程序錯(cuò)誤,且難以調(diào)試。因此應(yīng)避免使用不必要的全局變量。有時(shí)函數(shù)需要引用一個(gè)在其后面定義的變量或在另一個(gè)程序文件中定義的變量,可使用exten關(guān)鍵字進(jìn)行外部變量聲明。外部變量聲明不同于外部變量定義,外部變量只定義一次,而可以多次使用外部變量聲明。2023/7/2823第4章_單片機(jī)的C51編程語(yǔ)言[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表C51具有ANSIC的所有標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型,包括:char、int、short、long、float和double,對(duì)KeilC的C51編譯器來(lái)說(shuō),short類(lèi)型和int類(lèi)型相同,double類(lèi)型和float類(lèi)型相同。除此之外,為了更加有利地利用MCS-51的結(jié)構(gòu),C51還增加了一些特殊的數(shù)據(jù)類(lèi)型,包括bit、sfr、sfr16、sbit。數(shù)據(jù)類(lèi)型2023/7/2824第4章_單片機(jī)的C51編程語(yǔ)言表4-4C51變量的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型長(zhǎng)度/bit長(zhǎng)度/Byte值域unsignedchar810~255signedchar或char81-128~+127unsignedint1620~65535signedint162-32768~+32768unsignedlong3240~4294967295signedlong324-2147483648~+2147483647float324-1.175494E-38~+3.402823E+38*指針1~3bit10或12023/7/2825第4章_單片機(jī)的C51編程語(yǔ)言1.char字符類(lèi)型char類(lèi)型的長(zhǎng)度是8位,1字節(jié)(簡(jiǎn)稱(chēng)1B),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無(wú)符號(hào)字符類(lèi)型unsignedchar和有符號(hào)字符類(lèi)型signedchar,默認(rèn)值為signedchar類(lèi)型。unsignedchar類(lèi)型用字節(jié)中所有的位表示數(shù)值,可以表達(dá)的數(shù)值范圍是0~255。signedchar類(lèi)型用字節(jié)中最高位表示數(shù)據(jù)的符號(hào),0表示正數(shù),1表示負(fù)數(shù),負(fù)數(shù)用補(bǔ)碼表示,能表示的數(shù)值范圍是-128~+127。unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。2023/7/2826第4章_單片機(jī)的C51編程語(yǔ)言2.int整型int整型長(zhǎng)度為16位,2字節(jié)(2B),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分有符號(hào)int整型數(shù)signedint和無(wú)符號(hào)int整型數(shù)unsignedint,默認(rèn)值為signedint類(lèi)型。signedint表示的數(shù)值范圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號(hào),0表示正數(shù),1表示負(fù)數(shù)。unsignedint表示的數(shù)值范圍是0~65535。2023/7/2827第4章_單片機(jī)的C51編程語(yǔ)言3.long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為32位,4字節(jié)(4B),用于存放一個(gè)4B數(shù)據(jù)。分有符號(hào)long長(zhǎng)整型signedlong和無(wú)符號(hào)long長(zhǎng)整型unsignedlong,默認(rèn)值為signedlong類(lèi)型。signedint表示的數(shù)值范圍是-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號(hào),0表示正數(shù),1表示負(fù)數(shù)。unsignedlong表示的數(shù)值范圍是0~4294967295。2023/7/2828第4章_單片機(jī)的C51編程語(yǔ)言4.float浮點(diǎn)型float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE-754標(biāo)準(zhǔn)(32)的單精度浮點(diǎn)型數(shù)據(jù),占用4B。具有24位精度。2023/7/2829第4章_單片機(jī)的C51編程語(yǔ)言6.bit類(lèi)型bit類(lèi)型存放邏輯變量, 占用一個(gè)位地址,C51編譯器將把bit類(lèi)型的變量安排在單片機(jī)片內(nèi)RAM的位尋址區(qū)。2023/7/2830第4章_單片機(jī)的C51編程語(yǔ)言變量的存儲(chǔ)器類(lèi)型[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表定義變量時(shí),根據(jù)51單片機(jī)存儲(chǔ)器的特點(diǎn),必須指明該變量所處的單片機(jī)的內(nèi)存空間。C5l編譯器支持MCS-51單片機(jī)的硬件結(jié)構(gòu),可完全訪問(wèn)MCS-51硬件系統(tǒng)的所有部分。編譯器通過(guò)將變量或者常量定義成不同的存儲(chǔ)類(lèi)型(data,bdata,idata,pdata,xdata,code)的方法,將它們定位在不同的存儲(chǔ)區(qū)中。2023/7/2831第4章_單片機(jī)的C51編程語(yǔ)言表4-5存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系DATA直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問(wèn)速度快(128字節(jié))BDATA可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(wèn)(16字節(jié))IDATA間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪問(wèn)片內(nèi)全部RAM地址空間(256字節(jié))PDATA分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié)),由MOVX@R0訪問(wèn)XDATA片外數(shù)據(jù)存儲(chǔ)區(qū)(64KB),由MOVX@DPTR訪問(wèn)CODE代碼存儲(chǔ)區(qū)(64KB),由MOVC@DPTR訪問(wèn)2023/7/2832第4章_單片機(jī)的C51編程語(yǔ)言1.DATA區(qū)當(dāng)使用存儲(chǔ)類(lèi)型data,bdata定義變量時(shí),C5l編譯器會(huì)將它們定位在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中(片內(nèi)RAM)。這個(gè)存儲(chǔ)區(qū)的長(zhǎng)度為128字節(jié)。能快速存取各種數(shù)據(jù)。片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)是存放臨時(shí)性傳遞變量或使用頻率較高的變量的理想場(chǎng)所,所以應(yīng)該把使用頻率高的變量放在DATA區(qū),由于空間有限,必須注意使用DATA區(qū),DATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組DATA區(qū)。下面是在DATA區(qū)中聲明變量的例子。unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];floatdataoutp_value;mytypedatanew_var;在SMALL存儲(chǔ)模式下,未說(shuō)明存儲(chǔ)器類(lèi)型時(shí),變量默認(rèn)被定位在DATA區(qū)。2023/7/2833第4章_單片機(jī)的C51編程語(yǔ)言2.BDATA區(qū)當(dāng)在DATA區(qū)的位尋址BDATA區(qū)定義變量,這個(gè)變量就可進(jìn)行位尋址,并且聲明位變量。例如:charbdatavar8bit; //在位尋址區(qū),定義字符型的變量聲明的變量var8bit可以進(jìn)行位操作運(yùn)算,可以用sbit在bdata定義變量的基礎(chǔ)上聲明新的變量,例如:sbitmy_bit2=var8bit^2; //位變量my_bit2位于變量var8bit的第2位;下面是一些在BDATA區(qū)中聲明變量和使用位變量的例子。unsignedcharbdatastatus_byte;編譯器不允許在BDATA區(qū)中定義float和double類(lèi)型的變量。2023/7/2834第4章_單片機(jī)的C51編程語(yǔ)言3.IDATA區(qū)IDATA區(qū)也可以存放使用比較頻繁的變量,使用寄存器作為指針進(jìn)行尋址。在寄存器中設(shè)置8位地址進(jìn)行間接尋址,與外部存儲(chǔ)器尋址比較,它的指令執(zhí)行周期和代碼長(zhǎng)度都比較短。對(duì)于AT89C52單片機(jī)中定義的IDATA變量,如果低128B的RAM容量不夠時(shí),C51編譯器會(huì)自動(dòng)安排到高128B的區(qū)域。下面是一些在IDATA區(qū)中聲明變量的例子。unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];charidatainp_string[16];floatidataoutp_value;2023/7/2835第4章_單片機(jī)的C51編程語(yǔ)言4.PDATA和XDATA區(qū)PDATA和XDATA用于單片機(jī)的片外RAM區(qū),在這兩個(gè)區(qū)聲明變量和在其他區(qū)的語(yǔ)法是一樣的,PDATA區(qū)只有256B,而XDATA區(qū)可達(dá)65536B,舉例如下。unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataoutp_value;對(duì)PDATA和XDATA的操作是相似的,對(duì)PDATA和XDATA的尋址要使用MOVX指令,需要2個(gè)處理周期。對(duì)PDATA區(qū)尋址需要裝入8位地址,使用Ri的間接尋址方式;而對(duì)XDATA區(qū)尋址則需要裝入16位地址,使用DPTR的間接尋址方式;2023/7/2836第4章_單片機(jī)的C51編程語(yǔ)言5.CODE區(qū)CODE區(qū)即MCS-51單片機(jī)的程序代碼區(qū),所以代碼區(qū)的數(shù)據(jù)是不可改變的,讀取CODE區(qū)存放的數(shù)據(jù)相當(dāng)于用匯編語(yǔ)言的MOVC尋址。一般代碼區(qū)中可存放數(shù)據(jù)表,跳轉(zhuǎn)向量和狀態(tài)表,對(duì)CODE區(qū)的訪問(wèn)和對(duì)XDATA區(qū)的訪問(wèn)的時(shí)間是一樣的,代碼區(qū)中的對(duì)象在編譯時(shí)初始化。下面是代碼區(qū)的聲明例子。unsignedintcodeunit_id[2]={0x1234,0x89ab};unsignedcharcodeuchar_data[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15};2023/7/2837第4章_單片機(jī)的C51編程語(yǔ)言2023/7/2838第4章_單片機(jī)的C51編程語(yǔ)言

存儲(chǔ)模式如果在變量定義時(shí)省略了存儲(chǔ)器類(lèi)型標(biāo)識(shí)符,C51編譯器會(huì)選擇默認(rèn)的存儲(chǔ)器類(lèi)型。默認(rèn)的存儲(chǔ)器類(lèi)型由SMALL、COMPACT和LARGE存儲(chǔ)模式(memorymodels)指令決定。存儲(chǔ)模式是編譯器的編譯選項(xiàng)。在KEILC編譯器中存儲(chǔ)模式的選擇參見(jiàn)附錄三。1.小模式(smallmodel)。在小模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,都默認(rèn)駐留在內(nèi)部數(shù)據(jù)區(qū),即這種方式和用DATA進(jìn)行顯示說(shuō)明一樣。2.緊湊模式(compactmodel)。在緊湊模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,都默認(rèn)駐留在外部數(shù)據(jù)區(qū)的一個(gè)頁(yè)上。即這種方式和用PDATA進(jìn)行變量存儲(chǔ)器類(lèi)型的說(shuō)明是一樣的。該模式利用R0和R1寄存器來(lái)進(jìn)行間接尋址(@R0和@Rl)。3.大模式(largemodel)。在大模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,都默認(rèn)駐留在外部數(shù)據(jù)存儲(chǔ)區(qū),即和用XDATA進(jìn)行顯示說(shuō)明一樣。此時(shí)最大可尋址64KB的存儲(chǔ)區(qū)域,使用數(shù)據(jù)指針寄存器(DPTR)來(lái)進(jìn)行間接尋址。2023/7/2839第4章_單片機(jī)的C51編程語(yǔ)言存儲(chǔ)器類(lèi)型舉例在不同存儲(chǔ)器類(lèi)型下等價(jià)于下面的變量聲明:unsignedchardatavar1;

/*SMALL模式,var1被定位在DATA區(qū)*/

/*即片內(nèi)直接尋址RAM*/unsignedcharpdatavar1;

/*COMPACT模式,var1被定位在 PDATA區(qū),即片外按頁(yè)面間接尋址RAM*/unsignedcharxdatavar1;

/*LARGE模式,var1被定位在XDATA區(qū)*/

/*即片外間接尋址RAM*/為了提高系統(tǒng)運(yùn)行速度,建議在編寫(xiě)源程序時(shí),把存儲(chǔ)模式設(shè)定為SMALL,必要時(shí)在程序中把XDATA、PDATA和IDATA等類(lèi)型變量進(jìn)行專(zhuān)門(mén)聲明。2023/7/2840第4章_單片機(jī)的C51編程語(yǔ)言C51語(yǔ)言中的特殊數(shù)據(jù)類(lèi)型由于單片機(jī)特殊的結(jié)構(gòu),為編程的需要,C51語(yǔ)言擴(kuò)展了ANSIC的數(shù)據(jù)類(lèi)型。這些數(shù)據(jù)類(lèi)型與單片機(jī)的結(jié)構(gòu)以及存儲(chǔ)區(qū)域相關(guān)。2023/7/2841第4章_單片機(jī)的C51編程語(yǔ)言1.8位的特殊功能寄存器sfrC51使用sfr對(duì)MCS-51中的特殊功能寄存器進(jìn)行定義,這種定義方法與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適用于對(duì)MCS-51系列單片機(jī)進(jìn)行C編程??梢园裺fr認(rèn)為是一種擴(kuò)充數(shù)據(jù)類(lèi)型,占用一個(gè)內(nèi)存單元,值域?yàn)?x80~0xFF。定義方法是引人關(guān)鍵字sfr,語(yǔ)法如下:sfr變量名=SFR中的地址注意:sfr后面必須跟一個(gè)特殊寄存器名,“=”后面的地址必須是常數(shù),不允許帶有運(yùn)算符的表達(dá)式。sfrP0=0x80sfrP1=0x90

2023/7/2842第4章_單片機(jī)的C51編程語(yǔ)言2.16位的特殊功能寄存器sfr16sfr16用于定義存在于MCS-51單片機(jī)內(nèi)部RAM的16位特殊功能寄存器。當(dāng)SFR的高端地址直接位于其低端地址之后時(shí),對(duì)SFRl6位值可以進(jìn)行直接訪問(wèn)。例如AT89C52的定時(shí)器2就是這種情況。為了有效地訪問(wèn)這類(lèi)SFR,可使用關(guān)鍵宇“sfrl6”。16位SFR定義的語(yǔ)法與8位SFR相同,16位SFR的低端地址必須作為“sfrl6”的定義地址。例如:sfr16T2=0xcc//定義定時(shí)器2為T(mén)2:TL2為0CCH,TH2為0CDH等價(jià)于,對(duì)TL2和TH2分別定義。sfrTL2=0xCC;sfrTH2=0xCD;2023/7/2843第4章_單片機(jī)的C51編程語(yǔ)言3.位變量bit位變量可以用來(lái)定義變量、函數(shù)返回值的類(lèi)型,用bit關(guān)鍵字來(lái)定義。位變量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類(lèi)型,它的值是一個(gè)二進(jìn)制位,不是0,就是1,類(lèi)似一些高級(jí)語(yǔ)言中布爾(Boolean)變量的True和False。利用bit可定義一個(gè)位變量,但不能定義位指針,也不能定義位數(shù)組。所有的位變量都存儲(chǔ)在內(nèi)部RAM的位尋址區(qū)中(10H~1FH),在一個(gè)作用域中最大可聲明128個(gè)位變量。bit變量的聲明與其他變量相同,例如:bitdone_flag =0 //定義位變量done_flag,初值為0bitfunc(bitbvar1){ //bit類(lèi)型的函數(shù)

bitbvar2;……return(bvar2); //返回值是bit類(lèi)型

}2023/7/2844第4章_單片機(jī)的C51編程語(yǔ)言4.特殊功能位sbit用關(guān)鍵字sbit定義位尋址的特殊功能寄存器的位尋址對(duì)象。定義方法有如下三種:(1)sbit位變量名=位地址位地址必須位于0x80H~0xFF之間。(2)sbit位變量名=特殊功能寄存器名^位位置位位置是一個(gè)0~7之間的常數(shù)。(3)sbit位變量名=字節(jié)地址^位位置字節(jié)地址作為基地址,在0x80H~0xFF之間。位位置是一個(gè)0~7之間的常數(shù)。2023/7/2845第4章_單片機(jī)的C51編程語(yǔ)言例如可用下面三種方法定義PSW中的第7位CY,結(jié)果相同:sbitCY=0xD7 //用絕對(duì)位地址表示PSW中的第7位,參見(jiàn)表2-4sbitCY=PSW^7 //必須事先已經(jīng)定義了PSWsbitCY=0xD0^7 //PSW的字節(jié)地址為0xD0,參見(jiàn)表2-4MCS-51單片機(jī)中的特殊功能寄存器和特殊功能寄存器可尋址位,已被預(yù)先定義放在文件reg51.h中,在程序的開(kāi)頭只需加上#include<reg51.h>或#include<reg52.h>即可。sbit和bit的區(qū)別:sbit定義特殊功能寄存器中的可尋址位;而bit則定義了一個(gè)普通的位變量,一個(gè)函數(shù)中可包含bit類(lèi)型的參數(shù),函數(shù)返回值也可為bit類(lèi)型。另外,sbit還可訪問(wèn)MCS-51單片機(jī)片內(nèi)20H~2FH范圍內(nèi)的位對(duì)象。C51編譯器提供了一個(gè)bdata存儲(chǔ)器類(lèi)型,允許將具有bdata類(lèi)型的對(duì)象放入MCS-51單片機(jī)片內(nèi)可位尋址區(qū)。2023/7/2846第4章_單片機(jī)的C51編程語(yǔ)言4.4C51語(yǔ)言的數(shù)組、指針與結(jié)構(gòu)4.4.1數(shù)組與指針4.4.2對(duì)絕對(duì)地址進(jìn)行訪問(wèn)2023/7/2847第4章_單片機(jī)的C51編程語(yǔ)言數(shù)組與指針1.?dāng)?shù)組數(shù)組是一個(gè)由同種類(lèi)型的變量組成的集合,它保存在連續(xù)的存儲(chǔ)區(qū)域中,第一個(gè)元素保存在最低地址中,最末一個(gè)元素保存在最高地址中。數(shù)組的定義方式如下:數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]數(shù)組名[常量1][常量2]…[常量n]例如在程序存儲(chǔ)器中用一維數(shù)組定義7段共陰LED數(shù)碼顯示的字形表,數(shù)組值分別對(duì)應(yīng)0~9的顯示數(shù)字。unsignedcharcodeLEDvalue[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}chararray[]=”HelloWorld”2023/7/2848第4章_單片機(jī)的C51編程語(yǔ)言數(shù)組與指針2.指針指針是指某個(gè)變量所占用存儲(chǔ)單元的首地址。用來(lái)存放指針值的變量稱(chēng)為指針變量。指針變量的定義格式為:

類(lèi)型說(shuō)明符*指針變量名其中:“*”表示定義的是指針變量;類(lèi)型說(shuō)明符表示該指針變量指向的變量的類(lèi)型。C5l語(yǔ)言的指針和標(biāo)準(zhǔn)C語(yǔ)言中的指針功能相同。char*s;//指向字符類(lèi)型的指針char*str[4]; //定義字符類(lèi)型的指針數(shù)組int*numptr; //指向整型類(lèi)型的指針2023/7/2849第4章_單片機(jī)的C51編程語(yǔ)言由于MCS-51存儲(chǔ)器結(jié)構(gòu)的特殊性,C51語(yǔ)言還提供指定存儲(chǔ)器類(lèi)型的指針,在聲明時(shí)定義指針指向的存儲(chǔ)器類(lèi)型,也稱(chēng)為基于存儲(chǔ)器類(lèi)型的指針,例如:chardata*str; //指針指向data區(qū)的字符intxdata*numtab; //指針指向xdata區(qū)的整型變量unsignedcharcode*powtab //指針指向code區(qū)的無(wú)符號(hào)字符這種基于存儲(chǔ)器類(lèi)型的指針,因?yàn)榇鎯?chǔ)器類(lèi)型在編譯時(shí)就已經(jīng)指定了,所以指針可以保存在一個(gè)字節(jié)(idata、data、bdata等)或兩個(gè)字節(jié)(code和xdata類(lèi)型指針)中。2023/7/2850第4章_單片機(jī)的C51編程語(yǔ)言3.指針的應(yīng)用例4-3指針的應(yīng)用/*ex4-3.c,將外部RAM地址1000H開(kāi)始的10個(gè)字節(jié)讀入到內(nèi)部RAM中*/#include<reg51.h>//定義MCS-51的特殊功能寄存器SFR#defineXRAMaddr(unsignedcharxdata*)0x1000 //外部RAM的開(kāi)始地址unsignedcharxdata*ptr; main(){ chari; unsignedchardataarray[10]; ptr=XRAMaddr; for(i=0;i<10;i++){ array[i]=ptr[i]; } while(1); }2023/7/2851第4章_單片機(jī)的C51編程語(yǔ)言4.結(jié)構(gòu)結(jié)構(gòu)變量是將互相關(guān)聯(lián)的、多個(gè)不同類(lèi)型的變量結(jié)合在一起形成的一個(gè)組合形變量,簡(jiǎn)稱(chēng)結(jié)構(gòu)。構(gòu)成結(jié)構(gòu)的各個(gè)不同類(lèi)型的變量稱(chēng)為結(jié)構(gòu)元素(或成員),其定義規(guī)則與變量的定義相同。一般先聲明結(jié)構(gòu)類(lèi)型,再定義結(jié)構(gòu)變量。定義一個(gè)結(jié)構(gòu)類(lèi)型的格式為:struct結(jié)構(gòu)名{

結(jié)構(gòu)成員說(shuō)明}結(jié)構(gòu)成員還可以是其他已定義的結(jié)果,結(jié)構(gòu)成員說(shuō)明的格式為:類(lèi)型標(biāo)識(shí)符成員名;C51結(jié)構(gòu)定義的格式為:Struct結(jié)構(gòu)名變量表;2023/7/2852第4章_單片機(jī)的C51編程語(yǔ)言例4-4結(jié)構(gòu)與結(jié)構(gòu)變量的定義structdate{ //定義名稱(chēng)為date的結(jié)構(gòu)類(lèi)型

unsignedcharmonth; unsignedcharday; unsignedcharyear;}structdatedate1,date2 //定義結(jié)構(gòu)變量date1和date2對(duì)結(jié)構(gòu)變量中成員的訪問(wèn)使用“.”運(yùn)算符,例如:date1.year=07date1.month=1date1.day=252023/7/2853第4章_單片機(jī)的C51編程語(yǔ)言4.4.2對(duì)絕對(duì)地址進(jìn)行訪問(wèn)1.使用指針指針是C語(yǔ)言中十分重要的概念,MCS-51的總線工作方式下對(duì)絕對(duì)地址的操作,在使用C51編程時(shí)常用指針操作。C51語(yǔ)言中提供的兩個(gè)專(zhuān)門(mén)用于指針和地址的運(yùn)算符:*取內(nèi)容&取地址取內(nèi)容和取地址運(yùn)算的一般形式分別為:變量=*指針變量指針變量=&目標(biāo)變量2023/7/2854第4章_單片機(jī)的C51編程語(yǔ)言例4-5使用指針對(duì)指定地址進(jìn)行訪問(wèn)#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void){ucharidataivar1;ucharxdata*xdp;/*定義一個(gè)指向XDATA存儲(chǔ)器空間的指針*/chardata*dp;/*定義一個(gè)指向DATA存儲(chǔ)器空間的指針*/ucharidata*idp; /*定義一個(gè)指向IDATA存儲(chǔ)器空間的指針*/xdp=0x1000;/*XDATA指針賦值,指向XDATA存儲(chǔ)器地址1000H處*/*xdp=0x5A; /*將數(shù)據(jù)5AH送到XDATA的1000H單元*/dp=0x61; /*DATA指針賦值,指向DATA存儲(chǔ)器地址61H處*/*dp=0x23; /*將數(shù)據(jù)23H送到DATA的61H單元*/idp=&ivar1; /*idp指向IDATA區(qū)變量ivar1*/*idp=0x16; /*等價(jià)于ivar1=0x16*/}2023/7/2855第4章_單片機(jī)的C51編程語(yǔ)言2.使用C51擴(kuò)展關(guān)鍵字_at_對(duì)確定地址進(jìn)行訪問(wèn)使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址進(jìn)行定位。格式如下:[存儲(chǔ)器類(lèi)型]數(shù)據(jù)類(lèi)型標(biāo)識(shí)符_at_常數(shù)當(dāng)對(duì)外部接口的地址進(jìn)行讀寫(xiě)時(shí),存儲(chǔ)器類(lèi)型為xdata數(shù)據(jù)類(lèi)型;數(shù)據(jù)類(lèi)型通常為uchar的1字節(jié)類(lèi)型;使用_at_定義的變量必須為全局變量。例4-6用關(guān)鍵字_at_訪問(wèn)指定地址/*將地址為1000H的內(nèi)容讀入。*/#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRunsignedcharxdatay1_at_0x1000;main(){unsignedcharx1;x1=y1; while(1);}2023/7/2856第4章_單片機(jī)的C51編程語(yǔ)言3.使用C51運(yùn)行庫(kù)中預(yù)定義宏C51編譯器提供了一組宏定義用來(lái)對(duì)MCS-51系列單片機(jī)的CODE、DATA、PDATA和XDATA空間進(jìn)行絕對(duì)地址訪問(wèn)。函數(shù)原型如下:#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatileidata*)0)#definePBYTE((unsignedcharvolatile*pdata)0)#defineXBYTE((unsignedcharvolatile*xdata)0)這些函數(shù)原型放在absacc.h文件中。例如

ucharuc_var1;

uc_var1=XBYTE[0x0002];

/*訪問(wèn)外部RAM0002H地址的內(nèi)容*/2023/7/2857第4章_單片機(jī)的C51編程語(yǔ)言4.5C51的運(yùn)算符和表達(dá)式表達(dá)式后面加“;”號(hào)就構(gòu)成了一個(gè)表達(dá)式語(yǔ)句。1.賦值運(yùn)算符賦值運(yùn)算符“=”,在C中它的功能是給變量賦值,如x=10。2.算術(shù)運(yùn)算符C51中的算術(shù)運(yùn)算符如下:+加或取正值運(yùn)算符-減或取負(fù)值運(yùn)算符*乘運(yùn)算符/除運(yùn)算符%模(取余)運(yùn)算符,如8%5=3,即8除以5的余數(shù)是32023/7/2858第4章_單片機(jī)的C51編程語(yǔ)言3.自增自減運(yùn)算自增自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如“x=x+1”既可以寫(xiě)成“++x”,也可寫(xiě)成“x++”,其運(yùn)算結(jié)果完全相同。但在表達(dá)式中這兩種用法是有區(qū)別的。x=99;y=++x;則y=100,x=100,如果程序改為:x=99;y=x++;則y=99,x=100。在這兩種情況下,x都被置為100。在大多數(shù)C編譯程序中,為自增和自減操作生成的程序代碼比等價(jià)的賦值語(yǔ)句生成的代碼要快。2023/7/2859第4章_單片機(jī)的C51編程語(yǔ)言算術(shù)運(yùn)算符及其優(yōu)先級(jí)排列如下:最高 ++、-- -(取負(fù)值) *、/、%最低 +、-2023/7/2860第4章_單片機(jī)的C51編程語(yǔ)言4.關(guān)系運(yùn)算符關(guān)系表達(dá)式用來(lái)判別某個(gè)條件是否滿足。關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有0和1兩種,也就是邏輯的真與假,條件滿足時(shí)結(jié)果為1,不滿足時(shí)結(jié)果為0。C51中有6種關(guān)系運(yùn)算符:>大于<小于>=大于等于<=小于等于==測(cè)試等于!=測(cè)試不等于關(guān)系和邏輯運(yùn)算符的優(yōu)先級(jí)比算術(shù)運(yùn)算符低,例如表達(dá)式“10>x+12”的計(jì)算,應(yīng)看作是“10>(x+12)”。2023/7/2861第4章_單片機(jī)的C51編程語(yǔ)言5.邏輯運(yùn)算符用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)就是邏輯表達(dá)式:邏輯與:條件式1&&條件式2。邏輯或:條件式1||條件式2。邏輯非:!條件式。例如a=7,b=6,c=0時(shí),則:!a=0,!c=1。a&&b=1;!a&&b=0;b||c=1。(a>0)&&(b>3)=1;(a>8)&&(b>0)=0。2023/7/2862第4章_單片機(jī)的C51編程語(yǔ)言6.位運(yùn)算符C51語(yǔ)言能進(jìn)行按位操作,從而使C51語(yǔ)言也具有一定的對(duì)硬件直接進(jìn)行操作的能力。位運(yùn)算符的作用是按位對(duì)變量進(jìn)行運(yùn)算,但并不改變參與運(yùn)算的變量的值。如果要求按位改變變量的值,則要利用相應(yīng)的賦值運(yùn)算。位運(yùn)算符不能用來(lái)對(duì)浮點(diǎn)型數(shù)據(jù)進(jìn)行操作。位運(yùn)算一般的表達(dá)形式如下:變量1位運(yùn)算符變量2C51中共有6種位運(yùn)算符:&按位與|按位或^按位異或~按位取反<<左移>>右移2023/7/2863第4章_單片機(jī)的C51編程語(yǔ)言位運(yùn)算符也有優(yōu)先級(jí),從高到低依次是:“~”(按位取反),“<<”(左移),“>>”(右移),“&”(按位與),“^”(按位異或),“|”(按位或)。如a=0x54=01010100B,b=0x3b=00111011B,則:a&b=00010000;a|b=01111111;a^b=01101111;~a=10101011;a<<2=01010000;b>>1=00011101。2023/7/2864第4章_單片機(jī)的C51編程語(yǔ)言6.復(fù)合運(yùn)算符復(fù)合運(yùn)算符就是在賦值運(yùn)算符“=”的前面加上其他運(yùn)算符。以下是C51語(yǔ)言中的復(fù)合賦值運(yùn)算符:+=加法賦值>>=右移位賦值-=減法賦值&=邏輯與賦值*=乘法賦值|=邏輯或賦值/=除法賦值^=邏輯異或賦值%=取模賦值~=邏輯非賦值<<=左移位賦值其含義就是變量與表達(dá)式先進(jìn)行運(yùn)算符所要求的運(yùn)算,再把運(yùn)算結(jié)果賦值給參與運(yùn)算的變量。其實(shí)這是C語(yǔ)言中簡(jiǎn)化程序的一種方法,凡是二目運(yùn)算都可以用復(fù)合賦值運(yùn)算符去簡(jiǎn)化表達(dá)。例如:a+=56等價(jià)于a=a+56,y/=x+9等價(jià)于y=y/(x+9)。2023/7/2865第4章_單片機(jī)的C51編程語(yǔ)言C51語(yǔ)言的程序結(jié)構(gòu)C51語(yǔ)言的“語(yǔ)句”可以是以“;”號(hào)結(jié)束的簡(jiǎn)單語(yǔ)句,也包括用“{}”組成的復(fù)合語(yǔ)句。C51語(yǔ)言大致可分為三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。4.6.1順序結(jié)構(gòu)單片機(jī)上電后或復(fù)位后是從地址0000H開(kāi)始執(zhí)行程序順序執(zhí)行指令代碼的。2023/7/2866第4章_單片機(jī)的C51編程語(yǔ)言4.6.2選擇結(jié)構(gòu) if語(yǔ)句if語(yǔ)句的格式為:if(表達(dá)式)語(yǔ)句1else語(yǔ)句2if語(yǔ)句的例子可參見(jiàn)例4-1?!癳lse語(yǔ)句2”也可以省略?!罢Z(yǔ)句2”還可以接續(xù)另一個(gè)if語(yǔ)句。構(gòu)成:if(表達(dá)式1)語(yǔ)句1elseif(表達(dá)式2)語(yǔ)句2elseif(表達(dá)式3)語(yǔ)句3else語(yǔ)句3 ……else語(yǔ)句n2023/7/2867第4章_單片機(jī)的C51編程語(yǔ)言例4-7,當(dāng)S1閉合時(shí),報(bào)警燈亮;當(dāng)計(jì)數(shù)器TL1大于30,同時(shí)而S1打開(kāi)時(shí),報(bào)警燈滅。#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRsbitP32=P3^2; //定義P3.2為P32sbitP20=P2^0; //定義P2.0為P20main(){while(1){ P32=1; //P32為輸入端

if(P32==0){ //P32是低電平?如果S1按下,P32為低

P20=1; //S1按下,則P20輸出高電平,報(bào)警燈亮

}elseif(TL1>30){ //如果S1沒(méi)有按下,并且TL1>30 P20=0; //則P20輸出低電平,報(bào)警燈滅

}}}2023/7/2868第4章_單片機(jī)的C51編程語(yǔ)言 switch語(yǔ)句swhch語(yǔ)句用于處理多路分支的情形,格式為:switch(表達(dá)式){case常量表達(dá)式:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;……case常量表達(dá)式n:語(yǔ)句n;break;defaultt:語(yǔ)句n+l;break;}2023/7/2869第4章_單片機(jī)的C51編程語(yǔ)言對(duì)switch語(yǔ)句需要注意以下兩點(diǎn):(1)case分支中的常量表達(dá)式的值必須是整型、字符型,不能使用條件運(yùn)算符。(2)break語(yǔ)句用于跳出switch結(jié)構(gòu)。若case分支中未使用break語(yǔ)句,則程序?qū)⒗^續(xù)執(zhí)行到下一個(gè)case分支中的語(yǔ)句直至遇到break語(yǔ)句或整個(gè)switch語(yǔ)句結(jié)束。這可以用于多個(gè)分支需要執(zhí)行相同的語(yǔ)句進(jìn)行處理的情況。例4-8,switch/case編程舉例。2023/7/2870第4章_單片機(jī)的C51編程語(yǔ)言4.6.3循環(huán)結(jié)構(gòu)C語(yǔ)言有for、while、do……while三種語(yǔ)句構(gòu)成循環(huán)結(jié)構(gòu)。 for循環(huán)語(yǔ)句for循環(huán)語(yǔ)句的一般格式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語(yǔ)句 while語(yǔ)句while循環(huán)語(yǔ)句的格式為:while(表達(dá)式)循環(huán)體語(yǔ)句 do…while語(yǔ)句do…whiIe循環(huán)語(yǔ)句的格式為:do循環(huán)體語(yǔ)句while(表達(dá)式);2023/7/2871第4章_單片機(jī)的C51編程語(yǔ)言 goto語(yǔ)句goto語(yǔ)句的格式為:goto語(yǔ)句標(biāo)號(hào);goto語(yǔ)句是無(wú)條件轉(zhuǎn)移語(yǔ)句,它將程序運(yùn)行的流向轉(zhuǎn)到指定的標(biāo)號(hào)處。 break語(yǔ)句在循環(huán)語(yǔ)句中,break語(yǔ)句的作用是在循環(huán)體中控制程序立即跳出當(dāng)前循環(huán)結(jié)構(gòu),轉(zhuǎn)而執(zhí)行循環(huán)語(yǔ)句的后續(xù)操作。 continue語(yǔ)句continue語(yǔ)句只能用于循環(huán)體結(jié)構(gòu)中,作用是結(jié)束本次循環(huán)。一且執(zhí)行了continue語(yǔ)句,程序就跳過(guò)循環(huán)體中位于該語(yǔ)句后的所有語(yǔ)句,提前結(jié)束本輪循環(huán)并開(kāi)始下一輪循環(huán)。2023/7/2872第4章_單片機(jī)的C51編程語(yǔ)言例4-9用do…while語(yǔ)句編程計(jì)算1+2+3+…+10的值。unsignedcharsum,i;sum=0;i=0;do{ sum+=i; i++;}while(i<=10);程序運(yùn)行結(jié)果sum=55;i=10。2023/7/2873第4章_單片機(jī)的C51編程語(yǔ)言4.7C51語(yǔ)言的函數(shù)C程序由一個(gè)主函數(shù)main()和若干個(gè)其他函數(shù)組成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個(gè)函數(shù)可以被調(diào)用多次。1.函數(shù)定義函數(shù)定義的一般格式為函數(shù)類(lèi)型函數(shù)名(形式參數(shù)列表)[interruptn][usingn]局部變量聲明部分語(yǔ)句(有返回值的要有return語(yǔ)句)函數(shù)類(lèi)型定義了函數(shù)中返回語(yǔ)句(return)返回值的數(shù)據(jù)類(lèi)型。參數(shù)表是一個(gè)用逗號(hào)分隔的變量表,當(dāng)函數(shù)被調(diào)用時(shí)這些變量接收調(diào)用參數(shù)的值。一個(gè)函數(shù)可以沒(méi)有參數(shù),這時(shí)函數(shù)參數(shù)表是空的。2023/7/2874第4章_單片機(jī)的C51編程語(yǔ)言2.函數(shù)返回值返回語(yǔ)句retum用來(lái)回送一個(gè)數(shù)值給定義的函數(shù),從函數(shù)中退出。 返回值是通過(guò)retum語(yǔ)句返回的。 返回值的類(lèi)型如果與函數(shù)定義的類(lèi)型不一致,那么返回值將被自動(dòng)轉(zhuǎn)換成函數(shù)定義的類(lèi)型。如果函數(shù)無(wú)須返回值,可以用void類(lèi)型說(shuō)明符指明函數(shù)無(wú)返回值。3.形式參數(shù)與實(shí)際參數(shù)與使用變量一樣,在調(diào)用一個(gè)函數(shù)之前,必須對(duì)該函數(shù)進(jìn)行聲明。函數(shù)聲明的一般格式為函數(shù)類(lèi)型函數(shù)名(形式參數(shù)列表)函數(shù)定義時(shí)參數(shù)列表中的參數(shù)稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參。函數(shù)調(diào)用時(shí)所使用的替換參數(shù),是實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參。定義的形參與函數(shù)調(diào)用的實(shí)參類(lèi)型應(yīng)該一致,書(shū)寫(xiě)順序應(yīng)該相同。2023/7/2875第4章_單片機(jī)的C51編程語(yǔ)言4.調(diào)用函數(shù)的方式被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。函數(shù)作為語(yǔ)旬。把函數(shù)調(diào)用作為一個(gè)語(yǔ)句,不使用函數(shù)返回值,只是完成函數(shù)所定義的操作。例如:

refresh_led();函數(shù)作為表達(dá)式。函數(shù)調(diào)用出現(xiàn)在一個(gè)表達(dá)式中,使用函數(shù)的返回值。intk;k=sum(a,b);函數(shù)作為一個(gè)參數(shù)。函數(shù)調(diào)用作為另一個(gè)函數(shù)的實(shí)參。intk;k=sum(sum(a,b),c);2023/7/2876第4章_單片機(jī)的C51編程語(yǔ)言5.規(guī)定函數(shù)使用的寄存器組使用usingn函數(shù)說(shuō)明屬性來(lái)規(guī)定函數(shù)所使用的寄存器組,格式為

函數(shù)類(lèi)型函數(shù)名(形參列表)usingnusingn屬性使用一個(gè)0~3的整型參數(shù),這個(gè)參數(shù)表示使用的寄存器組的編號(hào)。using屬性一般用在中斷函數(shù)中。2023/7/2877第4章_單片機(jī)的C51編程語(yǔ)言4.8中斷服務(wù)程序中斷服務(wù)程序是一種特殊的函數(shù),又稱(chēng)為中斷函數(shù)。使用interrupt關(guān)鍵字來(lái)實(shí)現(xiàn)。定義中斷服務(wù)程序的一般格式如下:void函數(shù)名()interruptn[usingm]關(guān)鍵字interrupt后面的n是中斷號(hào),理論上可以是0~31的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論