跳转至

4.3 const 数组查表法(嵌入式常用技巧)

单片机的 CPU 通常很慢(几十到几百 MHz),算复杂数学公式(比如 sincossqrt)会很费时。

解决方案:提前算好,存成数组,直接查表。

// 比如:把 0°~90° 的 sin 值每隔 1° 算好,存在 Flash 里
// const 的意思是:这个数组不会变,存在单片机的Flash(只读空间)里
const int sin_table[] = {
    0,    17,   34,   52,   69,    // 0~4°
    87,   104,  121,  139,  156,   // 5~9°
    173,  190,  207,  224,  241,   // 10~14°
    258,  275,  292,  309,  325,   // 15~19°
    342,  358,  374,  390,  406,   // 20~24°
    // ... 一直算到 90°
};

// 使用时——不需要运算,直接查!
int angle = 30;
int sin_30 = sin_table[angle];     // 瞬间拿到结果 ✅
// 而不是:int sin_30 = (int)(sin(30 * 3.14 / 180) * 1000);  // 慢 ❌

查表法的好处: - 速度极快(一次数组访问,不需要任何计算) - 代码简单、容易理解 - 非常适合:温度转换表、7段数码管显示码、PWM控制曲线

// 数码管显示:0~9 对应哪几段LED点亮
const unsigned char seg_code[] = {
    0x3F,  // 0 → 二进制 0011 1111
    0x06,  // 1 → 0000 0110
    0x5B,  // 2 → 0101 1011
    0x4F,  // 3 → 0100 1111
    0x66,  // 4 → 0110 0110
    0x6D,  // 5 → 0110 1101
    0x7D,  // 6 → 0111 1101
    0x07,  // 7 → 0000 0111
    0x7F,  // 8 → 0111 1111
    0x6F,  // 9 → 0110 1111
};

int num = 4;
HAL_GPIO_WritePin(GPIOA, seg_code[num], GPIO_PIN_SET);  // 直接显示数字 4