第3章C51數(shù)據(jù)與運(yùn)算_第1頁(yè)
第3章C51數(shù)據(jù)與運(yùn)算_第2頁(yè)
第3章C51數(shù)據(jù)與運(yùn)算_第3頁(yè)
第3章C51數(shù)據(jù)與運(yùn)算_第4頁(yè)
第3章C51數(shù)據(jù)與運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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)介

1、第三章第三章C51數(shù)據(jù)與運(yùn)算數(shù)據(jù)與運(yùn)算 3.1數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)數(shù)據(jù)具有一定格式的數(shù)字或數(shù)值叫做數(shù)據(jù)具有一定格式的數(shù)字或數(shù)值叫做數(shù)據(jù)數(shù)據(jù)類型數(shù)據(jù)類型數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)按一定的數(shù)據(jù)類型進(jìn)行的排數(shù)據(jù)按一定的數(shù)據(jù)類型進(jìn)行的排列、組合、架構(gòu)。列、組合、架構(gòu)。C51編譯器具體支持的數(shù)據(jù)類型:編譯器具體支持的數(shù)據(jù)類型:位型,無(wú)符號(hào)字符,有符號(hào)字符,位型,無(wú)符號(hào)字符,有符號(hào)字符,無(wú)無(wú)符號(hào)整型,有符號(hào)整型,無(wú)符號(hào)長(zhǎng)型,符號(hào)整型,有符號(hào)整型,無(wú)符號(hào)長(zhǎng)型,有符號(hào)長(zhǎng)型,有符號(hào)長(zhǎng)型,浮點(diǎn)和指針類型等浮點(diǎn)和指針類型等C51數(shù)據(jù)類型與標(biāo)準(zhǔn)數(shù)據(jù)類型與標(biāo)準(zhǔn)C

2、數(shù)據(jù)類型的最大不同之處:位型數(shù)據(jù)類型的最大不同之處:位型位型(位型(bit)字符型(字符型(char)整型(整型(int)長(zhǎng)整型(長(zhǎng)整型(long)浮點(diǎn)型(浮點(diǎn)型(float)雙精度浮點(diǎn)型(雙精度浮點(diǎn)型(double)數(shù)組類型(數(shù)組類型(array)結(jié)構(gòu)體類型(結(jié)構(gòu)體類型(struct)共用體(共用體(union)枚舉(枚舉(enum)基本類型基本類型構(gòu)造類型構(gòu)造類型指針類型指針類型空類型空類型數(shù)據(jù)類型數(shù)據(jù)類型表表3-1 KEIL C51的數(shù)據(jù)類型的數(shù)據(jù)類型數(shù)據(jù)類型數(shù)據(jù)類型長(zhǎng)度長(zhǎng)度(bit)長(zhǎng)度長(zhǎng)度(byte)值域值域bit110,1unsigned char810255signed char

3、81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位數(shù)字位數(shù)字)double6481.176E383.40E+38(10位數(shù)字位數(shù)字)一般指針一般指針243存儲(chǔ)空間存儲(chǔ)空間065535 在在C51語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類型語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類型不一致的情況。不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的

4、隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下:隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下: bitcharintlongfloat unsignedsigned 也就是說(shuō),當(dāng)也就是說(shuō),當(dāng)char型與型與int型進(jìn)行運(yùn)算時(shí),先自動(dòng)對(duì)型進(jìn)行運(yùn)算時(shí),先自動(dòng)對(duì)char型擴(kuò)展為型擴(kuò)展為int型,然后與型,然后與int型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為int型。型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類除了支持隱式類型轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類型轉(zhuǎn)換符型轉(zhuǎn)換符“()()”對(duì)數(shù)據(jù)類型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。對(duì)數(shù)據(jù)類型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,編譯器除了能支持以上這些基本數(shù)據(jù)類型之外

5、,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型。針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型。常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量。型常量。一、整型常量一、整型常量 整型常量也就是整型常數(shù),根據(jù)其值范圍在計(jì)算機(jī)中分整型常量也就是整型常數(shù),根據(jù)其值范圍在計(jì)算機(jī)中分配不同的字節(jié)數(shù)來(lái)存放。在配不同的字節(jié)數(shù)來(lái)存放。在C51C51中它可以表示成以下幾種

6、中它可以表示成以下幾種形式:形式: 十進(jìn)制整數(shù)。如十進(jìn)制整數(shù)。如234234、-56-56、0 0等。等。 十六進(jìn)制整數(shù)。以十六進(jìn)制整數(shù)。以0 x0 x開頭表示,如開頭表示,如0 x120 x12表示十六進(jìn)制數(shù)表示十六進(jìn)制數(shù)12H12H。 長(zhǎng)整數(shù)。在長(zhǎng)整數(shù)。在C51C51中當(dāng)一個(gè)整數(shù)的值達(dá)到長(zhǎng)整型的范圍,中當(dāng)一個(gè)整數(shù)的值達(dá)到長(zhǎng)整型的范圍,則該數(shù)按長(zhǎng)整型存放,在存儲(chǔ)器中占四個(gè)字節(jié),另外,如則該數(shù)按長(zhǎng)整型存放,在存儲(chǔ)器中占四個(gè)字節(jié),另外,如一個(gè)整數(shù)后面加一個(gè)字母一個(gè)整數(shù)后面加一個(gè)字母L L,這個(gè)數(shù)在存儲(chǔ)器中也按長(zhǎng)整,這個(gè)數(shù)在存儲(chǔ)器中也按長(zhǎng)整型存放。如型存放。如123L123L在存儲(chǔ)器中占四個(gè)字節(jié)。

7、在存儲(chǔ)器中占四個(gè)字節(jié)。3.2常量與變量常量與變量二浮點(diǎn)型常量二浮點(diǎn)型常量浮點(diǎn)型常量也就是實(shí)型常數(shù)。有十進(jìn)制表示形式浮點(diǎn)型常量也就是實(shí)型常數(shù)。有十進(jìn)制表示形式和指數(shù)表示形式。和指數(shù)表示形式。十進(jìn)制表示形式又稱定點(diǎn)表示形式,由數(shù)字和小十進(jìn)制表示形式又稱定點(diǎn)表示形式,由數(shù)字和小數(shù)點(diǎn)組成。如數(shù)點(diǎn)組成。如0.123、34.645等都是十進(jìn)制數(shù)表示形等都是十進(jìn)制數(shù)表示形式的浮點(diǎn)型常量。式的浮點(diǎn)型常量。指數(shù)表示形式為:指數(shù)表示形式為: 數(shù)字?jǐn)?shù)字.數(shù)字?jǐn)?shù)字e 數(shù)字?jǐn)?shù)字例如:例如:123.456e-3、-3.123e2等都是指數(shù)形式的等都是指數(shù)形式的浮點(diǎn)型常量。浮點(diǎn)型常量。三字符型常量三字符型常量字符型常量是用

8、單引號(hào)引起的字符,如字符型常量是用單引號(hào)引起的字符,如a、1、F等。可以是可顯示的等。可以是可顯示的ASCII字符,也可以是不可顯字符,也可以是不可顯示的控制字符。對(duì)不可顯示的控制字符須在前面加上示的控制字符。對(duì)不可顯示的控制字符須在前面加上反斜杠反斜杠“”組成轉(zhuǎn)義字符。利用它可以完成一些特殊組成轉(zhuǎn)義字符。利用它可以完成一些特殊功能和輸出時(shí)的格式控制。常用的轉(zhuǎn)義字符如下表所功能和輸出時(shí)的格式控制。常用的轉(zhuǎn)義字符如下表所示。示。 轉(zhuǎn)義字符轉(zhuǎn)義字符 含含 義義ASCII碼(十六進(jìn)制數(shù))碼(十六進(jìn)制數(shù)) o空字符(空字符(null)00H n換行符(換行符(LF)0AH r回車符(回車符(CR)0D

9、H t水平制表符(水平制表符(HT)09H b退格符(退格符(BS)08H f換頁(yè)符(換頁(yè)符(FF)0CH 單引號(hào)單引號(hào)27H ”雙引號(hào)雙引號(hào)22H 反斜杠反斜杠5CH四字符串型常量四字符串型常量字符串型常量由雙引號(hào)字符串型常量由雙引號(hào)“”“”括起的字符組成。括起的字符組成。如如“D”、“1234”、“ABCD”等。注意字符串常量等。注意字符串常量與字符常量是不一樣,一個(gè)字符常量在計(jì)算機(jī)內(nèi)只用與字符常量是不一樣,一個(gè)字符常量在計(jì)算機(jī)內(nèi)只用一個(gè)字節(jié)存放,而一個(gè)字符串常量在內(nèi)存中存放時(shí)不一個(gè)字節(jié)存放,而一個(gè)字符串常量在內(nèi)存中存放時(shí)不僅雙引號(hào)內(nèi)的字符一個(gè)占一個(gè)字節(jié),而且系統(tǒng)會(huì)自動(dòng)僅雙引號(hào)內(nèi)的字符一個(gè)

10、占一個(gè)字節(jié),而且系統(tǒng)會(huì)自動(dòng)的在后面加一個(gè)轉(zhuǎn)義字符的在后面加一個(gè)轉(zhuǎn)義字符“o”作為字符串結(jié)束符。作為字符串結(jié)束符。因此不要將字符常量和字符串常量混淆,如字符常量因此不要將字符常量和字符串常量混淆,如字符常量A和字符串常量和字符串常量“A”是不一樣的。是不一樣的。常量常量在程序運(yùn)行的過(guò)程中,其值不能改變的。在程序運(yùn)行的過(guò)程中,其值不能改變的。變量變量在程序運(yùn)行中,其值可以改變的。一個(gè)變量由兩在程序運(yùn)行中,其值可以改變的。一個(gè)變量由兩部分組成:變量名和變量值。部分組成:變量名和變量值。 習(xí)慣上,習(xí)慣上,符號(hào)常量名用大寫,變量用小寫符號(hào)常量名用大寫,變量用小寫,以示區(qū)別。,以示區(qū)別。#defineCO

11、NST60main()intvariable,result;variable=20;result=variable*CONST;printf(result=%dn,result); 只有只有bitbit和和unsigned charunsigned char兩種數(shù)據(jù)類型可以直接支兩種數(shù)據(jù)類型可以直接支持機(jī)器指令,必須慎重變量和數(shù)據(jù)類型的選擇。持機(jī)器指令,必須慎重變量和數(shù)據(jù)類型的選擇。 用用C語(yǔ)言編寫單片機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的語(yǔ)言編寫單片機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的C語(yǔ)言程序的區(qū)別語(yǔ)言程序的區(qū)別:C語(yǔ)言編寫單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片語(yǔ)言編寫單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和

12、機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的變量,而標(biāo)準(zhǔn)的C語(yǔ)言程序不需要考慮這些問題語(yǔ)言程序不需要考慮這些問題C51包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語(yǔ)言有一定的語(yǔ)言有一定的區(qū)別。其它的語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)區(qū)別。其它的語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法等與標(biāo)準(zhǔn)的方法等與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。語(yǔ)言程序設(shè)計(jì)相同。C51的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的法都與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同,但語(yǔ)言程序設(shè)計(jì)相同,但C51程程序與標(biāo)準(zhǔn)的序與標(biāo)準(zhǔn)的C程序在以

13、下程序在以下幾個(gè)方面不一樣幾個(gè)方面不一樣:(1)C51中定義的庫(kù)函數(shù)和標(biāo)準(zhǔn)中定義的庫(kù)函數(shù)和標(biāo)準(zhǔn)C語(yǔ)言定義語(yǔ)言定義的庫(kù)函數(shù)不同。標(biāo)準(zhǔn)的的庫(kù)函數(shù)不同。標(biāo)準(zhǔn)的C語(yǔ)言定義的庫(kù)函數(shù)是語(yǔ)言定義的庫(kù)函數(shù)是按通用微型計(jì)算機(jī)來(lái)定義的,而按通用微型計(jì)算機(jī)來(lái)定義的,而C51中的庫(kù)函中的庫(kù)函數(shù)是按數(shù)是按8051單片機(jī)相應(yīng)情況來(lái)定義的;單片機(jī)相應(yīng)情況來(lái)定義的;(2)C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型的數(shù)據(jù)類型也有一定的區(qū)別,在也有一定的區(qū)別,在C51中還增加了幾種針對(duì)中還增加了幾種針對(duì)8051單片機(jī)特有的數(shù)據(jù)類型;單片機(jī)特有的數(shù)據(jù)類型;(3)C51變量的存儲(chǔ)模式與標(biāo)準(zhǔn)變量的存儲(chǔ)模式與標(biāo)準(zhǔn)C中變量的存

14、中變量的存儲(chǔ)模式不一樣,儲(chǔ)模式不一樣,C51中變量的存儲(chǔ)模式是與中變量的存儲(chǔ)模式是與8051單片機(jī)的存儲(chǔ)器緊密相關(guān);單片機(jī)的存儲(chǔ)器緊密相關(guān);(4)C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,的輸入輸出處理不一樣,C51中的輸入輸出是通過(guò)中的輸入輸出是通過(guò)8051串行口來(lái)完成的,串行口來(lái)完成的,輸入輸出指令執(zhí)行前必須要對(duì)串行口進(jìn)行初始輸入輸出指令執(zhí)行前必須要對(duì)串行口進(jìn)行初始化;化;(5)C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的在函數(shù)使用方面也有一定的區(qū)別,區(qū)別,C51中有專門的中斷函數(shù)中有專門的中斷函數(shù)。變量是在程序運(yùn)行過(guò)程中其值可以改變的量。一變量是在程序運(yùn)行過(guò)程中其值可以改變的量。一個(gè)變量

15、由兩部分組成:變量名和變量值。個(gè)變量由兩部分組成:變量名和變量值。在在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元,定義的格式如下它分配相應(yīng)的存儲(chǔ)單元,定義的格式如下存儲(chǔ)種類存儲(chǔ)種類數(shù)據(jù)類型數(shù)據(jù)類型存儲(chǔ)器類型存儲(chǔ)器類型變量名表變量名表存儲(chǔ)種類存儲(chǔ)種類存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。C51變量的存儲(chǔ)種類有四種,分別是自動(dòng)變量的存儲(chǔ)種類有四種,分別是自動(dòng)(auto)、外部、外部(extern)、靜態(tài)、靜

16、態(tài)(static)和寄存器和寄存器(register)。1auto:使用使用auto定義的變量稱為自動(dòng)變量,其作用范圍定義的變量稱為自動(dòng)變量,其作用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,當(dāng)定義它的函數(shù)體在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語(yǔ)句執(zhí)行時(shí),或復(fù)合語(yǔ)句執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,結(jié)才為該變量分配內(nèi)存空間,結(jié)束時(shí)占用的內(nèi)存空間釋放。自動(dòng)變量一般分配在內(nèi)存的束時(shí)占用的內(nèi)存空間釋放。自動(dòng)變量一般分配在內(nèi)存的堆??臻g中。定義變量時(shí),如果省略存儲(chǔ)種類,則該變堆棧空間中。定義變量時(shí),如果省略存儲(chǔ)種類,則該變量默認(rèn)為自動(dòng)量默認(rèn)為自動(dòng)(auto)變量。變量。2extern:使

17、用使用extern定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序中定義過(guò)的外部變量要使用一個(gè)已在該函數(shù)體外或別的程序中定義過(guò)的外部變量時(shí),該變量在該函數(shù)體內(nèi)要用時(shí),該變量在該函數(shù)體內(nèi)要用extern說(shuō)明。外部變量被定義說(shuō)明。外部變量被定義后分配固定的內(nèi)存空間,在程序整個(gè)執(zhí)行時(shí)間內(nèi)都有效,直后分配固定的內(nèi)存空間,在程序整個(gè)執(zhí)行時(shí)間內(nèi)都有效,直到程序結(jié)束才釋放。到程序結(jié)束才釋放。3static:使用使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜

18、態(tài)變量為內(nèi)態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對(duì)應(yīng)的函數(shù)體內(nèi)有效,一直存在,但在函部靜態(tài)變量,它在對(duì)應(yīng)的函數(shù)體內(nèi)有效,一直存在,但在函數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護(hù),數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護(hù),還可以實(shí)現(xiàn)當(dāng)離開函數(shù)時(shí)值不被改變。外部靜態(tài)變量上在函還可以實(shí)現(xiàn)當(dāng)離開函數(shù)時(shí)值不被改變。外部靜態(tài)變量上在函數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理中,外部靜范圍之外是不可見的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件

19、內(nèi)部或模塊內(nèi)部有效。態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。4register:使用使用register定義的變量稱為寄存器變量。它定義定義的變量稱為寄存器變量。它定義的變量存放在的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但內(nèi)部的寄存器中,處理速度快,但數(shù)目少。數(shù)目少。C51編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率最高的變量,并自動(dòng)將其作為寄存器變量,用戶可以無(wú)最高的變量,并自動(dòng)將其作為寄存器變量,用戶可以無(wú)需專門聲明。需專門聲明。 位變量位變量(bit)(bit):與:與80518051硬件特性操作有關(guān)的可以定義成硬件特性操作有關(guān)的可以定義成位變量。位變量必須定

20、位在位變量。位變量必須定位在80518051單片機(jī)片內(nèi)單片機(jī)片內(nèi)RAMRAM的位尋址空的位尋址空間中。間中。 字符變量字符變量(char)(char):字符變量的長(zhǎng)度為:字符變量的長(zhǎng)度為1 byte1 byte即即8 8位。這位。這很合適很合適80518051單片機(jī),因?yàn)閱纹瑱C(jī),因?yàn)?0518051單片機(jī)每次可處理單片機(jī)每次可處理8 8位數(shù)據(jù)。位數(shù)據(jù)。對(duì)于無(wú)符號(hào)變量對(duì)于無(wú)符號(hào)變量(unsigned char)(unsigned char)的值域范圍是的值域范圍是0255。對(duì)。對(duì)于有符號(hào)字符變量于有符號(hào)字符變量(signed char)(signed char),最具有重要意義的位,最具有重要意

21、義的位是最高位上的符號(hào)標(biāo)志位是最高位上的符號(hào)標(biāo)志位(msb)(msb)。此位為。此位為1 1代表代表“負(fù)負(fù)”,為,為0 0代表代表“正正”。有符號(hào)字符變量和無(wú)符號(hào)字符變量在表示。有符號(hào)字符變量和無(wú)符號(hào)字符變量在表示0127的數(shù)值時(shí),其含義是一樣的,都是的數(shù)值時(shí),其含義是一樣的,都是00 x7F。負(fù)數(shù)一。負(fù)數(shù)一般用補(bǔ)碼表示。般用補(bǔ)碼表示。 整型變量整型變量(int): 8051(int): 8051系列單片機(jī)將系列單片機(jī)將intint型變量的高位型變量的高位字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字節(jié)中。有符號(hào)整型變量節(jié)中。有符號(hào)整型變量

22、(signed int)(signed int)也使用也使用msbmsb位作符號(hào)標(biāo)位作符號(hào)標(biāo)志位,并使用二進(jìn)制補(bǔ)碼表示數(shù)值。可直接使用幾種專用志位,并使用二進(jìn)制補(bǔ)碼表示數(shù)值??芍苯邮褂脦追N專用的機(jī)器指令來(lái)完成多字節(jié)的加、減、乘、除運(yùn)算。的機(jī)器指令來(lái)完成多字節(jié)的加、減、乘、除運(yùn)算。圖圖3.2 整型數(shù)的存儲(chǔ)結(jié)構(gòu)整型數(shù)的存儲(chǔ)結(jié)構(gòu) 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 圖圖3.3 長(zhǎng)整型變量的存儲(chǔ)結(jié)構(gòu)長(zhǎng)整型變量的存儲(chǔ)結(jié)構(gòu) 浮點(diǎn)型變量浮點(diǎn)型變量(float): 浮點(diǎn)型變量為浮點(diǎn)型變量為32位,占位,占4個(gè)字節(jié),許多個(gè)字節(jié),許多復(fù)雜的數(shù)學(xué)表達(dá)式都

23、采用浮點(diǎn)變量數(shù)據(jù)類型。應(yīng)用符號(hào)位表復(fù)雜的數(shù)學(xué)表達(dá)式都采用浮點(diǎn)變量數(shù)據(jù)類型。應(yīng)用符號(hào)位表示數(shù)的符號(hào),用階碼和尾數(shù)表示數(shù)的大小。示數(shù)的符號(hào),用階碼和尾數(shù)表示數(shù)的大小。 用它們進(jìn)行任何數(shù)學(xué)運(yùn)算都需要使用由編譯器決定的各用它們進(jìn)行任何數(shù)學(xué)運(yùn)算都需要使用由編譯器決定的各種不同效率等級(jí)的庫(kù)函數(shù)。種不同效率等級(jí)的庫(kù)函數(shù)。KEIL C51的浮點(diǎn)變量數(shù)據(jù)類型的的浮點(diǎn)變量數(shù)據(jù)類型的使用格式與使用格式與IEEE-754標(biāo)準(zhǔn)有關(guān),具有標(biāo)準(zhǔn)有關(guān),具有24位精度,尾數(shù)的高位位精度,尾數(shù)的高位始終為始終為1,因而不保存,位的分布如下:,因而不保存,位的分布如下: 1位符號(hào)位。位符號(hào)位。 8位指數(shù)位。位指數(shù)位。 23位尾數(shù)。

24、位尾數(shù)。 符號(hào)位是最高位,尾數(shù)為低符號(hào)位是最高位,尾數(shù)為低23位,內(nèi)存中按字節(jié)存儲(chǔ)順序如下:位,內(nèi)存中按字節(jié)存儲(chǔ)順序如下:地址地址+0+1+2+3內(nèi)容內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMM 其中,其中,S為符號(hào)位,為符號(hào)位,1表示負(fù),表示負(fù),0表示正;表示正;E為階碼;為階碼;M為為23位尾數(shù),最高位為位尾數(shù),最高位為“1”。 一個(gè)浮點(diǎn)數(shù)的數(shù)值范圍是(一個(gè)浮點(diǎn)數(shù)的數(shù)值范圍是(-1)2E-127(1.M) 浮點(diǎn)變量值浮點(diǎn)變量值 -12.5的十進(jìn)制為:的十進(jìn)制為:0 xC1480000,它按圖,它按圖3.4所所示方式存于內(nèi)存中。示方式存于內(nèi)存中。MMMMMMMM0 xC10 x480

25、 x000 x00+0+1+2+3地址 使用簡(jiǎn)化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用使用簡(jiǎn)化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用#define語(yǔ)句自定義簡(jiǎn)化的類型標(biāo)識(shí)符。例如:語(yǔ)句自定義簡(jiǎn)化的類型標(biāo)識(shí)符。例如:#define uchar unsigned char #define uint unsigned int 這樣,在編程中,就可以用這樣,在編程中,就可以用uchar代替代替unsigned char,用,用uint代替代替unsigned int來(lái)定義變量。來(lái)定義變量。 8051 8051系列機(jī)在物理上有四個(gè)存儲(chǔ)空間系列機(jī)在物理上有四個(gè)存儲(chǔ)空間 1 1)片內(nèi)程序存儲(chǔ)器空間)

26、片內(nèi)程序存儲(chǔ)器空間 2 2)片外程序存儲(chǔ)器空間)片外程序存儲(chǔ)器空間 3 3)片內(nèi)數(shù)據(jù)存儲(chǔ)器空間)片內(nèi)數(shù)據(jù)存儲(chǔ)器空間 4 4)片外數(shù)據(jù)存儲(chǔ)器空間)片外數(shù)據(jù)存儲(chǔ)器空間3.3 Cx51數(shù)據(jù)的存儲(chǔ)類型與數(shù)據(jù)的存儲(chǔ)類型與8051存儲(chǔ)結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu) 80518051片內(nèi)數(shù)據(jù)存儲(chǔ)器可劃分為兩類:片內(nèi)數(shù)據(jù)存儲(chǔ)器可劃分為兩類:00H00H7FH7FH為片內(nèi)低為片內(nèi)低128128字節(jié)字節(jié)RAMRAM區(qū);區(qū); 80H80H0FFH0FFH為特殊功能寄存器區(qū)。為特殊功能寄存器區(qū)。 低字節(jié)低字節(jié)RAMRAM區(qū)又可以劃分為區(qū)又可以劃分為3 3個(gè)區(qū)域:個(gè)區(qū)域: 1 1)通用寄存器區(qū)()通用寄存器區(qū)(00H00H1FH1FH)

27、 每個(gè)寄存器可以用寄存器名尋址,也可直接用字每個(gè)寄存器可以用寄存器名尋址,也可直接用字節(jié)地址尋址。節(jié)地址尋址。 2 2)可位尋址區(qū))可位尋址區(qū) 可以按字節(jié)尋址操作,也可按位地址操作??梢园醋止?jié)尋址操作,也可按位地址操作。 3 3)用戶)用戶RAMRAM區(qū)區(qū)程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器嚴(yán)格分開,特殊功程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器嚴(yán)格分開,特殊功能寄存器與片內(nèi)數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址。能寄存器與片內(nèi)數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址。 片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)是存放臨時(shí)性傳遞變量或使用片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)是存放臨時(shí)性傳遞變量或使用頻率較高的變量的。頻率較高的變量的。 訪問片內(nèi)數(shù)據(jù)存儲(chǔ)器速度較快,經(jīng)常使用的訪問片內(nèi)數(shù)據(jù)存儲(chǔ)器速度較快,經(jīng)常使用的變量

28、置于片內(nèi)數(shù)據(jù)存儲(chǔ)器,而將不常用的置于片變量置于片內(nèi)數(shù)據(jù)存儲(chǔ)器,而將不常用的置于片外數(shù)據(jù)存儲(chǔ)器中。外數(shù)據(jù)存儲(chǔ)器中。尋址方式可使用直接和間接尋址。尋址方式可使用直接和間接尋址。表表 3.2 C51存儲(chǔ)器類型與存儲(chǔ)器類型與8051存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存儲(chǔ)器類型存儲(chǔ)器類型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系 data 直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問速度快直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問速度快(128字節(jié)字節(jié)) bdata 可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(16字節(jié)字節(jié)) idata 間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪問片內(nèi)全部間接尋址片內(nèi)

29、數(shù)據(jù)存儲(chǔ)區(qū),可訪問片內(nèi)全部RAM地址空間地址空間(256字節(jié)字節(jié)) pdata 分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū)分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié)字節(jié))由由MOV Ri訪問訪問(i=0,1) xdata 片外數(shù)據(jù)存儲(chǔ)區(qū)片外數(shù)據(jù)存儲(chǔ)區(qū)(64 KB)由由MOVX DPTR訪問訪問 code 程序存儲(chǔ)器程序存儲(chǔ)器64 KB空間,由空間,由MOVC DPTR訪問訪問表表3.3 C51存儲(chǔ)器類型及其數(shù)據(jù)長(zhǎng)度和值域存儲(chǔ)器類型及其數(shù)據(jù)長(zhǎng)度和值域存儲(chǔ)器類型存儲(chǔ)器類型長(zhǎng)度長(zhǎng)度(bit)長(zhǎng)度長(zhǎng)度(byte)值域范圍值域范圍data810255idata810255pdata810255xdata162065 535code

30、162065 535帶存儲(chǔ)類型的變量的定義的一般格式為:帶存儲(chǔ)類型的變量的定義的一般格式為: 存儲(chǔ)種類存儲(chǔ)種類數(shù)據(jù)類型數(shù)據(jù)類型存儲(chǔ)器類型存儲(chǔ)器類型變量名變量名帶存儲(chǔ)類型的變量定義舉例:帶存儲(chǔ)類型的變量定義舉例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;表表 3.4 存儲(chǔ)器模式說(shuō)明存儲(chǔ)器模式說(shuō)明存儲(chǔ)器模式存儲(chǔ)器模式說(shuō)說(shuō) 明明SMALLSMALLSMALLSMALL模式稱為小編譯模式模式稱為小編譯模式, ,默認(rèn)的存儲(chǔ)類型是默認(rèn)的存儲(chǔ)類型是datada

31、ta,參數(shù)及,參數(shù)及局部變量放入可直接尋址片內(nèi)局部變量放入可直接尋址片內(nèi)RAMRAM的用戶區(qū)中的用戶區(qū)中( (最大最大128128字節(jié)字節(jié)) )。另外所有對(duì)象另外所有對(duì)象( (包括堆棧包括堆棧) ),都必須嵌入片內(nèi),都必須嵌入片內(nèi)RAMRAM。棧長(zhǎng)很關(guān)鍵,。棧長(zhǎng)很關(guān)鍵,因?yàn)閷?shí)際棧長(zhǎng)依賴于函數(shù)嵌套調(diào)用層數(shù)因?yàn)閷?shí)際棧長(zhǎng)依賴于函數(shù)嵌套調(diào)用層數(shù)COMPACTCOMPACTCOMPACTCOMPACT模式稱為緊湊編譯模式模式稱為緊湊編譯模式, ,默認(rèn)的存儲(chǔ)類型是默認(rèn)的存儲(chǔ)類型是pdatapdata,參,參數(shù)及局部變量放入分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū),通過(guò)數(shù)及局部變量放入分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū),通過(guò)R0或R1間接訪

32、問,棧空間位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中間接訪問,??臻g位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中LARGELARGELARGELARGE模式稱為大編譯模式,默認(rèn)的存儲(chǔ)類型是模式稱為大編譯模式,默認(rèn)的存儲(chǔ)類型是xdataxdata,參數(shù),參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)區(qū),使用數(shù)據(jù)指針及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)區(qū),使用數(shù)據(jù)指針DPTRDPTR來(lái)來(lái)進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問效率較低,尤其對(duì)兩個(gè)或進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問效率較低,尤其對(duì)兩個(gè)或多個(gè)字節(jié)的變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的多個(gè)字節(jié)的變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的長(zhǎng)度長(zhǎng)度3.4 8051特殊功能寄存器特殊功能寄存器(SFR)的的C5

33、1定義定義 8051單片機(jī)中,除了程序計(jì)數(shù)器單片機(jī)中,除了程序計(jì)數(shù)器PC和和4組工作寄存器組外,組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器其它所有的寄存器均為特殊功能寄存器(SFR),分散在片內(nèi),分散在片內(nèi)RAM區(qū)的高區(qū)的高128字節(jié)中,地址范圍為字節(jié)中,地址范圍為80H0FFH。SFR中有中有11個(gè)個(gè)寄存器具有位尋址能力,它們的字節(jié)地址都能被寄存器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)整除,即字節(jié)地址是以地址是以8或或0為尾數(shù)的。為尾數(shù)的。 為了能直接訪問這些為了能直接訪問這些SFR,F(xiàn)ranklin C51提供了一種自主形提供了一種自主形式的定義方法,這種定義方法與標(biāo)

34、準(zhǔn)式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適用于對(duì)語(yǔ)言不兼容,只適用于對(duì)8051系列單片機(jī)進(jìn)行系列單片機(jī)進(jìn)行C語(yǔ)言編程。特殊功能寄存器語(yǔ)言編程。特殊功能寄存器C51定義的一定義的一般語(yǔ)法格式如下:般語(yǔ)法格式如下:sfr sfr_name = int constant; sfr是定義語(yǔ)句的關(guān)鍵字,其后必須跟一個(gè)是定義語(yǔ)句的關(guān)鍵字,其后必須跟一個(gè)8051單片機(jī)單片機(jī)真實(shí)存在的特殊功能寄存器名,真實(shí)存在的特殊功能寄存器名,=后面必須是一個(gè)整型常數(shù),后面必須是一個(gè)整型常數(shù),不允許帶有運(yùn)算符的表達(dá)式,是特殊功能寄存器不允許帶有運(yùn)算符的表達(dá)式,是特殊功能寄存器sfr-name的字節(jié)地址,這個(gè)常數(shù)值

35、的范圍必須在的字節(jié)地址,這個(gè)常數(shù)值的范圍必須在SFR地址范圍內(nèi),位地址范圍內(nèi),位于于0 x800 xFF。例如:例如:sfr SCON=0 x98; /* 串口控制寄存器地址串口控制寄存器地址98H */sfr TMOD=0 x89; /* 定時(shí)器定時(shí)器/計(jì)數(shù)器方式控制寄存器地址計(jì)數(shù)器方式控制寄存器地址89H */ 8051系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,因此建議將所有特殊的相同,因此建議將所有特殊的sfr定義放入一個(gè)頭文件中,定義放入一個(gè)頭文件中,該文件應(yīng)包括該文件應(yīng)包括8051單片機(jī)系列機(jī)型中的單片機(jī)系列機(jī)型中的SFR定義。定義。C

36、51編編譯器的譯器的reg51.h頭文件就是這樣一個(gè)文件。頭文件就是這樣一個(gè)文件。 在新的在新的8051系列產(chǎn)品中,系列產(chǎn)品中,SFR在功能上經(jīng)常組合為在功能上經(jīng)常組合為16位值,當(dāng)位值,當(dāng)SFR的高字節(jié)地址直接位于低字節(jié)之后時(shí),對(duì)的高字節(jié)地址直接位于低字節(jié)之后時(shí),對(duì)16位位SFR的值可以直接進(jìn)行訪問。例如的值可以直接進(jìn)行訪問。例如52子系列的定時(shí)器子系列的定時(shí)器/計(jì)計(jì)數(shù)器數(shù)器2就是這種情況。為了有效地訪問這類就是這種情況。為了有效地訪問這類SFR,可使用,可使用關(guān)鍵字關(guān)鍵字sfr16來(lái)定義,其定義語(yǔ)句的語(yǔ)法格式與來(lái)定義,其定義語(yǔ)句的語(yǔ)法格式與8位位SFR相同,只是相同,只是=后面的地址必須用

37、后面的地址必須用16位位SFR的低字節(jié)地址,的低字節(jié)地址,即低字節(jié)地址作為即低字節(jié)地址作為sfr16的定義地址。的定義地址。例如:例如: sfr16 T2 = 0 xCC /*定時(shí)器定時(shí)器/計(jì)數(shù)器計(jì)數(shù)器2:T2低低8位位地址為地址為0CCH,T2高高8位地址為位地址為0CDH*/ 這種定義適用于所有新的這種定義適用于所有新的16位位SFR,但不能用于,但不能用于定時(shí)器定時(shí)器/計(jì)數(shù)器計(jì)數(shù)器0和和1。 對(duì)于位尋址的對(duì)于位尋址的SFR中的位,中的位,C51的擴(kuò)充功能支持的擴(kuò)充功能支持特殊位的定義,像特殊位的定義,像SFR一樣不與標(biāo)準(zhǔn)一樣不與標(biāo)準(zhǔn)C兼容,使用兼容,使用sbit來(lái)定義位尋址單元。來(lái)定義位

38、尋址單元。 第一種方法:第一種方法: sbit bit-name = sfr-nameint constant; sbit是定義語(yǔ)句的關(guān)鍵字,后跟一個(gè)尋址位符號(hào)名是定義語(yǔ)句的關(guān)鍵字,后跟一個(gè)尋址位符號(hào)名(該位符該位符號(hào)名必須是號(hào)名必須是8051單片機(jī)中規(guī)定的位名稱單片機(jī)中規(guī)定的位名稱),=后的后的sfr-name必必須是已定義過(guò)的須是已定義過(guò)的SFR的名字,的名字,后的整常數(shù)是尋址位在特殊功能后的整常數(shù)是尋址位在特殊功能寄存器寄存器sfr-name中的位號(hào),必須是中的位號(hào),必須是07范圍中的數(shù)。例如:范圍中的數(shù)。例如: sfr PSW=0 xD0 ; /* 定義定義PSW寄存器地址為寄存器地址

39、為D0H */ sbit OV=PSW2 ; /* 定義定義OV位為位為PSW.2,地址為,地址為D2H */ sbit CY=PSW7 ; /* 定義定義CY位為位為PSW.7,地址為,地址為D7H */ 第二種方法:第二種方法:sbit bit-name = int constantint constant; =后的后的int constant為尋址地址位所在的特殊功能寄存器的為尋址地址位所在的特殊功能寄存器的字節(jié)地址,字節(jié)地址,符號(hào)后的符號(hào)后的int constant為尋址位在特殊功能寄存器為尋址位在特殊功能寄存器中的位號(hào)。例如:中的位號(hào)。例如: sbit OV=0 xD02 ;/* 定

40、義定義OV位地址是位地址是D0H字節(jié)字節(jié)中的第中的第2位位 */ sbit CY=0 xD07 ; /* 定義定義CY位地址是位地址是D0H字節(jié)中字節(jié)中的第的第7位位 */ 第三種方法:第三種方法:sbit bit-name = int constant; =后的后的int constant為尋址位的絕對(duì)位地址。例如:為尋址位的絕對(duì)位地址。例如: sbit OV=0 xD2 ;/* 定義定義OV位地址為位地址為D2H */ sbit CY=0 xD7 ;/* 定義定義CY位地址為位地址為D7H */ 特殊功能位代表了一個(gè)獨(dú)立的定義類,不能與其它位定義特殊功能位代表了一個(gè)獨(dú)立的定義類,不能與其它

41、位定義和位域互換。和位域互換。3.5 8051并行接口及其并行接口及其Cx51定義定義 8051系列單片機(jī)并行系列單片機(jī)并行I/O接口除了芯片上的接口除了芯片上的4個(gè)個(gè)I/O口口(P0 P3)外,還可以在片外擴(kuò)展外,還可以在片外擴(kuò)展I/O口??凇?051單片機(jī)單片機(jī)I/O口與數(shù)據(jù)存儲(chǔ)器統(tǒng)口與數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址,即把一個(gè)一編址,即把一個(gè)I/O口當(dāng)作數(shù)據(jù)存儲(chǔ)器中的一個(gè)單元來(lái)看待??诋?dāng)作數(shù)據(jù)存儲(chǔ)器中的一個(gè)單元來(lái)看待。 使用使用C51進(jìn)行編程時(shí),進(jìn)行編程時(shí),8051片內(nèi)的片內(nèi)的I/O口與片外擴(kuò)展的口與片外擴(kuò)展的I/O可可以統(tǒng)一在一個(gè)頭文件中定義,也可以在程序中以統(tǒng)一在一個(gè)頭文件中定義,也可以在程序中(

42、一般在開始的位一般在開始的位置置)進(jìn)行定義,其定義方法如下:進(jìn)行定義,其定義方法如下: 對(duì)于對(duì)于8051片內(nèi)片內(nèi)I/O口按特殊功能寄存器方法定義。例如:口按特殊功能寄存器方法定義。例如:sfr P0=0 x80 ; /* 定義定義P0口,地址為口,地址為80H */sfr P1=0 x90 ; /* 定義定義P1口,地址為口,地址為90H */ 對(duì)于片外擴(kuò)展對(duì)于片外擴(kuò)展I/O口,則根據(jù)硬件譯碼地址,將其視作為片口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,使用外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,使用#define語(yǔ)句進(jìn)行定義。例如語(yǔ)句進(jìn)行定義。例如#include #define PORTA

43、 XBYTE 0 xFFC0 absacc.h是是C51中絕對(duì)地址訪問函數(shù)的頭文件,將中絕對(duì)地址訪問函數(shù)的頭文件,將PORTA定定義為外部義為外部I/O口,地址為口,地址為 FFC0H,長(zhǎng)度為,長(zhǎng)度為8位。位。 一旦在頭文件或程序中對(duì)這些片外一旦在頭文件或程序中對(duì)這些片外I/O口進(jìn)行定義后,在程口進(jìn)行定義后,在程序中就可以自由使用變量名與其實(shí)際地址的聯(lián)系,以便使程序序中就可以自由使用變量名與其實(shí)際地址的聯(lián)系,以便使程序員能用軟件模擬員能用軟件模擬8051的硬件操作。的硬件操作。#include#defineucharunsignedcharsbitDIPswitch=P14;sbitgreen

44、LED=P15;voidmain(void)ucharinval;inval=0;while(1)if(DIPswitch=1)inval=P1&0 x0f;greenLED=0;elsegreenLED=1;P3=(P3&0 xf0)|inval; (1) 位變量位變量C51定義。使用定義。使用C51編程時(shí),定義了位變量后,就編程時(shí),定義了位變量后,就可以用定義了的變量來(lái)表示可以用定義了的變量來(lái)表示8051的位尋址單元。的位尋址單元。 位變量的位變量的C51定義的一般語(yǔ)法格式如下:定義的一般語(yǔ)法格式如下: 位類型標(biāo)識(shí)符位類型標(biāo)識(shí)符(bit) 位變量名;位變量名; 例如:例如:

45、bit direction_bit ;/* 把把direction_bit定義為位變量定義為位變量 */bit look_pointer ;/* 把把look_pointer定義為位變量定義為位變量 */3.6 位變量的位變量的C51定義定義 (2) 函數(shù)可包含類型為函數(shù)可包含類型為bit的參數(shù),也可以將其作為返回的參數(shù),也可以將其作為返回值。例如:值。例如: bit func(bit b0, bit b1) /* 變量變量b0,b1作為函數(shù)的參數(shù)作為函數(shù)的參數(shù) */ return (b1); /* 變量變量b1作為函數(shù)的返回值作為函數(shù)的返回值 */ 注意,使用注意,使用(#pragma di

46、sable)或包含明確的寄存器組切換或包含明確的寄存器組切換(using n)的函數(shù)不能返回位值,否則編輯器將會(huì)給出一個(gè)錯(cuò)誤的函數(shù)不能返回位值,否則編輯器將會(huì)給出一個(gè)錯(cuò)誤信息。信息。 (3) 對(duì)位變量定義的限制。位變量不能定義成一個(gè)指對(duì)位變量定義的限制。位變量不能定義成一個(gè)指針,如不能定義:針,如不能定義:bit * bit_pointer。不存在位數(shù)組,如。不存在位數(shù)組,如不能定義:不能定義:bit b_array 。 在位定義中,允許定義存儲(chǔ)類型,位變量都被放入一在位定義中,允許定義存儲(chǔ)類型,位變量都被放入一個(gè)位段,此段總位于個(gè)位段,此段總位于8051片內(nèi)的片內(nèi)的RAM區(qū)中。因此,存儲(chǔ)區(qū)中

47、。因此,存儲(chǔ)類型限制為類型限制為data和和idata,如果將位變量的存儲(chǔ)類型定義成,如果將位變量的存儲(chǔ)類型定義成其它存儲(chǔ)類型都將編譯出錯(cuò)。其它存儲(chǔ)類型都將編譯出錯(cuò)。例例1 先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型:先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型: bdata int ibase; /* 定義定義ibase為為bdata整型變量整型變量 */bdata char bary4; /* bary4定義為定義為bdata字符型數(shù)組字符型數(shù)組 */然后可使用然后可使用sbit定義可獨(dú)立尋址訪問的對(duì)象位:定義可獨(dú)立尋址訪問的對(duì)象位:sbit mybit0 = ibase0 ;/* mybit0定義為定義為ibas

48、e的第的第0位位 */sbit mybit15 = ibase15; /* mybit0定義為定義為ibase的第的第15位位 */sbit Ary07 = bary07 ; /* Ary07定義為定義為abry0的第的第7位位 */sbit Ary37 = bary37 ; /* Ary37定義為定義為abry3的第的第7位位 */3.7.1Cx51算術(shù)運(yùn)算符及其運(yùn)算符算術(shù)運(yùn)算符及其運(yùn)算符賦值運(yùn)算符賦值運(yùn)算符賦值運(yùn)算符賦值運(yùn)算符“=”,在,在C51中,它的功能是將一個(gè)數(shù)中,它的功能是將一個(gè)數(shù)據(jù)的值賦給一個(gè)變量,如據(jù)的值賦給一個(gè)變量,如x=10。利用賦值運(yùn)算符將一個(gè)。利用賦值運(yùn)算符將一個(gè)變量與

49、一個(gè)表達(dá)式連接起來(lái)的式子稱為賦值表達(dá)式,在變量與一個(gè)表達(dá)式連接起來(lái)的式子稱為賦值表達(dá)式,在賦值表達(dá)式的后面加一個(gè)分號(hào)賦值表達(dá)式的后面加一個(gè)分號(hào)“;”就構(gòu)成了賦值語(yǔ)句,就構(gòu)成了賦值語(yǔ)句,一個(gè)賦值語(yǔ)句的格式如下:一個(gè)賦值語(yǔ)句的格式如下:變量變量=表達(dá)式;表達(dá)式;執(zhí)行時(shí)先計(jì)算出右邊表達(dá)式的值,然后賦給左邊的執(zhí)行時(shí)先計(jì)算出右邊表達(dá)式的值,然后賦給左邊的變量。例如:變量。例如:x=8+9;/*將將8+9的值賦紿變量的值賦紿變量x*/x=y=5;/*將常數(shù)將常數(shù)5同時(shí)賦給變量同時(shí)賦給變量x和和y*/在在C51中,允許在一個(gè)語(yǔ)句中同時(shí)給多個(gè)變量賦值,中,允許在一個(gè)語(yǔ)句中同時(shí)給多個(gè)變量賦值,賦值順序自右向左。

50、賦值順序自右向左。3.7Cx51運(yùn)算符、表達(dá)式及其規(guī)則運(yùn)算符、表達(dá)式及其規(guī)則C51中支持的中支持的算術(shù)運(yùn)算符算術(shù)運(yùn)算符有:有:+加或取正值運(yùn)算符加或取正值運(yùn)算符-減或取負(fù)值運(yùn)算符減或取負(fù)值運(yùn)算符*乘運(yùn)算符乘運(yùn)算符/除運(yùn)算符除運(yùn)算符%取余運(yùn)算符取余運(yùn)算符加、減、乘運(yùn)算相對(duì)比較簡(jiǎn)單,而對(duì)于除運(yùn)算,加、減、乘運(yùn)算相對(duì)比較簡(jiǎn)單,而對(duì)于除運(yùn)算,如相除的兩個(gè)數(shù)為浮點(diǎn)數(shù),則運(yùn)算的結(jié)果也為浮點(diǎn)數(shù),如相除的兩個(gè)數(shù)為浮點(diǎn)數(shù),則運(yùn)算的結(jié)果也為浮點(diǎn)數(shù),如相除的兩個(gè)數(shù)為整數(shù),則運(yùn)算的結(jié)果也為整數(shù),即如相除的兩個(gè)數(shù)為整數(shù),則運(yùn)算的結(jié)果也為整數(shù),即為整除。如為整除。如25.0/20.0結(jié)果為結(jié)果為1.25,而,而25/20

51、結(jié)果為結(jié)果為1。對(duì)于取余運(yùn)算,則要求參加運(yùn)算的兩個(gè)數(shù)必須為對(duì)于取余運(yùn)算,則要求參加運(yùn)算的兩個(gè)數(shù)必須為整數(shù),運(yùn)算結(jié)果為它們的余數(shù)。例如:整數(shù),運(yùn)算結(jié)果為它們的余數(shù)。例如:x=5%3,結(jié)果,結(jié)果x的值為的值為2。2、算術(shù)表達(dá)式、優(yōu)先級(jí)與結(jié)合性、算術(shù)表達(dá)式、優(yōu)先級(jí)與結(jié)合性算術(shù)表達(dá)式:算術(shù)表達(dá)式:用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來(lái)的用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來(lái)的式子,運(yùn)算對(duì)象包括常量、變量、函數(shù)、數(shù)組和結(jié)構(gòu)等。式子,運(yùn)算對(duì)象包括常量、變量、函數(shù)、數(shù)組和結(jié)構(gòu)等。如:如:a*b/c-2.5+d優(yōu)先級(jí)優(yōu)先級(jí)指當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí)指當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí), ,執(zhí)行運(yùn)算的執(zhí)行運(yùn)算的先后次序。

52、先后次序。 結(jié)合性結(jié)合性指當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符的優(yōu)先級(jí)別指當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符的優(yōu)先級(jí)別相同的運(yùn)算順序。相同的運(yùn)算順序。 算術(shù)運(yùn)算符的算術(shù)運(yùn)算符的優(yōu)先級(jí)規(guī)定優(yōu)先級(jí)規(guī)定為:先乘除模,后加減,括號(hào)為:先乘除模,后加減,括號(hào)最優(yōu)先。最優(yōu)先。 運(yùn)算符執(zhí)行的先后取決與運(yùn)算符的優(yōu)先級(jí),當(dāng)優(yōu)先級(jí)相運(yùn)算符執(zhí)行的先后取決與運(yùn)算符的優(yōu)先級(jí),當(dāng)優(yōu)先級(jí)相同時(shí),在看看結(jié)合性。同時(shí),在看看結(jié)合性。如:如:a-b*c等價(jià)于等價(jià)于a-(b*c)a*b/c等價(jià)于等價(jià)于(a*b)/c 圖中圖中“ ” 表示必定轉(zhuǎn)換。既使是同一種類型也按表示必定轉(zhuǎn)換。既使是同一種類型也按 轉(zhuǎn)轉(zhuǎn)換。即當(dāng)遇到換。即當(dāng)遇到char、short

53、時(shí),系統(tǒng)一律將其轉(zhuǎn)換為時(shí),系統(tǒng)一律將其轉(zhuǎn)換為int參與運(yùn)算,參與運(yùn)算,如如a + b,先轉(zhuǎn)換為先轉(zhuǎn)換為int,結(jié)果為,結(jié)果為 int。而當(dāng)遇到。而當(dāng)遇到float時(shí),一時(shí),一律轉(zhuǎn)換為律轉(zhuǎn)換為double參與運(yùn)算。參與運(yùn)算。轉(zhuǎn)換方法轉(zhuǎn)換方法:double float高低高低 longunsignedint char, short+數(shù)據(jù)類型轉(zhuǎn)換數(shù)據(jù)類型轉(zhuǎn)換1. 1.自動(dòng)(缺?。╊愋娃D(zhuǎn)換自動(dòng)(缺?。╊愋娃D(zhuǎn)換 可根據(jù)自己的意愿利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符可根據(jù)自己的意愿利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個(gè)算術(shù)表達(dá)式轉(zhuǎn)換為所需類型將一個(gè)算術(shù)表達(dá)式轉(zhuǎn)換為所需類型強(qiáng)制類型轉(zhuǎn)換格式強(qiáng)制類型轉(zhuǎn)換格式: (類型名類型名) (表

54、達(dá)式表達(dá)式)例如例如: (double) a 將將a轉(zhuǎn)換為轉(zhuǎn)換為double(int) (x+y) 將將x+y轉(zhuǎn)換為轉(zhuǎn)換為int(float) (5%3) 將將5%3轉(zhuǎn)換為轉(zhuǎn)換為float2. 2.強(qiáng)制類型轉(zhuǎn)換運(yùn)算符強(qiáng)制類型轉(zhuǎn)換運(yùn)算符“()()”3.7.2、Cx51關(guān)系運(yùn)算符、表達(dá)式及優(yōu)先級(jí)關(guān)系運(yùn)算符、表達(dá)式及優(yōu)先級(jí)大于大于=大于或等于大于或等于=測(cè)試等于測(cè)試等于!=測(cè)試不等于測(cè)試不等于前前4種關(guān)系運(yùn)算符(種關(guān)系運(yùn)算符(、=)優(yōu)先級(jí)相同,后)優(yōu)先級(jí)相同,后兩種也相同;前兩種也相同;前4種優(yōu)先級(jí)高于后兩種種優(yōu)先級(jí)高于后兩種2.關(guān)系運(yùn)算符的優(yōu)先級(jí)關(guān)系運(yùn)算符的優(yōu)先級(jí)關(guān)系運(yùn)算符優(yōu)先級(jí)如右圖關(guān)系運(yùn)算符優(yōu)

55、先級(jí)如右圖:算術(shù)運(yùn)算符算術(shù)運(yùn)算符賦值運(yùn)算符賦值運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符高高低低舉例舉例: ca+b c(a+b)ab!=c (ab)!=ca= =bc a= =(bc a=(bc)關(guān)系運(yùn)算符的結(jié)合性為左結(jié)合關(guān)系運(yùn)算符的結(jié)合性為左結(jié)合關(guān)系表達(dá)式:用關(guān)系運(yùn)算符連接起來(lái)的表達(dá)式關(guān)系表達(dá)式:用關(guān)系運(yùn)算符連接起來(lái)的表達(dá)式格式:格式:說(shuō)明:說(shuō)明: 關(guān)系表達(dá)式的結(jié)果只有兩種即關(guān)系表達(dá)式的結(jié)果只有兩種即“真真”和和“假假”,其,其中中“真真”用用“”表示、表示、“假假”用用“”表示。表示。 判斷一個(gè)量是否為真時(shí),等于判斷一個(gè)量是否為真時(shí),等于0表示假,非表示假,非0都是真。都是真。3.7.3、Cx51邏輯運(yùn)

56、算符、表達(dá)式及優(yōu)先級(jí)邏輯運(yùn)算符、表達(dá)式及優(yōu)先級(jí)&邏輯邏輯“與與”(AND)|邏輯邏輯“或或”(OR)!邏輯邏輯“非非”(NOR)“&”和和“|”是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對(duì)象;而是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對(duì)象;而“!”是單目運(yùn)算符,只要求有一個(gè)運(yùn)算對(duì)象。是單目運(yùn)算符,只要求有一個(gè)運(yùn)算對(duì)象。邏輯表達(dá)式的結(jié)合性為自左向右邏輯表達(dá)式的結(jié)合性為自左向右邏輯表達(dá)式:用邏輯運(yùn)算符關(guān)系運(yùn)算符或邏輯表達(dá)式:用邏輯運(yùn)算符關(guān)系運(yùn)算符或邏輯量連接起來(lái)的式子稱為邏輯表達(dá)式。邏輯量連接起來(lái)的式子稱為邏輯表達(dá)式。邏輯表達(dá)式的值應(yīng)該是一個(gè)邏輯量真或假邏輯表達(dá)式的值應(yīng)該是一個(gè)邏輯量真或假邏輯表達(dá)式的值與關(guān)

57、系表達(dá)式的值相同,邏輯表達(dá)式的值與關(guān)系表達(dá)式的值相同,以以0代表假,以代表假,以1代表真。代表真。例如:若例如:若a=8,b=3,c=0,則!,則!a為假,為假,a&b為真,為真,b&c為假為假3.7.4、Cx51位操作及其表達(dá)式位操作及其表達(dá)式&按位與按位與|按位或按位或按位異或按位異或按位取反按位取反位右移位右移除了按位取反運(yùn)算符除了按位取反運(yùn)算符“”以外,以上位操作運(yùn)算以外,以上位操作運(yùn)算符都是兩目運(yùn)算符,即要求運(yùn)算符兩側(cè)各有一個(gè)運(yùn)符都是兩目運(yùn)算符,即要求運(yùn)算符兩側(cè)各有一個(gè)運(yùn)算對(duì)象。算對(duì)象。位運(yùn)算位運(yùn)算只能是只能是整型或字符型數(shù),不能為實(shí)型數(shù)據(jù)整型或字符型數(shù),不能為實(shí)型數(shù)據(jù)“&”:參加運(yùn)算的兩個(gè)運(yùn)算對(duì)象,若兩者相應(yīng)的位都為:參加運(yùn)算的兩個(gè)運(yùn)算對(duì)象,若兩者相應(yīng)的位都為1,則該位結(jié)果值為則該位結(jié)果值為1,否則為,否則為0?!皘”:參加運(yùn)算的兩個(gè)對(duì)象,若兩者相應(yīng)的位中有一個(gè)為:參加運(yùn)算的兩個(gè)對(duì)象,若兩者相應(yīng)的位中有一個(gè)為1,則該位結(jié)果為,則該位結(jié)果為1“”:參加

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論