版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【學(xué)習(xí)目標(biāo)】
熟記C51的和數(shù)據(jù)類型,熟練應(yīng)用C51的運算符和表達式;
掌握C語言的,中斷服務(wù)程序編寫方法,絕對地址訪問方法;
理解變量的存儲種類和存儲類型,理解中斷服務(wù)程序與調(diào)用子程序的區(qū)別;
熟悉C51及應(yīng)用技巧,了解C語言與匯編語言混合編程的方法。第4章C語言基礎(chǔ)與C51程序設(shè)計第4章C語言基礎(chǔ)與C51程序設(shè)計1.C51程序結(jié)構(gòu)匯編語言雖然有執(zhí)行效率高的優(yōu)點,但其可讀性和可移植性差,編程效率低。這些都使它的編程和維護極不方便,從而導(dǎo)致了整個系統(tǒng)的可靠性也較差。而使用C語言進行單片機應(yīng)用系統(tǒng)的開發(fā),有著匯編語言編程不可比擬的優(yōu)勢。C語言的特點:語言簡潔、緊湊,使用方便、靈活。運算符豐富。數(shù)據(jù)結(jié)構(gòu)豐富。具有現(xiàn)代化語言的各種數(shù)據(jù)結(jié)構(gòu)??蛇M行結(jié)構(gòu)化程序設(shè)計??梢灾苯訉τ嬎銠C硬件進行操作。生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高??梢浦残院?。4.1C51語言概述第4章C語言基礎(chǔ)與C51程序設(shè)計C語言程序采用函數(shù)結(jié)構(gòu),每個C語言程序由一個或多個函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個主函數(shù)main(),也可以包含一個main()函數(shù)和若干個其它的功能函數(shù)。不管main()函數(shù)放于何處,程序總是從main()函數(shù)開始執(zhí)行,執(zhí)行到main()函數(shù)結(jié)束則結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它的函數(shù)所調(diào)用。功能函數(shù)可以是C語言編譯器提供的庫函數(shù),也可以是由用戶定義的自定義函數(shù)。在編制C程序時,程序的開始部分一般是預(yù)處理命令、函數(shù)說明和變量定義等。第4章C語言基礎(chǔ)與C51程序設(shè)計
C51的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計方法都與標(biāo)準(zhǔn)的C語言程序設(shè)計相同,但C51程序與標(biāo)準(zhǔn)的C程序在以下幾個方面不一樣:(1)C51中定義的庫函數(shù)和標(biāo)準(zhǔn)C語言定義的庫函數(shù)不同。標(biāo)準(zhǔn)的C語言定義的庫函數(shù)是按通用微型計算機來定義的,而C51中的庫函數(shù)是按MCS-51單片機相應(yīng)情況來定義的;(2)C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型也有一定的區(qū)別,在C51中還增加了幾種針對MCS-51單片機特有的數(shù)據(jù)類型;第4章C語言基礎(chǔ)與C51程序設(shè)計(3)C51變量的存儲模式與標(biāo)準(zhǔn)C中變量的存儲模式不一樣,C51中變量的存儲模式是與MCS-51單片機的存儲器緊密相關(guān);(4)C51與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,C51中的輸入輸出是通過MCS-51串行口來完成的,輸入輸出指令執(zhí)行前必須要對串行口進行初始化;(5)C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的區(qū)別,C51中有專門的中斷函數(shù)。第4章C語言基礎(chǔ)與C51程序設(shè)計
用C語言編寫MCS-51單片機程序與用匯編語言編寫MCS–51單片機程序不一樣。
用匯編語言編寫MCS–51單片機程序必須要考慮其存儲器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲器與特殊功能寄存器的使用以及按實際地址處理端口數(shù)據(jù)。
用C語言編寫的MCS–51單片機應(yīng)用程序,則不用像匯編語言那樣須具體組織、分配存儲器資源和處理端口數(shù)據(jù),但在C語言編程中,對數(shù)據(jù)類型與變量的定義,必須要與單片機的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。
2.C語言與MCS-51單片機第4章C語言基礎(chǔ)與C51程序設(shè)計
現(xiàn)在支持MCS-51單片機的C語言編譯器有很多種,如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。各種編譯器的基本情況相同,但具體處理時有一定的區(qū)別,其中KEIL/Franklin以它的代碼緊湊和使用方便等特點優(yōu)于其他編譯器,使用特別廣泛。第4章C語言基礎(chǔ)與C51程序設(shè)計4.2C51語言的基本語法
我們要通過C51語言進行單片機應(yīng)用程序的開發(fā),首先就要掌握C51語言的語法。C51語言的語法主要包括:C51標(biāo)識符和關(guān)鍵字;C51數(shù)據(jù)類型;變量的存儲種類及存儲類型;絕對地址訪問;C51運算符和表達式。與標(biāo)準(zhǔn)的C語言相比,C51針對于單片機的關(guān)鍵字、數(shù)據(jù)類型及絕對地址訪問方式增加的部分,在本節(jié)中都將進行詳細的介紹。第4章C語言基礎(chǔ)與C51程序設(shè)計標(biāo)識符用來標(biāo)識源程序中某個對象的名字,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等。C語言是區(qū)分大小寫的一種高級語言,如果要定義一個變量,可以寫作“a”,如果程序中有“A”,那么這兩個是完全不同定義的標(biāo)識符。標(biāo)識符是由字母、數(shù)字和下劃線等組成的字符串,應(yīng)該注意的是第一個字符必須是字母或下劃線。關(guān)鍵字則是編程語言保留的特殊標(biāo)識符,它們具有固定名稱和含義,在程序編寫中不允許將關(guān)鍵字另作他用。C51中的關(guān)鍵字除了有ANSIC標(biāo)準(zhǔn)的32個關(guān)鍵字外,還根據(jù)C51單片機的特點擴展了相關(guān)的關(guān)鍵字。
4.2.1C51的標(biāo)識符和關(guān)鍵字第4章C語言基礎(chǔ)與C51程序設(shè)計表4.1C51編譯器的擴展關(guān)鍵字關(guān)鍵字用途說明bit位標(biāo)量聲明聲明一個位標(biāo)量或位類型的函數(shù)sbit位標(biāo)量聲明聲明一個可位尋址變量sfr特殊功能寄存器聲明聲明一個特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器data存儲器類型說明直接尋址的內(nèi)部數(shù)據(jù)存儲器bdata存儲器類型說明可位尋址的內(nèi)部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的內(nèi)部數(shù)據(jù)存儲器pdata存儲器類型說明分頁尋址的外部數(shù)據(jù)存儲器xdata存儲器類型說明外部數(shù)據(jù)存儲器code存儲器類型說明程序存儲器interrupt中斷函數(shù)說明定義一個中斷函數(shù)reentrant再入函數(shù)說明定義一個再入函數(shù)using寄存器組定義定義芯片的工作寄存器_at_地址定位為變量進行存儲器絕對空間地址定位alien函數(shù)特性說明用于聲明與PL/M51兼容的函數(shù)compact存儲器模式制定使用外部分頁尋址數(shù)據(jù)存儲器空間large存儲器模式制定使用MCS-51外部數(shù)據(jù)存儲器空間small存儲器模式制定使用MCS-51內(nèi)部數(shù)據(jù)存儲器空間_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級_task_任務(wù)聲明定義實時多任務(wù)函數(shù)第4章C語言基礎(chǔ)與C51程序設(shè)計C51的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和組合數(shù)據(jù)類型,情況與標(biāo)準(zhǔn)C中的數(shù)據(jù)類型基本相同,但其中char型與short型相同,float型與double型相同,另外,C51中還有專門針對于MCS-51單片機的特殊功能寄存器型和位類型。
4.2.2C51的數(shù)據(jù)類型第4章C語言基礎(chǔ)與C51程序設(shè)計數(shù)據(jù)類型長度大小unsignedchar1字節(jié)0~255char1字節(jié)-128~+127unsignedint2字節(jié)0~65535int2字節(jié)-32768~+32767unsignedlong4字節(jié)0~4294967295long4字節(jié)-2147483648~+2147483647float4字節(jié)±1.75494E-38~±3.402823E+38*1~3字節(jié)對象的地址bit位0或1sfr1字節(jié)0~255sfr162字節(jié)0~65535sbit位0或1第4章C語言基礎(chǔ)與C51程序設(shè)計1.字符型char有signedchar和unsignedchar之分,默認為signedchar。它們的長度均為一個字節(jié),用于存放一個單字節(jié)的數(shù)據(jù)。
對于signedchar,它用于定義帶符號字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號位,“0”表示正數(shù),“1”表示負數(shù),補碼表示,所能表示的數(shù)值范圍是-128~+127;
對于unsignedchar,它用于定義無符號字節(jié)數(shù)據(jù)或字符,可以存放一個字節(jié)的無符號數(shù),其取值范圍為0~255。unsignedchar可以用來存放無符號數(shù),也可以存放西文字符,一個西文字符占一個字節(jié),在計算機內(nèi)部用ASCII碼存放。第4章C語言基礎(chǔ)與C51程序設(shè)計2.int整型分singedint和unsignedint。默認為signedint。它們的長度均為2個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。對于signedint,用于存放兩字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-32768~+32767。對于unsignedint,用于存放兩字節(jié)無符號數(shù),數(shù)的范圍為0~65535。3.long長整型分singedlong和unsignedlong。默認為signedlong。它們的長度均為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。對于signedlong,用于存放四字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-2147483648~+2147483647。對于unsignedlong,用于存放四字節(jié)無符號數(shù),數(shù)的范圍為0~4294967295。第4章C語言基礎(chǔ)與C51程序設(shè)計4.float浮點型
float型數(shù)據(jù)的長度為四個字節(jié),格式符合IEEE-754標(biāo)準(zhǔn)的單精度浮點型數(shù)據(jù),包含指數(shù)和尾數(shù)兩部分,最高位為符號位,“1”表示負數(shù),“0”表示正數(shù),其次的8位為階碼,最后的23位為尾數(shù)的有效數(shù)位,由于尾數(shù)的整數(shù)部分隱含為“1”,所以尾數(shù)的精度為24位。5.*指針型指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量要占用一定的內(nèi)存單元,對不同的處理器其長度不一樣,在C51中它的長度一般為1~3個字節(jié)。第4章C語言基礎(chǔ)與C51程序設(shè)計6.特殊功能寄存器型這是C51擴充的數(shù)據(jù)類型,用于訪問MCS-51單片機中的特殊功能寄存器數(shù)據(jù),它分sfr和sfr16兩種類型。其中:
sfr為字節(jié)型特殊功能寄存器類型,占一個內(nèi)存單元,利用它可以訪問MCS-51內(nèi)部的所有特殊功能寄存器;
sfr16為雙字節(jié)型特殊功能寄存器類型,占用兩個字節(jié)單元,利用它可以訪問MCS-51內(nèi)部的所有兩個字節(jié)的特殊功能寄存器。
在C51中對特殊功能寄存器的訪問必須先用sfr或sfr16進行聲明。第4章C語言基礎(chǔ)與C51程序設(shè)計7.位類型這也是C51中擴充的數(shù)據(jù)類型,用于訪問MCS-51單片機中的可尋址的位單元。在C51中,支持兩種位類型:bit型和sbit型。它們在內(nèi)存中都只占一個二進制位,其值可以是“1”或“0”。區(qū)別:用bit定義的位變量在C51編譯器編譯時,在不同的時候位地址是可以變化的,而用sbit定義的位變量必須與MCS-51單片機的一個可以尋址位單元或可位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時,其對應(yīng)的位地址是不可變化的。sfrP0=0x80; /*因P0口的寄存器是可位尋址的*/sbitP0_0=P0^0; /*所以P0_0為P0中的P0.0引腳*/除了以上定義方式外,還可以用P0.0的地址去寫,如:sbitP0_0=0x80;第4章C語言基礎(chǔ)與C51程序設(shè)計
在C51語言程序中,有可能會出現(xiàn)在運算中數(shù)據(jù)類型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級順序如下:
bitcharintlongfloatsignedunsigned
也就是說,當(dāng)char型與int型進行運算時,先自動對char型擴展為int型,然后與int型進行運算,運算結(jié)果為int型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過強制類型轉(zhuǎn)換符“()”對數(shù)據(jù)類型進行人為的強制轉(zhuǎn)換。
C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型,在后面將相繼介紹。第4章C語言基礎(chǔ)與C51程序設(shè)計4.3.1常量
常量是指在程序執(zhí)行過程中其值不能改變的量。在C51中支持整型常量、浮點型常量、字符型常量和字符串型常量。一.整型常量整型常量也就是整型常數(shù),根據(jù)其值范圍在計算機中分配不同的字節(jié)數(shù)來存放。在C51中它可以表示成以下幾種形式:
十進制整數(shù)。如234、-56、0等。
十六進制整數(shù)。以0x開頭表示,如0x12表示十六進制數(shù)12H。
長整數(shù)。在C51中當(dāng)一個整數(shù)的值達到長整型的范圍,則該數(shù)按長整型存放,在存儲器中占四個字節(jié),另外,如一個整數(shù)后面加一個字母L,這個數(shù)在存儲器中也按長整型存放。如123L在存儲器中占四個字節(jié)。補充:C51的運算量第4章C語言基礎(chǔ)與C51程序設(shè)計二.浮點型常量浮點型常量也就是實型常數(shù)。有十進制表示形式和指數(shù)表示形式。
十進制表示形式又稱定點表示形式,由數(shù)字和小數(shù)點組成。如0.123、34.645等都是十進制數(shù)表示形式的浮點型常量。
指數(shù)表示形式為:[]數(shù)字[.數(shù)字]e[]數(shù)字例如:123.456e-3、-3.123e2等都是指數(shù)形式的浮點型常量。第4章C語言基礎(chǔ)與C51程序設(shè)計三.字符型常量字符型常量是用單引號引起的字符,如‘a(chǎn)’、‘1’、‘F’等??梢允强娠@示的ASCII字符,也可以是不可顯示的控制字符。對不可顯示的控制字符須在前面加上反斜杠“\”組成轉(zhuǎn)義字符。利用它可以完成一些特殊功能和輸出時的格式控制。常用的轉(zhuǎn)義字符如下表所示。
第4章C語言基礎(chǔ)與C51程序設(shè)計轉(zhuǎn)義字符含義ASCII碼(十六進制數(shù))\o空字符(null)00H\n換行符(LF)0AH\r回車符(CR)0DH\t水平制表符(HT)09H\b退格符(BS)08H\f換頁符(FF)0CH\‘單引號27H\”雙引號22H\\反斜杠5CH第4章C語言基礎(chǔ)與C51程序設(shè)計四.字符串型常量字符串型常量由雙引號“”括起的字符組成。如“D”、“1234”、“ABCD”等。注意字符串常量與字符常量是不一樣,一個字符常量在計算機內(nèi)只用一個字節(jié)存放,而一個字符串常量在內(nèi)存中存放時不僅雙引號內(nèi)的字符一個占一個字節(jié),而且系統(tǒng)會自動的在后面加一個轉(zhuǎn)義字符“\0”作為字符串結(jié)束符。因此不要將字符常量和字符串常量混淆,如字符常量‘A’和字符串常量“A”是不一樣的。第4章C語言基礎(chǔ)與C51程序設(shè)計4.3.2變量變量是在程序運行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。在C51中,變量在使用前必須對變量進行定義,指出變量的數(shù)據(jù)類型和存儲模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲單元。定義的格式如下:
[存儲種類]數(shù)據(jù)類型說明符[存儲器類型]變量名1[=初值],變量名2[初值]…;第4章C語言基礎(chǔ)與C51程序設(shè)計一.?dāng)?shù)據(jù)類型說明符在定義變量時,必須通過數(shù)據(jù)類型說明符指明變量的數(shù)據(jù)類型,指明變量在存儲器中占用的字節(jié)數(shù)。可以是基本數(shù)據(jù)類型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是用typedef定義的類型別名。在C51中,為了增加程序的可讀性,允許用戶為系統(tǒng)固有的數(shù)據(jù)類型說明符用typedef起別名,格式如下:
typedefc51固有的數(shù)據(jù)類型說明符別名;定義別名后,就可以用別名代替數(shù)據(jù)類型說明符對變量進行定義。別名可以用大寫,也可以用小寫,為了區(qū)別一般用大寫字母表示?!纠縯ypedef的使用。typedefunsignedintWORD;typedefunsignedcharBYTE;BYTEa1=0x12;WORDa2=0x1234;第4章C語言基礎(chǔ)與C51程序設(shè)計二.變量名變量名是C51區(qū)分不同變量,為不同變量取的名稱。在C51中規(guī)定變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字母必須為字母或下劃線。變量名有兩種:普通變量名和指針變量名。它們的區(qū)別是指針變量名前面要帶“*”號。第4章C語言基礎(chǔ)與C51程序設(shè)計4.2.3變量的存儲種類和存儲類型變量是一種在程序執(zhí)行過程中,其數(shù)值不斷變化的量。C51規(guī)定變量必須先定義后使用。C51對變量定義的格式如下:[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表第4章C語言基礎(chǔ)與C51程序設(shè)計1.存儲種類存儲種類是指變量在程序執(zhí)行過程中的作用范圍。C51變量的存儲種類有四種,分別是自動(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。1)auto:
使用auto定義的變量稱為自動變量,其作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語句執(zhí)行時,C51才為該變量分配內(nèi)存空間,結(jié)束時占用的內(nèi)存空間釋放。自動變量一般分配在內(nèi)存的堆??臻g中。定義變量時,如果省略存儲種類,則該變量默認為自動(auto)變量。第4章C語言基礎(chǔ)與C51程序設(shè)計2)extern:
使用extern定義的變量稱為外部變量。在一個函數(shù)體內(nèi),要使用一個已在該函數(shù)體外或別的程序中定義過的外部變量時,該變量在該函數(shù)體內(nèi)要用extern說明。外部變量是全局變量,外部變量被定義后分配固定的內(nèi)存空間,在程序整個執(zhí)行時間內(nèi)都有效,直到程序結(jié)束才釋放。3)static:
使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對應(yīng)的函數(shù)體內(nèi)有效,一直存在,但在函數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護,還可以實現(xiàn)當(dāng)離開函數(shù)時值不被改變。外部靜態(tài)變量上在函數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。第4章C語言基礎(chǔ)與C51程序設(shè)計4)register:
使用register定義的變量稱為寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時能自動識別程序中使用頻率最高的變量,并自動將其作為寄存器變量,用戶可以無需專門聲明。第4章C語言基礎(chǔ)與C51程序設(shè)計2.存儲器類型存儲器類型是用于指明變量所處的單片機的存儲器區(qū)域情況。存儲器類型與存儲種類完全不同。C51編譯器能識別的存儲器類型有以下幾種,見表所示。存儲器類型描述data直接尋址的片內(nèi)RAM低128B,訪問速度快bdata片內(nèi)RAM的可位尋址區(qū)(20H~2FH),允許字節(jié)和位混合訪問idata間接尋址訪問的片內(nèi)RAM,允許訪問全部片內(nèi)RAMpdata用Ri間接訪問的片外RAM的低256Bxdata用DPTR間接訪問的片外RAM,允許訪問全部64k片外RAMcode程序存儲器ROM64k空間
定義變量時也可以省“存儲器類型”,省時C51編譯器將按編譯模式默認存儲器類型,具體編譯模式的情況在后面介紹。第4章C語言基礎(chǔ)與C51程序設(shè)計下面對MCS-51單片機各存儲區(qū)類型的特點加以說明。(1)data區(qū)
data區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量放在data區(qū)。但由于空間有限,必須注意使用data區(qū),data區(qū)除了包含程序變量外,還包含了堆棧和寄存器組data區(qū)。unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];floatdataoutp_value;mytypedatanew_var;第4章C語言基礎(chǔ)與C51程序設(shè)計(2)bdata區(qū)當(dāng)在bdata區(qū)的位尋址區(qū)定義變量,這個變量就可進行位尋址,并且聲明位變量。這對狀態(tài)寄存器來說十分有用,因為它可以單獨使用變量的每一位,而不一定要用位變量名引用位變量。下面是一些在bdata區(qū)中聲明變量和使用位變量的例子。unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;unsignedlongbdatastatus_dword;sbitstat_flag=status_byte^4;if(status_word^15){……}stat_flag=1;第4章C語言基礎(chǔ)與C51程序設(shè)計(3)idata區(qū)
idata區(qū)也可以存放使用比較頻繁的變量,使用寄存器作為指針進行尋址。在寄存器中設(shè)置8位地址進行間接尋址,與外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];charidatainp_string[16];floatidataoutp_value;(4)pdata和xdata區(qū)在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,但pdata區(qū)只有256B,而xdata區(qū)可達65536B,舉例如下:unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataoutp_value;第4章C語言基礎(chǔ)與C51程序設(shè)計(5)code區(qū)
code區(qū)即MCS-51的程序代碼區(qū),代碼區(qū)的數(shù)據(jù)是不可改變的,所以MCS-51的代碼區(qū)不可重寫。一般代碼區(qū)中可存放數(shù)據(jù)表、跳轉(zhuǎn)向量和狀態(tài)表,對code區(qū)的訪問和對xdata區(qū)的訪問的時間是一樣的,代碼區(qū)中的對象在編譯時初始化,否則就得不到想要的值。下面是代碼區(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};第4章C語言基礎(chǔ)與C51程序設(shè)計【例】變量定義存儲種類和存儲器類型相關(guān)情況。
chardatavarl;
/*在片內(nèi)RAM低128B定義用直接尋址方式訪問的字符型變量var1*/
intidatavar2;
/*在片內(nèi)RAM256B定義用間接尋址方式訪問的整型變量var2*/
autounsignedlongdatavar3;
/*在片內(nèi)RAM128B定義用直接尋址方式訪問的自動無符號長整型變量var3*/
externfloatxdatavar4;
/*在片外RAM64KB空間定義用間接尋址方式訪問的外部實型變量var4*/
intcodevar5;
/*在ROM空間定義整型變量var5*/
unsigncharbdatavar6;/*在片內(nèi)RAM位尋址區(qū)20H~2FH單元定義可字節(jié)處理和位處理的無符號字符型變量var6*/第4章C語言基礎(chǔ)與C51程序設(shè)計3.存儲模式
C51編譯器支持三種存儲模式:SMALL模式、COMPACT模式和LARGE模式。不同的存儲模式對變量默認的存儲器類型不一樣。(1)SMALL模式。SMALL模式稱為小編譯模式,在SMALL模式下,編譯時,函數(shù)參數(shù)和變量被默認在片內(nèi)RAM中,存儲器類型為data。(2)COMPACT模式。COMPACT模式稱為緊湊編譯模式,在COMPACT模式下,編譯時,函數(shù)參數(shù)和變量被默認在片外RAM的低256字節(jié)空間,存儲器類型為pdata。(3)LARGE模式。LARGE模式稱為大編譯模式,在LARGE模式下,編譯時函數(shù)參數(shù)和變量被默認在片外RAM的64K字節(jié)空間,存儲器類型為xdata。第4章C語言基礎(chǔ)與C51程序設(shè)計【例4.1】變量和函數(shù)的存儲模式定義程序如下:#pragmasmall
/*默認存儲器類型為MCS-51片內(nèi)直接尋址RAM*/chardatai,j,k;/*在MCS-51片內(nèi)直接尋址RAM中定義了3個變量*/chari,j,k; /*未指明存儲模式,由#pragmasmall決定,與前一句完全等價*/intxdatam,n;
/*在MCS-51片外RAM中定義了2個自動變量*/staticcharm,n;/*在MCS-51片內(nèi)直接尋址RAM中定義了2個靜態(tài)變量*/unsignedcharxdataram[128]; intfunc1(inti,intj)large /*指定LARGE模式*/{
return(i+j);}intfunc2(inti,intj) /*未指明存儲模式,按默認的SMALL模式*/{
return(i-j);}不同的存儲器類型訪問速度是不一樣的,如:unsignedchardatavar1;/*SMALL模式,var1被定位在data區(qū)*/
/*即MCS-51片內(nèi)直接尋址RAM*/unsignedcharpdatavar1;/*COMPACT模式,var1被定位在pdata區(qū)*/
/*即MCS-51片外按頁面間接尋址RAM*/unsignedcharxdatavar1;/*LARGE模式,var1被定位在xdata區(qū)*/
/*即MCS-51片外間接尋址RAM*/第4章C語言基礎(chǔ)與C51程序設(shè)計4.2.4絕對地址的訪問1.使用指針采用指針的方法,可實現(xiàn)在C51程序中對任意指定的存儲器地址進行操作。例如:#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void){ucharidataivar1;ucharxdata*xdp;
/*定義一個指向xdata存儲器空間的指針*/chardata*dp;
/*定義一個指向data存儲器空間的指針*/ucharidata*idp;
/*定義一個指向Idata存儲器空間的指針*/xdp=0x1000;
/*xdata指針賦值,指向xdata存儲器地址1000H處*/*xdp=0x5A;
/*將數(shù)據(jù)5AH送到xdata的1000H單元*/dp=0x61;
/*data指針賦值,指向data存儲器地址61H處*/*dp=0x23;
/*將數(shù)據(jù)23H送到data的61H單元*/idp=&ivar1;
/*idp指向idata區(qū)變量ivar1*/*idp=0x16;
/*等價于ivar1=0x16*/第4章C語言基礎(chǔ)與C51程序設(shè)計2、使用C51運行庫中預(yù)定義宏
C51編譯器提供了一組宏定義來對51系列單片機的code、data、pdata和xdata空間進行絕對尋址。規(guī)定只能以無符號數(shù)方式訪問,定義了8個宏定義,其函數(shù)原型如下:第4章C語言基礎(chǔ)與C51程序設(shè)計#defineCBYTE((unsignedcharvolatile*)0x50000L)#defineDBYTE((unsignedcharvolatile*)0x40000L)#definePBYTE((unsignedcharvolatile*)0x30000L)#defineXBYTE((unsignedcharvolatile*)0x20000L)#defineCWORD((unsignedintvolatile*)0x50000L)#defineDWORD((unsignedintvolatile*)0x40000L)#definePWORD((unsignedintvolatile*)0x30000L)#defineXWORD((unsignedintvolatile*)0x20000L)
這些函數(shù)原型放在absacc.h文件中。使用時須用預(yù)處理命令把該頭文件包含到文件中,形式為:#include<absacc.h>。其中:CBYTE以字節(jié)形式對code區(qū)尋址,DBYTE以字節(jié)形式對data區(qū)尋址,PBYTE以字節(jié)形式對pdata區(qū)尋址,XBYTE以字節(jié)形式對xdata區(qū)尋址,CWORD以字形式對code區(qū)尋址,DWORD以字形式對data區(qū)尋址,PWORD以字形式對pdata區(qū)尋址,XWORD以字形式對xdata區(qū)尋址。第4章C語言基礎(chǔ)與C51程序設(shè)計【例】絕對地址對存儲單元的訪問#include<absacc.h>/*將絕對地址頭文件包含在文件中*/#include<reg52.h>/*將寄存器頭文件包含在文件中*/#defineucharunsignedchar/*定義符號uchar為數(shù)據(jù)類型符unsignedchar*/#defineuintunsignedint/*定義符號uint為數(shù)據(jù)類型符unsignedint*/voidmain(void){ucharvar1;uintvar2;var1=XBYTE[0x0002];/*訪問片外RAM的0002字節(jié)單元*/var2=XWORD[0x0004];/*訪問片外RAM的0004~0005單元*/......while(1);}
第4章C語言基礎(chǔ)與C51程序設(shè)計3、使用C51擴展關(guān)鍵字_at_
使用_at_對指定的存儲器空間的絕對地址進行訪問,一般格式如下:數(shù)據(jù)類型[存儲器類型]標(biāo)識符_at_地址常數(shù);其中,存儲器類型為data、bdata、idata、pdata等C51能識別的數(shù)據(jù)類型,如省略則按存儲模式規(guī)定的默認存儲器類型確定變量的存儲器區(qū)域;數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型。地址常數(shù)用于指定變量的絕對地址,必須位于有效的存儲器空間之內(nèi);使用_at_定義的變量必須為全局變量。第4章C語言基礎(chǔ)與C51程序設(shè)計【例】通過_at_實現(xiàn)絕對地址的訪問。#defineucharunsignedchar/*定義符號uchar為數(shù)據(jù)類型符unsignedchar*/#defineuintunsignedint/*定義符號uint為數(shù)據(jù)類型符unsignedint*/voidmain(void){dataucharx1_at_0x40;/*在data區(qū)中定義字節(jié)變量
x1,它的地址為40H*/xdatauintx2_at_0x2000;/*在xdata區(qū)中定義字變量
x2,它的地址為2000H*/x1=0xff;x2=0x1234;......while(1);}第4章C語言基礎(chǔ)與C51程序設(shè)計補充:C51的運算符及表達式1.賦值運算符賦值運算符“=”,在C51中,它的功能是將一個數(shù)據(jù)的值賦給一個變量,如x=10。利用賦值運算符將一個變量與一個表達式連接起來的式子稱為賦值表達式,在賦值表達式的后面加一個分號“;”就構(gòu)成了賦值語句,一個賦值語句的格式如下:
變量=表達式;執(zhí)行時先計算出右邊表達式的值,然后賦給左邊的變量。例如:
x=8+9;/*將8+9的值賦紿變量x*/x=y=5;/*將常數(shù)5同時賦給變量x和y*/
在C51中,允許在一個語句中同時給多個變量賦值,賦值順序自右向左。第4章C語言基礎(chǔ)與C51程序設(shè)計2.算術(shù)運算符C51中支持的算術(shù)運算符有:
+加或取正值運算符
-減或取負值運算符*乘運算符
/除運算符
%取余運算符加、減、乘運算相對比較簡單,而對于除運算,如相除的兩個數(shù)為浮點數(shù),則運算的結(jié)果也為浮點數(shù),如相除的兩個數(shù)為整數(shù),則運算的結(jié)果也為整數(shù),即為整除。如25.0/20.0結(jié)果為1.25,而25/20結(jié)果為1。對于取余運算,則要求參加運算的兩個數(shù)必須為整數(shù),運算結(jié)果為它們的余數(shù)。例如:x=5%3,結(jié)果x的值為2。第4章C語言基礎(chǔ)與C51程序設(shè)計3.關(guān)系運算符C51中有6種關(guān)系運算符:
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于關(guān)系運算用于比較兩個數(shù)的大小,用關(guān)系運算符將兩個表達式連接起來形成的式子稱為關(guān)系表達式。關(guān)系表達式通常用來作為判別條件構(gòu)造分支或循環(huán)程序。關(guān)系表達式的一般形式如下:
表達式1關(guān)系運算符表達式2
關(guān)系運算的結(jié)果為邏輯量,成立為真(1),不成立為假(0)。其結(jié)果可以作為一個邏輯量參與邏輯運算。例如:5>3,結(jié)果為真(1),而10==100,結(jié)果為假(0)。注意:關(guān)系運算符等于“==”是由兩個“=”組成。第4章C語言基礎(chǔ)與C51程序設(shè)計4.邏輯運算符C51有3種邏輯運算符:
||邏輯或
&&邏輯與 !邏輯非關(guān)系運算符用于反映兩個表達式之間的大小關(guān)系,邏輯運算符則用于求條件式的邏輯值,用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子就是邏輯表達式。
邏輯與,格式:條件式1&&條件式2
當(dāng)條件式1與條件式2都為真時結(jié)果為真(非0值),否則為假(0值)。邏輯或,格式:條件式1||條件式2
當(dāng)條件式1與條件式2都為假時結(jié)果為假(0值),否則為真(非0值)。邏輯非,格式:!條件式當(dāng)條件式原來為真(非0值),邏輯非后結(jié)果為假(0值)。當(dāng)條件式原來為假(0值),邏輯非后結(jié)果為真(非0值)。例如:若a=8,b=3,c=0,則!a為假,a&&b為真,b&&c為假。第4章C語言基礎(chǔ)與C51程序設(shè)計5.位運算符【例】設(shè)a=0x45=01010100B,b=0x3b=00111011B,則a&b、a|b、a^b、~a、a<<2、b>>2分別為多少?a&b=00010000b=0x10。a|b=01111111B=0x7f。a^b=01101111B=0x6f。~a=10101011B=0xab。a<<2=01010000B=0x50。b>>2=00001110B=0x0e。C51語言能對運算對象按位進行操作,它與匯編語言使用一樣方便。位運算是按位對變量進行運算,但并不改變參與運算的變量的值。如果要求按位改變變量的值,則要利用相應(yīng)的賦值運算。C51中位運算符只能對整數(shù)進行操作,不能對浮點數(shù)進行操作。C51中的位運算符有:&按位與|按位或^按位異或~按位取反<<左移>>右移第4章C語言基礎(chǔ)與C51程序設(shè)計6.復(fù)合賦值運算符
C51語言中支持在賦值運算符“=”的前面加上其它運算符,組成復(fù)合賦值運算符。下面是C51中支持的復(fù)合賦值運算符
+=加法賦值+
減法賦值*=乘法賦值/=除法賦值
%=取模賦值&=邏輯與賦值
|=邏輯或賦值^=邏輯異或賦值
~=邏輯非賦值>>=右移位賦值
<<=左移位賦值復(fù)合賦值運算的一般格式如下:變量復(fù)合運算賦值符表達式它的處理過程:先把變量與后面的表達式進行某種運算,然后將運算的結(jié)果賦給前面的變量。其實這是C51語言中簡化程序的一種方法,大多數(shù)二目運算都可以用復(fù)合賦值運算符簡化表示。例如:a+=6相當(dāng)于a=a+6;a*=5相當(dāng)于a=a*5;b&=0x55相當(dāng)于b=b&0x55;x>>=2相當(dāng)于x=x>>2。第4章C語言基礎(chǔ)與C51程序設(shè)計
指針是C51語言中的一個十分重要的概念,在C51中的數(shù)據(jù)類型中專門有一種指針類型。指針為變量的訪問提供了另一種方式,變量的指針就是該變量的地址,還可以定義一個專門指向某個變量的地址的指針變量。7.指針與地址運算符第4章C語言基礎(chǔ)與C51程序設(shè)計
為了表示指針變量和它所指向的變量地址之間的關(guān)系,C51中提供了兩個專門的運算符: *指針運算符
&取地址運算符指針運算符“*”放在指針變量前面,通過它實現(xiàn)訪問以指針變量的內(nèi)容為地址所指向的存儲單元。例如:指針變量p中的地址為2000H,則*p所訪問的是地址為2000H的存儲單元,x=*p,實現(xiàn)把地址為2000H的存儲單元的內(nèi)容送給變量x。取地址運算符“&”放在變量的前面,通過它取得變量的地址,變量的地址通常送給指針變量。例如:設(shè)變量x的內(nèi)容為12H,地址為2000H,則&x的值為2000H,如有一指針變量p,則通常用p=&x,實現(xiàn)將x變量的地址送給指針變量p,指針變量p指向變量x,以后可以通過*p訪問變量x。第4章C語言基礎(chǔ)與C51程序設(shè)計4.3中斷服務(wù)程序
中斷服務(wù)程序通過使用interrupt關(guān)鍵字來實現(xiàn)。定義中斷服務(wù)程序的一般格式如下:
void函數(shù)名()interruptn[usingm]
關(guān)鍵字interrupt后面的n是中斷號,n的取值范圍:0~31。編譯程序從8n+3處產(chǎn)生中斷向量,即在程序存儲器8n+3地址處形成一條長跳轉(zhuǎn)指令,轉(zhuǎn)向中斷號n的中斷服務(wù)程序。中斷號對應(yīng)著IE寄存器中的使能位,即IE寄存器中的0位對應(yīng)著外部中斷0,相應(yīng)的外部中斷0的中斷號是0。中斷號0~4與中斷源的對應(yīng)關(guān)系見表4.4。第4章C語言基礎(chǔ)與C51程序設(shè)計表4.4中斷號0~4和中斷源的對應(yīng)關(guān)系中斷號n中斷源中斷向量0外部中斷00003H1定時/計數(shù)器0000BH2外部中斷10013H3定時/計數(shù)器1001BH4串行口0023H第4章C語言基礎(chǔ)與C51程序設(shè)計#include<reg51.h>sbitp=P0^0;voidmain(){ IT0=1; /*對外部中斷0采用下降沿出發(fā)方式*/ EA=1; /*開啟中斷允許總控制位*/ EX0=1; /*開啟外部中斷0允許控制位*/ for(;;);}voidint0()interrupt0/*外部中斷0的中斷服務(wù)程序*/{ p=!p; /*產(chǎn)生中斷后對P0.0進行取反*/}usingm指明該中斷服務(wù)程序所對應(yīng)的工作寄存器組,取值范圍為0~3。指定工作寄存器組的缺點是所有被中斷調(diào)用的過程都必須使用同一個寄存器組,否則參數(shù)傳遞會發(fā)生錯誤。通常不設(shè)定usingm,除非保證中斷程序中未調(diào)用其他子程序。設(shè)置一個外部中斷0的中斷服務(wù)程序的例子如下:第4章C語言基礎(chǔ)與C51程序設(shè)計單片機C語言編程與設(shè)計第4章C語言基礎(chǔ)與C51程序設(shè)計基本程度范例:例1、LED的控制
使用89C5l的Port1連接8個LED,以產(chǎn)生跑馬燈的效果。連接好電路并且完成程序之后,您將可以看到8個LED依次輪流閃爍。在這次練習(xí)中,您將學(xué)會如何使用I/OPort輸出數(shù)據(jù),以及如何使用循環(huán)實現(xiàn)時間延遲。
第4章C語言基礎(chǔ)與C51程序設(shè)計電路圖第4章C語言基礎(chǔ)與C51程序設(shè)計#include<REGX51.H>voiddelay(void)
/*delay函數(shù)*/{unsignedchari,j;/*這個函數(shù)執(zhí)行時間的延遲*/for
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)廚房設(shè)備購銷協(xié)議2024版B版
- 2024版河南省事業(yè)編制人員勞動協(xié)議樣式版B版
- 二零二五年度大巴車租賃與城市慶典活動策劃合同3篇
- 二零二五年度酒吧股份投資及風(fēng)險控制合同3篇
- 二零二五年度科技園區(qū)場地租賃詳細協(xié)議2篇
- 2024版短期勞務(wù)合同范例
- 濰坊護理職業(yè)學(xué)院《材料分析測試與表征》2023-2024學(xué)年第一學(xué)期期末試卷
- 太原學(xué)院《橋梁工程(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年食堂管理員與廚師合同3篇
- 二零二五年建筑工程施工企業(yè)工程結(jié)算與審計合同2篇
- 浙江省金華市婺城區(qū)2024-2025學(xué)年九年級上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 天津市河西區(qū)2024-2025學(xué)年高二上學(xué)期1月期末英語試題(含答案無聽力音頻及聽力原文)
- 水利工程安全應(yīng)急預(yù)案
- 滬教版小學(xué)數(shù)學(xué)三(下)教案
- 2024-2025年度村支書工作述職報告范文二
- 繼電保護多選試題庫與參考答案
- 品管圈PDCA改善案例-降低住院患者跌倒發(fā)生率
- 2024年江西水利職業(yè)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 《交換機基本原理》課件
- 向電網(wǎng)申請光伏容量的申請書
- 2024-2030年中國硫磺行業(yè)供需形勢及投資可行性分析報告版
評論
0/150
提交評論