<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機C語(yǔ)言學(xué)習4

51單片機C語(yǔ)言學(xué)習4

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò ) 收藏
第四課 數據類(lèi)型

  先來(lái)簡(jiǎn)單說(shuō)說(shuō)C語(yǔ)言的標識符和關(guān)鍵字。標識符是用來(lái)標識源程序中某個(gè)對象的名字的,這些對象可以是語(yǔ)句、數據類(lèi)型、函數、變量、數組等等。C語(yǔ)言是大小字敏感的一種高級語(yǔ)言,如果我們要定義一個(gè)定時(shí)器1,可以寫(xiě)做"Timer1",如果程序中有"TIMER1",那么這兩個(gè)是完全不同定義的標識符。標識符由字符串,數字和下劃線(xiàn)等組成,注意的是第一個(gè)字符必須是字母或下劃線(xiàn),如"1Timer"是錯誤的,編譯時(shí)便會(huì )有錯誤提示。有些編譯系統專(zhuān)用的標識符是以下劃線(xiàn)開(kāi)頭,所以一般不要以下劃線(xiàn)開(kāi)頭命名標識符。標識符在命名時(shí)應當簡(jiǎn)單,含義清晰,這樣有助于閱讀理解程序。在C51編譯器中,只支持標識符的前32位為有效標識,一般情況下也足夠用了,除非你要寫(xiě)天書(shū):P。
  關(guān)鍵字則是編程語(yǔ)言保留的特殊標識符,它們具有固定名稱(chēng)和含義,在程序編寫(xiě)中不允許標識符與關(guān)鍵字相同。在KEIL uVision2中的關(guān)鍵字除了有ANSI C標準的32個(gè)關(guān)鍵字外還根據51單片機的特點(diǎn)擴展了相關(guān)的關(guān)鍵字。其實(shí)在KEIL uVision2的文本編輯器中編寫(xiě)C程序,系統可以把保留字以不同顏色顯示,缺省顏色為天藍色。
  先看表4-1,表中列出了KEIL uVision2 C51編譯器所支持的數據類(lèi)型。在標準C語(yǔ)言中基本的數據類(lèi)型為char,int,short,long,float和double,而在C51編譯器中int和short相同,float和double相同,這里就不列出說(shuō)明了。下面來(lái)看看它們的具體定義:

本文引用地址:http://dyxdggzs.com/article/201611/320179.htm

數據類(lèi)型

長(cháng) 度

值 域

unsigned char

單字節

0~255

signed char

單字節

-128~+127

unsigned int

雙字節

0~65535

signed int

雙字節

-32768~+32767

unsigned long

四字節

0~4294967295

signed long

四字節

-2147483648~+2147483647

float

四字節

±1.175494E-38~±3.402823E+38

*

1~3字節

對象的地址

bit

0或1

sfr

單字節

0~255

sfr16

雙字節

0~65535

sbit

0或1

表4-1 KEIL uVision2 C51編譯器所支持的數據類(lèi)型


1. char字符類(lèi)型
char類(lèi)型的長(cháng)度是一個(gè)字節,通常用于定義處理字符數據的變量或常量。分無(wú)符號字符類(lèi)型unsigned char和有符號字符類(lèi)型signed char,默認值為signed char類(lèi)型。unsigned char類(lèi)型用字節中所有的位來(lái)表示數值,所可以表達的數值范圍是0~255。signed char類(lèi)型用字節中最高位字節表示數據的符號,"0"表示正數,"1"表示負數,負數用補碼表示。所能表示的數值范圍是-128~+127。unsigned char常用于處理ASCII字符或用于處理小于或等于255的整型數。
*正數的補碼與原碼相同,負二進(jìn)制數的補碼等于它的絕對值按位取反后加1。

2. int整型
int整型長(cháng)度為兩個(gè)字節,用于存放一個(gè)雙字節數據。分有符號int整型數signed int和無(wú)符號整型數unsigned int,默認值為signed int類(lèi)型。signed int表示的數值范圍是-32768~+32767,字節中最高位表示數據的符號,"0"表示正數,"1"表示負數。unsigned int表示的數值范圍是0~65535。

好了,先停一下吧,我們來(lái)寫(xiě)個(gè)小程序看看unsigned char和unsigned int用于延時(shí)的不同效果,說(shuō)明它們的長(cháng)度是不同的,呵,盡管它并沒(méi)有實(shí)際的應用意義,這里我們學(xué)習它們的用法就行。依舊用我們上一課的最小化系統做實(shí)驗,不過(guò)要加多一個(gè)電阻和LED,如圖4-1。實(shí)驗中用D1的點(diǎn)亮表明正在用unsigned int數值延時(shí),用D2點(diǎn)亮表明正在用unsigned char數值延時(shí)。



圖4-1 第4課實(shí)驗用電路

我們把這個(gè)項目稱(chēng)為T(mén)woLED,實(shí)驗程序如下:
#include //預處理命令

void main(void) //主函數名
{
unsigned int a; //定義變量a為unsigned int類(lèi)型
unsigned char b; //定義變量b為unsigned char類(lèi)型

do
{ //do while組成循環(huán)
for (a=0; a<65535; a++)
P1_0 = 0; //65535次設P1.0口為低電平,點(diǎn)亮LED
P1_0 = 1; //設P1.0口為高電平,熄滅LED

for (a=0; a<30000; a++); //空循環(huán)

for (b=0; b<255; b++)
P1_1 = 0; //255次設P1.1口為低電平,點(diǎn)亮LED
P1_1 = 1; //設P1.1口為高電平,熄滅LED


for (a=0; a<30000; a++); //空循環(huán)
}
while(1);
}

同樣編譯燒寫(xiě),上電運行您就可以看到結果了。很明顯D1點(diǎn)亮的時(shí)間長(cháng)于D2點(diǎn)亮的時(shí)間。程序中的循環(huán)延時(shí)時(shí)間并不是很好確定,并不太適合要求精確延時(shí)的場(chǎng)合,關(guān)于這方面我們以后也會(huì )做討論。這里必須要講的是,當定義一個(gè)變量為特定的數據類(lèi)型時(shí),在程序使用該變量不應使它的值超過(guò)數據類(lèi)型的值域。如本例中的變量b不能賦超出0~255的值,如for (b=0; b<255; b++)改為for (b=0; b<256; b++),編譯是可以通過(guò)的,但運行時(shí)就會(huì )有問(wèn)題出現,就是說(shuō)b的值永遠都是小于256的,所以無(wú)法跳出循環(huán)執行下一句P1_1 = 1,從而造成死循環(huán)。同理a的值不應超出0~65535。大家可以燒片看看實(shí)驗的運行結果,同樣軟件仿真也是可以看到結果的。

3. long長(cháng)整型
long長(cháng)整型長(cháng)度為四個(gè)字節,用于存放一個(gè)四字節數據。分有符號long長(cháng)整型signed long和無(wú)符號長(cháng)整型unsigned long,默認值為signed long類(lèi)型。signed int表示的數值范圍是-2147483648~+2147483647,字節中最高位表示數據的符號,"0"表示正數,"1"表示負數。unsigned long表示的數值范圍是0~4294967295。

4. float浮點(diǎn)型
float浮點(diǎn)型在十進(jìn)制中具有7位有效數字,是符合IEEE-754標準的單精度浮點(diǎn)型數據,占用四個(gè)字節。因浮點(diǎn)數的結構較復雜在以后的章節中再做詳細的討論。 5.* 指針型
指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數據的地址。這個(gè)指針變量要占據一定的內存單元,對不同的處理器長(cháng)度也不盡相同,在C51中它的長(cháng)度一般為1~3個(gè)字節。指針變量也具有類(lèi)型,在以后的課程中有專(zhuān)門(mén)一課做探討,這里就不多說(shuō)了。

6. bit位標量
bit位標量是C51編譯器的一種擴充數據類(lèi)型,利用它可定義一個(gè)位標量,但不能定義位指針,也不能定義位數組。它的值是一個(gè)二進(jìn)制位,不是0就是1,類(lèi)似一些高級語(yǔ)言中的Boolean類(lèi)型中的True和False。

7. sfr特殊功能寄存器
sfr也是一種擴充數據類(lèi)型,點(diǎn)用一個(gè)內存單元,值域為0~255。利用它可以訪(fǎng)問(wèn)51單片機內部的所有特殊功能寄存器。如用sfr P1 = 0x90這一句定P1為P1端口在片內的寄存器,在后面的語(yǔ)句中我們用以用P1 = 255(對P1端口的所有引腳置高電平)之類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。
*AT89C51的特殊功能寄存器表請看附錄二

8.sfr16 16位特殊功能寄存器
sfr16占用兩個(gè)內存單元,值域為0~65535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個(gè)字節的寄存器,好定時(shí)器T0和T1。

9. sbit可錄址位
sbit同位是C51中的一種擴充數據類(lèi)型,利用它可以訪(fǎng)問(wèn)芯片內部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了
sfr P1 = 0x90; //因P1端口的寄存器是可位尋址的,所以我們可以定義
sbit P1_1 = P1^1; //P1_1為P1中的P1.1引腳
//同樣我們可以用P1.1的地址去寫(xiě),如sbit P1_1 = 0x91;
這樣我們在以后的程序語(yǔ)句中就可以用P1_1來(lái)對P1.1引腳進(jìn)行讀寫(xiě)操作了。通常這些可以直接使用系統提供的預處理文件,里面已定義好各特殊功能寄存器的簡(jiǎn)單名字,直接引用可以省去一點(diǎn)時(shí)間,我自己是一直用的。當然您也可以自己寫(xiě)自己的定義文件,用您認為好記的名字。

  關(guān)于數據類(lèi)型轉換等相關(guān)操作在后面的課程或程序實(shí)例中將有所提及。大家可以用所講到的數據類(lèi)型改寫(xiě)一下這課的實(shí)例程序,加深對各類(lèi)型的認識。

附 錄
附錄一 C51中的關(guān)鍵字

關(guān)鍵字

用 途

說(shuō) 明

auto

存儲種類(lèi)說(shuō)明

用以說(shuō)明局部變量,缺省值為此

break

程序語(yǔ)句

退出最內層循環(huán)

case

程序語(yǔ)句

Switch語(yǔ)句中的選擇項

char

數據類(lèi)型說(shuō)明

單字節整型數或字符型數據

const

存儲類(lèi)型說(shuō)明

在程序執行過(guò)程中不可更改的常量值

continue

程序語(yǔ)句

轉向下一次循環(huán)

default

程序語(yǔ)句

Switch語(yǔ)句中的失敗選擇項

do

程序語(yǔ)句

構成do..while循環(huán)結構

double

數據類(lèi)型說(shuō)明

雙精度浮點(diǎn)數

else

程序語(yǔ)句

構成if..else選擇結構

enum

數據類(lèi)型說(shuō)明

枚舉

extern

存儲種類(lèi)說(shuō)明

在其他程序模塊中說(shuō)明了的全局變量

flost

數據類(lèi)型說(shuō)明

單精度浮點(diǎn)數

for

程序語(yǔ)句

構成for循環(huán)結構

goto

程序語(yǔ)句

構成goto轉移結構

if

程序語(yǔ)句

構成if..else選擇結構

int

數據類(lèi)型說(shuō)明

基本整型數

long

數據類(lèi)型說(shuō)明

長(cháng)整型數

register

存儲種類(lèi)說(shuō)明

使用CPU內部寄存的變量

return

程序語(yǔ)句

函數返回

short

數據類(lèi)型說(shuō)明

短整型數

signed

數據類(lèi)型說(shuō)明

有符號數,二進(jìn)制數據的最高位為符號位

sizeof

運算符

計算表達式或數據類(lèi)型的字節數

static

存儲種類(lèi)說(shuō)明

靜態(tài)變量

struct

數據類(lèi)型說(shuō)明

結構類(lèi)型數據

swicth

程序語(yǔ)句

構成switch選擇結構

typedef

數據類(lèi)型說(shuō)明

重新進(jìn)行數據類(lèi)型定義

union

數據類(lèi)型說(shuō)明

聯(lián)合類(lèi)型數據

unsigned

數據類(lèi)型說(shuō)明

無(wú)符號數數據

void

數據類(lèi)型說(shuō)明

無(wú)類(lèi)型數據

volatile

數據類(lèi)型說(shuō)明

該變量在程序執行中可被隱含地改變

while

程序語(yǔ)句

構成while和do..while循環(huán)結構

附表1-1 ANSIC標準關(guān)鍵字

關(guān)鍵字

用 途

說(shuō) 明

bit

位標量聲明

聲明一個(gè)位標量或位類(lèi)型的函數

sbit

位標量聲明

聲明一個(gè)可位尋址變量

Sfr

特殊功能寄存器聲明

聲明一個(gè)特殊功能寄存器

Sfr16

特殊功能寄存器聲明

聲明一個(gè)16位的特殊功能寄存器

data

存儲器類(lèi)型說(shuō)明

直接尋址的內部數據存儲器

bdata

存儲器類(lèi)型說(shuō)明

可位尋址的內部數據存儲器

idata

存儲器類(lèi)型說(shuō)明

間接尋址的內部數據存儲器

pdata

存儲器類(lèi)型說(shuō)明

分頁(yè)尋址的外部數據存儲器

xdata

存儲器類(lèi)型說(shuō)明

外部數據存儲器

code

存儲器類(lèi)型說(shuō)明

程序存儲器

interrupt

中斷函數說(shuō)明

定義一個(gè)中斷函數

reentrant

再入函數說(shuō)明

定義一個(gè)再入函數

using

寄存器組定義

定義芯片的工作寄存器

附表1-2 C51編譯器的擴展關(guān)鍵字

附錄二 AT89C51特殊功能寄存器列表(適用于同一架構的芯片)

符 號

地 址

注 釋

*ACC

E0H

累加器

*B

F0H

乘法寄存器

*PSW

D0H

程序狀態(tài)字

SP

81H

堆棧指針

DPL

82H

數據存儲器指針低8位

DPH

83H

數據存儲器指針高8位

*IE

A8H

中斷允許控制器

*IP

D8H

中斷優(yōu)先控制器

*P0

80H

端口0

*P1

90H

端口1

*P2

A0H

端口2

*P3

B0H

端口3

PCON

87H

電源控制及波特率選擇

*SCON

98H

串行口控制器

SBUF

99H

串行數據緩沖器

*TCON

88H

定時(shí)器控制

TMOD

89H

定時(shí)器方式選擇

TL0

8AH

定時(shí)器0低8位

TL1

8BH

定時(shí)器1低8位

TH0

8CH

定時(shí)器0低8位

TH1

8DH

定時(shí)器1高8位

帶*號的特殊功能寄存器都是可以位尋址的寄存器




評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>