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