51單片機之C語言-4.1數據類型

2021-01-11 電子產品世界
從這一章起我們開始學習單片機C語言,既然是語言那麼就應該有基本詞彙和相關的語法。我們先來看看數據類型。講數據之前先簡單說說單片機的存儲結構。我們知道單片機要運行之前,我們需要給他寫指令,指令存放在ROM存儲器上。我們再細想一下,既然存放在ROM上,那麼我們來想一個問題,比如我的指令中有個數字『3』要,這個『3』是怎麼存放的?相信這個很容易,單片機中存放的都是二進位,那麼首先要轉成二進位11B,格式如下:

這個不就是表示3了嗎?也就是說,如果你要放這個數,我把這個數先轉成二進位形式(可以直接使用電腦自帶的計算機來轉換),然後找單片機的存儲器要2個格子放進去1或者0就行了。這樣理解對不對呢?不對。你向單片機要格子的時候,單片機要麼給你8個格子,要麼16個,也就是8整數倍。為什麼是這樣?因為單片機存儲器的最小單元是一個字節(8位).也就是說,即便你只想放一個數字1,單片機也會給你8個格子。這裡我們可以這樣來理解存儲器:

本文引用地址:http://www.eepw.com.cn/article/201611/319550.htm

每一行8個單元格,每個單元格能放0或者1.ROM由很多個這樣的單元格組成。具體的我們後面再講。於是這樣我們存放3,30,40,120等等就容易了,都是放在同一行的單元格中。這樣每一行能存放的大小範圍為0-255.也就是說在0-255直接任意大小的數據都很好存儲了。像這樣的數據我們就叫char型。但是又有了個問題,如果我要存放-3這個負數,怎麼辦?我們說過這些單元格只能放1或者0,不能放負號進去,怎麼辦?於是我們想了個辦法,就從8個單元格中取一個出來,用0表示正,1表示負。取哪一個單元格,最高位也就是最左邊的那個為最高位。假如我現在在最高位放一個1,那麼單片機怎麼知道這個最高位是1還是表示負數,比如:

1111_0110這個是多少,246還是-118,怎麼區別?看看我們是怎麼告訴單片機的,

unsignedchar 表示最高位為數字,signed char表示最高位為正負。

好了,問題來了。如何我現在要存放256怎麼辦?8個單元格肯定不夠用了,需要9個單元格,前面說了,要麼8個單元格,要麼16個單元格,單片機不給你9個單元格,這樣我們只好用16個單元格,即使只用了9個單元格,有點浪費. 這16個格子就表示int整型。同樣的,正負也是佔用最高位的一個格子,unsigned int 表示最高位的單元格是數字,signed int最高單元格表示正負。舉個例子:65367

如果是unsigned int,則表示65367

如果是signed int,表示-32599

很容易的可以算出,unsigned int的範圍:0-65535

signedint的範圍: -32768 – 32767

現在我們知道了8個單元格就是char,16單元格就是int(範圍限於本單片機).那麼有沒有24個單元格呢?沒有,只有32個格子,這個是固定的。32格子就是長整型了,用long表示。同樣的,可以知道,

unsignedlong 範圍:0 – 4294967295,

signedlong 範圍:-2147483648 – 2147483647

通過以上的分析,我們可以知道,如果要使用的數據只需要佔用8個格子,就沒有必要佔用16個格子,這樣可以節省存儲空間。

另外這裡補充兩個程序中經常用到的兩個指令 define和typedef

1. 無參宏定義

#define 標誌符 字符串

其中的"#"表示這是一條預處理命令。凡是以"#"開頭的均為預處理命令。"標誌符"為所定義的宏名。"字符串"可以是常數,表達式,格式串等。

例如:

#define M (y*y+3*y)

它的作用是指定標誌符M來代替表達式(y*y+3*y). 在編寫源程序時,所有的(y*y+3*y)都可由M代替。

注意#define M(y*y+3*y)後面不可以有分號";",否則M將分號一起替換

2. 類型定義符typedef

C語言不僅提供了豐富的數據類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數據類型取"別名"。類型定義符typedef即可用來完成此功能。typedef定義的一般形式為:typedef 原類型名 新類型名例如 typedef char NAME[20];表示Name是字符數組類型,數組長度為20,注意後面帶有分號。然後可以用NAME說明變量,如:NAME a1, a2, s1,s2;完全等效於:char a1[20], a2[20],s1[20],s2[20]宏定義define與類型說明符typedef的區別在單片機編程中我們經常看到:#define uchar unsigned char#define uint unsigned int也可以使用typedef來定義:typtedef unsigned char uchar;typedef unsigned int uint;但是碰到如下情況就不能互換了,#define PIN1 int *typedef (int *) PIN2;從形式上看這兩者相似,但在實際使用中卻不相同。下面用PIN1,PIN2說明變量時就可以看出它們的區別:PIN1 a, b;在宏代換後變成:int *a,b;表示a是指向整形的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數據類型,但畢竟是作為字符代換。在使用時要非常小心,以避免出錯。以上我們概述了數據類型,現在我們各舉一個例子說明,例1 比較unsigned char; unsigned int; unsigned long 佔用存儲空間的大小運行程序之前需要設置keil優化等級,將優化等級設置為0過程如下:在keil界面-> project->Options for target target 1...點擊C51,選擇Level為0

代碼如下:

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned char i;

i=0x30;

LED0=i;

while(1);

}

//輸出結果信息 Program Size: data=10.0 xdata=0 code=27

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned int i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=11.0 xdata=0 code=32

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned long i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=13.0 xdata=0 code=46

//unsigned char: Program Size: data=10.0 xdata=0 code=27//unsigned int: Program Size: data=11.0 xdata=0 code=32//unsigned long:Program Size: data=13.0 xdata=0 code=46可見同樣一個數據0x30, 使用不同的數據類型定義,將佔據不同的存儲空間例2 define的使用

#include "reg52.h"

#define uchar unsigned char //注意後面沒有分號

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

例3 typedef的使用

#include "reg52.h"

typedef unsigned char uchar;//注意後面有分號

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

相關焦點

  • 51單片機C語言教程(四) 數據類型
    先來簡單說說C語言的標識符和關鍵字。標識符是用來標識源程序中某個對象的名字的,這些對象可以是語句、數據類型、函數、變量、數組等等。C語言是大小字敏感的一種高級語言,如果我們要定義一個定時器1,可以寫做"Timer1",如果程序中有"TIMER1",那麼這兩個是完全不同定義的標識符。
  • 單片機c語言教程:C51數據類型
    每寫一個程序,總離不開數據的應用,在學習 c51 語言的過程中掌握理解數據類型也是 很關鍵的。先看表 3-1,表中列出了 KEIL uVision2 單片機c語言編譯器所支持的數據類型。在標準C語言中基本的數據類型為 char,int,short,long,float 和 double,而在c51編譯器中int 和 short 相同,float 和 double 相同,這裡就不列出說明了。
  • 51單片機C語言延時函數
    C程序中可使用不同類型的變量來進行延時設計。經實驗測試,使用unsigned char類型具有比unsigned int更優化的代碼,在使用時應該使用unsigned char作為延時變量。
  • 單片機c語言教程:建立你的第一個KeilC51項目
    ·提供auto、static、const等存儲類型和專門針對8051單片機的data、idata、pdata、xdata、code等存儲類型,自動為變量合理地分配地址;  ·C語言提供複雜的數據類型(數組、結構、聯合、枚舉、指針等),極大地增強了程序處理能力和靈活性;  ·提供small、compact、large等編譯模式,以適應片上存儲器的大小;  ·中斷服務程序的現場保護和恢復
  • 面向51單片機的Keil uVision4的四種基本數據類型
    在標準C語言中,存在著如下六種基本數據類型: 1、char:字符型; 2、short = short int:短整型 3、int:整型 4、long = long int:長整型
  • 單片機c語言教程:C51變量
    要在程序中使用變量必須先用標識符作為變量名,並指出所用的數據類型和存儲模式,這樣編譯系統才能為變量分配相應的存儲空間。定義一個變量的格式如下:本文引用地址:http://www.eepw.com.cn/article/170891.htm[存儲種類] 數據類型 [存儲器類型] 變量名表在定義格式中除了數據類型和變量名表是必要的,其它都是可選項。
  • 51單片機教程之基礎編(基於C語言)
    當然隨著編譯器的改進,C語言執行效率已經接近彙編,但是想真正成為單片機高手的話,那麼我告訴你,精通彙編是必須的!因為彙編語言是直接操作單片機內部硬體的,如果你精通彙編,那麼意味著你對單片機十分熟悉,就能編出十分高效的程序。所以先學C語言能快速入門,再學彙編就能精通單片機。OK!說了這麼多,你會問:學習單片機能有什麼錢途?嗯!
  • 單片機C語言知識點全攻略(三)
    還有就是位運算符是不能用來對浮點型數據進行操作的。單片機c語言中共有6種位運算符。對於開始學習 C 語言的朋友在編程時最好還是根據自己的理解力和習慣去使 用程序表達的方式,不要一味追求程序代碼的短小。  逗號運算符  如果你有編程的經驗,那麼對逗號的作用也不會陌生了。如在 VB 中「Dim a,b,c」的逗 號就是把多個變量定義為同一類型的變量,在 C 也一樣,如「int a,b,c」,這些例子說明逗 號用於分隔表達式用。
  • 51單片機基礎剖析(基於C語言)
    在VC 6.0環境下很容易用malloc()來得到一塊RAM,但是由於單片機內部沒有作業系統(如何在51上跑uC/OS-II我以後會寫出來),所以在51上實現動態內存分配就是個難點也是一個重點問題。下面給出代碼,詳細分析大家可以參考求是科技編的《8051系列單片機C程序設計完全手冊》這本書。
  • 單片機C語言程序設計:LED 模擬交通燈
    */#includereg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //東西向燈sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0
  • 【愛找茬】都是C語言,單片機C語言和普通的C語言究竟有什麼差異呢?
    許多小夥伴在學完C語言後想入門單片機,但學著學著發現明明都是C語言,為什麼單片機C語言和我當初學的C語言有差異呢?今天小編就來梳理我們平時所學的C語言與單片機C語言的有什麼樣的不同。
  • 單片機c語言教程:C51運算符和表達式(指針和地址運算符)
    我們學習數據類型時,學習過指針類型,知道它是一種存放指向另一個數據的地址的變量類型。指針是單片機C語言中一個十分重要的概念,也是學習單片機C語言中的一個難點。對於指針將會在第九課中做詳細的講解。
  • PIC單片機C語言程序實例
    這就出現了精通51單片機彙編語言的人不能直接編寫PIC或其他單片機的彙編語言源程序,反之亦然的現象,以及產品升級換代和不同單片機問程序移植難的問題。而且,由於彙編語言是採用助記符的低級語言,可讀性較差,當源程序功能多、程序長時,即使加了注釋,閱讀自己編寫的程序也會感到困難,更不用說修改程序和增加功能了。
  • 單片機C語言模塊化編程方法
    51單片機學習實踐:用NTC電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:        STC15W408AS_DIP16 x1
  • 單片機基本結構及C語言編程基礎
    RXD、TXD、INT0、INT1、T0、T1   單片機內部I/O部件:(所為學習單片機,實際上就是編程控制以下I/O部件,完成指定任務) 1、 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2、 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3、 一個串行通信接口;(SCON,SBUF) 4、 一個中斷控制器;(
  • 單片機中C語言延時函數
    單片機C語言延時程序計算2009-11-02 22:15單片機C語言延時程序用C語言寫出來程序非常的簡練,它是一種模塊化的語言,一種比彙編更高級的語言,但是就是這樣一種語言也還是有它不足之處:它的延時很不好控制
  • 單片機C語言精確延時值的計算
    關於單片機C語言的精確延時,網上很多都是大約給出延時值沒有準確那值是多少,也就沒有達到精確高的要求,而51hei給出的本函數克服了以上缺點,能夠精確計數出要延時值且精確達到1us,本舉例所用CPU為STC12C5412系列12倍速的單片機,只要修改一下參數值其它系例單片機也通用
  • 單片機提高C語言代碼效率的方法
    單片機的ROM和RAM的空間都很有限,當您編程時遇到單片機的ROM和RAM的不夠用的時候,或者您的程序要求較高的執行速度時,我們就得面對解決代碼效率問題了。如何提高代碼效率?現筆者以一個LED閃爍的程序為例與您探討。
  • 51單片機資源擴展:擴展片外RAM
    51單片機資源擴展:從片內ROM跳轉到片外ROM 一文中擴展了單片機的程序存儲器,4KB存儲空間提升到64KB。其實,4K的代碼空間還湊合,但是51自帶的256B數據存儲空間使用起來還真緊張,其中留給用戶的連128B都不到,所以不得不擴展片外RAM。擴展RAM方法和擴展ROM差不多,都是佔用P0/P2口做地址線,同時P0用鎖存器74373分時復用地址和數據信號。
  • PIC單片機C語言編程教程(1)
    > 語言來開發單片機系統軟體最大的好處是編寫代碼效率高、軟體調試直觀、維護升級方便、代碼的重複利用率高、便於跨平臺的代碼移植等等,因此 C 語言編程在單片機系統設計中已得到越來越廣泛的運用。這就是為什麼前面所有章節中的的示範代碼全部用基礎的彙編指令實現的原因,希望籍此能使讀者對 PIC 單片機的指令體系和硬體資源有深入了解,在這基礎之上再來討論 C 語言編程,就有水到渠成的感覺。