首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C51 單片機數據類型詳解:從基本類型到特殊擴展

     編輯:關於C語言

核心數據類型表(Keil C51 編譯器)

數據類型長度值域 / 說明
unsigned char1 字節0 ~ 255
signed char1 字節-128 ~ +127
unsigned int / unsigned short2 字節0 ~ 65535
signed int / signed short2 字節-32768 ~ +32767
unsigned long4 字節0 ~ 4,294,967,295
signed long4 字節-2,147,483,648 ~ +2,147,483,647
float / double4 字節±1.175e-38 ~ ±3.402e+38 (IEEE-754 單精度)
* (指針)1~3 字節內存地址,視內存模式而定
bit1 位0 或 1 (C51 擴展,類 Boolean)
sfr1 字節0 ~ 255 (特殊功能寄存器,如 P1、TH0)
sfr162 字節0 ~ 65535 (16 位 SFR,如 T0、T1 計數器)
sbit1 位0 或 1 (可位寻址 SFR 或 RAM 位,如 P1_0)

關鍵類型深度解析

1. char 字符類型

  • 默認 signed char(有符號),範圍 -128~127。
  • unsigned char 常用於 ASCII 字符或 ≤255 的小整數。
  • 負數以補碼存儲:絕對值按位取反 +1。

2. int 整型(C51 中等同 short)

  • 16 位,默認 signed int。
  • 無符號範圍 0~65535,有符號 -32768~32767。

3. long 長整型

  • 32 位,默認 signed long。
  • 涉及大數運算(如時間戳、大計數)必用。

4. float 浮點型

  • 4 字節,7 位有效數字,IEEE-754 單精度。
  • 警告: 51 無硬件 FPU,浮點運算極其消耗代碼空間與執行周期,能用定點數(整數縮放)堅決不用浮點。

5. bit 位變量 —— C51 獨有神器

  • 僅佔 1 位 RAM(位寻址區 20H~2FH 或 80H以上)。
  • 不可定義指針、數組;不參與算術運算,只能賦值 0/1、邏輯判斷。
  • 極適合標誌位、狀態機、單個 IO 口狀態鎖存。

6. sfr / sfr16 / sbit —— 硬件直達

// 定義 SFR
sfr P1 = 0x90;          // P1 口地址
sfr16 T0 = 0x8A;        // 16 位定時器 T0 (TH0:TL0)

// 定義 SBIT (基於 SFR 或直接地址)
sbit P1_0 = P1^0;       // 推薦:基於已定義 SFR
sbit P1_0 = 0x90^0;     // 直接地址
sbit EA = 0xAF;         // 中斷總開關 (IE.7)

// 使用
P1 = 0xFF;              // 整口操作
P1_0 = 0;               // 單位操作(編譯器生成 SETB/CLR 指令,原子、高效)
EA = 1;                 // 開總中斷

實戰:數據類型長度對延時的影響

#include <AT89X51.h>

void main(void) {
    unsigned int a;   // 16 位,最大 65535
    unsigned char b;  // 8 位,最大 255

    while (1) {
        // D1 亮:unsigned int 延時
        for (a = 0; a < 65535; a++) P1_0 = 0;
        P1_0 = 1;
        for (a = 0; a < 30000; a++); // 間隔

        // D2 亮:unsigned char 延時
        for (b = 0; b < 255; b++) P1_1 = 0;
        P1_1 = 1;
        for (a = 0; a < 30000; a++);
    }
}

現象: D1 亮的時間明顯長於 D2,直觀驗證 16 位 vs 8 位循環次數差異。

避坑指南:值域越界 = 死循環

unsigned char b;
for (b = 0; b < 256; b++)  // ❌ 錯誤!b 最大 255,b++ 後變 0,永遠 < 256
    ;                      // 死循環

for (b = 0; b < 255; b++)  // ✅ 正確
    ;

同理 unsigned int 不超 65535,signed int 不超 ±32767。

選型建議

  1. 能用 unsigned char 解決(≤255)就不用 int,省 RAM、省周期。
  2. 標誌位優先 bit,極其高效。
  3. IO 口操作用 sfr/sbit,編譯器優化生成位指令。
  4. 定時器 16 位讀寫用 sfr16,避免高低字節分離出錯。
  5. 極力避免 float,定點數(Q15/Q31)處理小數運算。

熟練掌握 C51 數據類型,是寫出體積小、速度快、穩定可靠單片機代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved