小白必看:51 单片机常用语法基础科普
51单片机编程通常使用C语言,以下为你介绍51单片机编程中常见的语法:
### 数据类型
- **基本数据类型**
- **char**:字符型,占用1个字节,取值范围 -128 到 127(有符号)或 0 到 255(无符号)。例如:`char a = -10;` ,`unsigned char b = 200;`。
- **int**:整型,一般占用2个字节,取值范围 -32768 到 32767(有符号)或 0 到 65535(无符号)。例如:`int num = 1000;`,`unsigned int count = 5000;`。
- **long**:长整型,占用4个字节,能表示更大的数值范围。例如:`long big_num = 1234567;`。
- **float** 和 **double**:浮点型,用于表示小数。`float` 通常占用4个字节,`double` 占用8个字节,不过在51单片机中,由于资源有限,使用浮点型会消耗较多资源,应谨慎使用。例如:`float pi = 3.14;`。
- **特殊数据类型**
- **bit**:位类型,用于定义一个位变量,只能取值 0 或 1。例如:`bit flag = 1;`。
- **sbit**:特殊功能位声明,用于访问51单片机特殊功能寄存器中的某一位。例如:`sbit led = P1^0;` ,这里将P1口的第0位定义为 `led`。
- **sfr**:特殊功能寄存器声明,用于访问51单片机的特殊功能寄存器。例如:`sfr P1 = 0x90;` ,将地址 0x90 定义为 P1 口寄存器。
### 运算符
- **算术运算符**:`+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取模)。例如:`int result = 10 + 5;`,`int remainder = 10 % 3;`。
- **关系运算符**:`>`(大于)、`<`(小于)、`>=`(大于等于)、`<=`(小于等于)、`==`(等于)、`!=`(不等于)。常用于条件判断,例如:`if a> b) { ... }`。
- **逻辑运算符**:`&&`(逻辑与)、`||`(逻辑或)、`!`(逻辑非)。例如:`if ((a > 5) && (b < 10)) { ... }`。
- **位运算符**:`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)、`<<`(左移)、`>>`(右移)。在操作寄存器和处理二进制数据时常用,例如:`P1 = P1 & 0xFE;` ,将P1口的最低位清0。
### 流程控制语句
- **条件语句**
- **if - else**:根据条件判断执行不同的代码块。例如:
```c
if (a > 10) {
// 条件成立时执行
P1 = 0xFF;
} else {
// 条件不成立时执行
P1 = 0x00;
}
```
- **switch - case**:用于多分支选择。例如:
```c
switch (key_value) {
case 0:
P1 = 0x01;
break;
case 1:
P1 = 0x02;
break;
default:
P1 = 0xFF;
break;
}
```
- **循环语句**
- **for**:适用于已知循环次数的情况。例如,让P1口的LED灯循环闪烁5次:
```c
#include
void delay(unsigned int time);
void main() {
unsigned char i;
for (i = 0; i < 5; i++) {
P1 = 0x00; // 点亮LED
delay(500);
P1 = 0xFF; // 熄灭LED
delay(500);
}
}
void delay(unsigned int time) {
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 125; j++);
}
```
- **while**:先判断条件,条件为真时执行循环体。例如:
```c
while (a < 10) {
a++;
P1 = a;
}
```
- **do - while**:先执行一次循环体,再判断条件,条件为真时继续循环。例如:
```c
do {
a++;
P1 = a;
} while (a < 10);
```
### 函数
- **函数定义与调用**:函数可以将一段代码封装起来,提高代码的复用性。例如:
```c
#include
// 函数声明
void led_flash(void);
void main() {
while (1) {
led_flash(); // 调用函数
}
}
// 函数定义
void led_flash(void) {
P1 = 0x00; // 点亮LED
// 延时
unsigned int i, j;
for (i = 0; i < 500; i++)
for (j = 0; j < 125; j++);
P1 = 0xFF; // 熄灭LED
// 延时
for (i = 0; i < 500; i++)
for (j = 0; j < 125; j++);
}
```
- **中断函数**:51单片机有多个中断源,当相应的中断事件发生时,会自动跳转到中断函数执行。例如外部中断0的中断函数:
```c
#include
void main() {
EA = 1; // 全局中断使能
EX0 = 1; // 外部中断0使能
IT0 = 1; // 设置外部中断0为下降沿触发
while (1) {
// 主程序代码
}
}
// 外部中断0中断函数
void int0_isr() interrupt 0 {
P1 = ~P1; // 翻转P1口状态
}
```