51单片机从零到实战(5)——C语言补课
第 5 篇C 语言补习——单片机必须掌握的语法前 4 篇可能有些语法大家半懂不懂。这篇帮零基础读者快速补齐。1. 数据类型类型大小范围单片机常用unsigned char8 位0 ~ 255✅ 最常用char8 位-128 ~ 127unsigned int16 位0 ~ 65535✅ 延时/计数unsigned long32 位0 ~ 4,294,967,295✅ 长时间计时单片机第一原则能用 unsigned char 就不用 int能省 RAM 就省。512 字节的 RAM每个变量都珍贵。unsignedcharled_state;// 0~255存 8 个 LED 状态完美unsignedcharcount0;// 0~255计 100 次够用unsignedinttime_ms0;// 计毫秒char 不够必须 int2. 位运算——单片机最核心的操作// 把 P1 口的第 3 位清零其他位不变P1~(13);// P1 P1 (~0x08)// 把 P1 口的第 3 位置 1其他位不变P1|(13);// P1 P1 | 0x08// 取反第 3 位P1^(13);// 判断第 3 位是 0 还是 1if(P1(13)){// 第 3 位是 1}else{// 第 3 位是 0}理解这句代码 单片机上了一个台阶P1|(13);// 1 3 0000 0001 左移 3 位 0000 1000// P1 | 0x08 → P1 的第 3 位一定是 1其他位不变3. #define 宏#defineLED_PORTP1// 用名字代替数字#defineLED0P1^0#defineON0// LED 低电平亮#defineOFF1LED0ON;// 今天写 ON/OFFdelay(500);LED0OFF;// 三个月后回来看代码秒懂4. 模块化编程——拆分 .h 和 .cMyProject/ ├── main.c // 主逻辑 ├── delay.h // 延时函数声明 ├── delay.c // 延时函数实现 ├── led.h // LED 模块声明 └── led.c // LED 模块实现led.h#ifndef__LED_H__#define__LED_H__#includereg52.hvoidled_init(void);voidled_on(unsignedcharnum);voidled_off(unsignedcharnum);#endifled.c#includeled.hvoidled_init(void){P10xFF;}voidled_on(unsignedcharnum){P1~(1num);}voidled_off(unsignedcharnum){P1|(1num);}main.c#includeled.h#includedelay.hvoidmain(){led_init();while(1){led_on(0);delay(200);led_off(0);delay(200);}}5. 常用关键字关键字含义用途code存 Flash段码表、字库等大量常量data存内部 RAM低 128B频繁读写的变量xdata存外部 RAM大数组如果外扩了 RAMsbit定义位变量操作单个引脚sfr定义特殊功能寄存器P10x90 这种映射6. 小结unsigned char 是单片机的主力类型位运算 | ~ ^ 必须熟练掌握宏定义让代码可读性提升 10 倍模块化从第一个工程就开始做下一篇中断——让单片机同时做多件事下一篇中断——让单片机同时做多件事