機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
單片機C51學習(4)
單片機C51學習(4)
 更新時間:2008-7-27 16:00:00  點擊數(shù):4
【字體: 字體顏色

51單片機C語言學習 第四課 數(shù)據(jù)類型

   先來簡單說說C語言的標識符和關鍵字。標識符是用來標識源程序中某個對象的名字的,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等等。C語言是大小字敏感的一種高級語言,如果我們要定義一個定時器1,可以寫做\"Timer1\",如果程序中有\(zhòng)"TIMER1\",那么這兩個是完全不同定義的標識符。標識符由字符串,數(shù)字和下劃線等組成,注意的是第一個字符必須是字母或下劃線,如\"1Timer\"是錯誤的,編譯時便會有錯誤提示。有些編譯系統(tǒng)專用的標識符是以下劃線開頭,所以一般不要以下劃線開頭命名標識符。標識符在命名時應當簡單,含義清晰,這樣有助于閱讀理解程序。在C51編譯器中,只支持標識符的前32位為有效標識,一般情況下也足夠用了,除非你要寫天書:P。


  關鍵字則是編程語言保留的特殊標識符,它們具有固定名稱和含義,在程序編寫中不允許標識符與關鍵字相同。在KEIL uVision2中的關鍵字除了有ANSI C標準的32個關鍵字外還根據(jù)51單片機的特點擴展了相關的關鍵字。其實在KEIL uVision2的文本編輯器中編寫C程序,系統(tǒng)可以把保留字以不同顏色顯示,缺省顏色為天藍色。


  先看表4-1,表中列出了KEIL uVision2 C51編譯器所支持的數(shù)據(jù)類型。在標準C語言中基本的數(shù)據(jù)類型為char,int,short,long,float和double,而在C51編譯器中int和short相同,float和double相同,這里就不列出說明了。下面來看看它們的具體定義:

數(shù)據(jù)類型 長 度 值 域
unsigned char 單字節(jié) 0~255
signed char 單字節(jié) -128~+127
unsigned int 雙字節(jié) 0~65535
signed int 雙字節(jié) -32768~+32767
unsigned long 四字節(jié) 0~4294967295
signed long 四字節(jié) -2147483648~+2147483647
float 四字節(jié) ±1.175494E-38~±3.402823E+38
* 1~3字節(jié) 對象的地址
bit 0或1
sfr 單字節(jié) 0~255
sfr16 雙字節(jié) 0~65535
sbit 0或1
表4-1 KEIL uVision2 C51編譯器所支持的數(shù)據(jù)類型


1. char字符類型
char類型的長度是一個字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無符號字符類型unsigned char和有符號字符類型signed char,默認值為signed char類型。unsigned char類型用字節(jié)中所有的位來表示數(shù)值,所可以表達的數(shù)值范圍是0~255。signed char類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,\"0\"表示正數(shù),\"1\"表示負數(shù),負數(shù)用補碼表示。所能表示的數(shù)值范圍是-128~+127。unsigned char常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。
*正數(shù)的補碼與原碼相同,負二進制數(shù)的補碼等于它的絕對值按位取反后加1。 2. int整型
int整型長度為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。分有符號int整型數(shù)signed int和無符號整型數(shù)unsigned int,默認值為signed int類型。signed int表示的數(shù)值范圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,\"0\"表示正數(shù),\"1\"表示負數(shù)。unsigned int表示的數(shù)值范圍是0~65535。好了,先停一下吧,我們來寫個小程序看看unsigned char和unsigned int用于延時的不同效果,說明它們的長度是不同的,呵,盡管它并沒有實際的應用意義,這里我們學習它們的用法就行。依舊用我們上一課的最小化系統(tǒng)做實驗,不過要加多一個電阻和LED,

如圖4-1。實驗中用D1的點亮表明正在用unsigned int數(shù)值延時,用D2點亮表明正在用unsigned char數(shù)值延時。


圖4-1 第4課實驗用電路

我們把這個項目稱為TwoLED,實驗程序如下:
#include <AT89X51.h> //預處理命令 void main(void) //主函數(shù)名
{
unsigned int a; //定義變量a為unsigned int類型
unsigned char b; //定義變量b為unsigned char類型do
{ //do while組成循環(huán)
for (a=0; a<65535; a++)
P1_0 = 0; //65535次設P1.0口為低電平,點亮LED
P1_0 = 1; //設P1.0口為高電平,熄滅LEDfor (a=0; a<30000; a++); //空循環(huán)for (b=0; b<255; b++)
P1_1 = 0; //255次設P1.1口為低電平,點亮LED
P1_1 = 1; //設P1.1口為高電平,熄滅LED
for (a=0; a<30000; a++); //空循環(huán)
}
while(1);
}同樣編譯燒寫,上電運行您就可以看到結果了。很明顯D1點亮的時間長于D2點亮的時間。程序中的循環(huán)延時時間并不是很好確定,并不太適合要求精確延時的場合,關于這方面我們以后也會做討論。這里必須要講的是,當定義一個變量為特定的數(shù)據(jù)類型時,在程序使用該變量不應使它的值超過數(shù)據(jù)類型的值域。如本例中的變量b不能賦超出0~255的值,如for (b=0; b<255; b++)改為for (b=0; b<256; b++),編譯是可以通過的,但運行時就會有問題出現(xiàn),就是說b的值永遠都是小于256的,所以無法跳出循環(huán)執(zhí)行下一句P1_1 = 1,從而造成死循環(huán)。同理a的值不應超出0~65535。大家可以燒片看看實驗的運行結果,同樣軟件仿真也是可以看到結果的。

3. long長整型
long長整型長度為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。分有符號long長整型signed long和無符號長整型unsigned long,默認值為signed long類型。signed int表示的數(shù)值范圍是-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,\"0\"表示正數(shù),\"1\"表示負數(shù)。unsigned long表示的數(shù)值范圍是0~4294967295。4. float浮點型
float浮點型在十進制中具有7位有效數(shù)字,是符合IEEE-754標準的單精度浮點型數(shù)據(jù),占用四個字節(jié)。因浮點數(shù)的結構較復雜在以后的章節(jié)中再做詳細的討論。 5.* 指針型
指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量要占據(jù)一定的內存單元,對不同的處理器長度也不盡相同,在C51中它的長度一般為1~3個字節(jié)。指針變量也具有類型,在以后的課程中有專門一課做探討,這里就不多說了。6. bit位標量
bit位標量是C51編譯器的一種擴充數(shù)據(jù)類型,利用它可定義一個位標量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是0就是1,類似一些高級語言中的Boolean類型中的True和False。7. sfr特殊功能寄存器
sfr也是一種擴充數(shù)據(jù)類型,點用一個內存單元,值域為0~255。利用它可以訪問51單片機內部的所有特殊功能寄存器。如用sfr P1 = 0x90這一句定P1為P1端口在片內的寄存器,在后面的語句中我們用以用P1 = 255(對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。
*AT89C51的特殊功能寄存器表請看附錄二8.sfr16 16位特殊功能寄存器
sfr16占用兩個內存單元,值域為0~65535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個字節(jié)的寄存器,好定時器T0和T1。9. sbit可錄址位
sbit同位是C51中的一種擴充數(shù)據(jù)類型,利用它可以訪問芯片內部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了
sfr P1 = 0x90; //因P1端口的寄存器是可位尋址的,所以我們可以定義
sbit P1_1 = P1^1; //P1_1為P1中的P1.1引腳
//同樣我們可以用P1.1的地址去寫,如sbit P1_1 = 0x91;
這樣我們在以后的程序語句中就可以用P1_1來對P1.1引腳進行讀寫操作了。通常這些可以直接使用系統(tǒng)提供的預處理文件,里面已定義好各特殊功能寄存器的簡單名字,直接引用可以省去一點時間,我自己是一直用的。當然您也可以自己寫自己的定義文件,用您認為好記的名字。  關于數(shù)據(jù)類型轉換等相關操作在后面的課程或程序實例中將有所提及。大家可以用所講到的數(shù)據(jù)類型改寫一下這課的實例程序,加深對各類型的認識。
附 錄 附錄一 C51中的關鍵字

關鍵字 用 途 說 明
auto 存儲種類說明 用以說明局部變量,缺省值為此
break 程序語句 退出最內層循環(huán)
case 程序語句 Switch語句中的選擇項
char 數(shù)據(jù)類型說明 單字節(jié)整型數(shù)或字符型數(shù)據(jù)
const 存儲類型說明 在程序執(zhí)行過程中不可更改的常量值
continue 程序語句 轉向下一次循環(huán)
default 程序語句 Switch語句中的失敗選擇項
do 程序語句 構成do..while循環(huán)結構
double 數(shù)據(jù)類型說明 雙精度浮點數(shù)
else 程序語句 構成if..else選擇結構
enum 數(shù)據(jù)類型說明 枚舉
extern 存儲種類說明 在其他程序模塊中說明了的全局變量
flost 數(shù)據(jù)類型說明 單精度浮點數(shù)
for 程序語句 構成for循環(huán)結構
goto 程序語句 構成goto轉移結構
if 程序語句 構成if..else選擇結構
int 數(shù)據(jù)類型說明 基本整型數(shù)
long 數(shù)據(jù)類型說明 長整型數(shù)
register 存儲種類說明 使用CPU內部寄存的變量
return 程序語句 函數(shù)返回
short 數(shù)據(jù)類型說明 短整型數(shù)
signed 數(shù)據(jù)類型說明 有符號數(shù),二進制數(shù)據(jù)的最高位為符號位
sizeof 運算符 計算表達式或數(shù)據(jù)類型的字節(jié)數(shù)
static 存儲種類說明 靜態(tài)變量
struct 數(shù)據(jù)類型說明 結構類型數(shù)據(jù)
swicth 程序語句 構成switch選擇結構
typedef 數(shù)據(jù)類型說明 重新進行數(shù)據(jù)類型定義
union 數(shù)據(jù)類型說明 聯(lián)合類型數(shù)據(jù)
unsigned 數(shù)據(jù)類型說明 無符號數(shù)數(shù)據(jù)
void 數(shù)據(jù)類型說明 無類型數(shù)據(jù)
volatile 數(shù)據(jù)類型說明 該變量在程序執(zhí)行中可被隱含地改變
while 程序語句 構成while和do..while循環(huán)結構

附表1-1 ANSIC標準關鍵字

關鍵字 用 途 說 明
bit 位標量聲明 聲明一個位標量或位類型的函數(shù)
sbit 位標量聲明 聲明一個可位尋址變量
Sfr 特殊功能寄存器聲明 聲明一個特殊功能寄存器
Sfr16 特殊功能寄存器聲明 聲明一個16位的特殊功能寄存器
data 存儲器類型說明 直接尋址的內部數(shù)據(jù)存儲器
bdata 存儲器類型說明 可位尋址的內部數(shù)據(jù)存儲器
idata 存儲器類型說明 間接尋址的內部數(shù)據(jù)存儲器
pdata 存儲器類型說明 分頁尋址的外部數(shù)據(jù)存儲器
xdata 存儲器類型說明 外部數(shù)據(jù)存儲器
code 存儲器類型說明 程序存儲器
interrupt 中斷函數(shù)說明 定義一個中斷函數(shù)
reentrant 再入函數(shù)說明 定義一個再入函數(shù)
using 寄存器組定義 定義芯片的工作寄存器

附表1-2 C51編譯器的擴展關鍵字
附錄二 AT89C51特殊功能寄存器列表(適用于同一架構的芯片)

符 號 地 址 注 釋
*ACC E0H 累加器
*B F0H 乘法寄存器
*PSW D0H 程序狀態(tài)字
SP 81H 堆棧指針
DPL 82H 數(shù)據(jù)存儲器指針低8位
DPH 83H 數(shù)據(jù)存儲器指針高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 串行數(shù)據(jù)緩沖器
*TCON 88H 定時器控制
TMOD 89H 定時器方式選擇
TL0 8AH 定時器0低8位
TL1 8BH 定時器1低8位
TH0 8CH 定時器0低8位
TH1 8DH 定時器1高8位

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

  • 上一篇: 單片機C51學習(7)
  • 下一篇: 單片機C51學習(3)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1