当前位置:首页 > 技术文章 > 正文内容

小白必看:51 单片机常用语法基础科普

arlanguage1个月前 (04-01)技术文章24

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口状态

}

```

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/3766.html

分享给朋友:

“小白必看:51 单片机常用语法基础科普” 的相关文章

Linux服务器Centos7系统Nginx安装与配置

一 安装编译工具及库文件yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel二首先要安装 PCREPCRE 作用是让 Nginx 支持 Rewrite 功能。2.1 下载 PCRE 安装包cd /usr/...

基于 consul + nginx 的Spring boot微服务集群部署

consul + nginx 负载均衡最近做的基于consul的微服务项目,仅仅在单机上部署了一套,压测的时候扛不住(并发太高的时候linux文件连接数超过上限),于是想办法搞个集群部署。最终在我们的服务器的三台机器(mirage05-mirage07)上完成部署。一. 背景介绍以及项目现状1. c...

平稳运行半年的系统宕机了,记录一次排错调优的全过程

(一)前言最近发生了一件很让人头疼的事情,已经上线半年且平稳运行半年系统在年后早高峰的使用时发生了濒临宕机的情况。访问速度特别慢,后台查到大量time_wait的连接,从代码层面到架构层面到网络层面排查了几天几夜,总算是有了结果。(二)架构、问题描述先简单描述一下这个系统的架构,公网域名对应的公网I...

常见nginx配置文件的主上下文指令有哪些?

Nginx 由模块组成,这些模块由配置文件中指定的指令(directive)来控制。指令被分为简单指令和块指令。简单指令由名称和用空格分隔的参数组成,并以分号 (;) 结尾。块指令与简单指令具有相同的结构,但是在分号的位置,它以一组用大括号 ({ 和 }) 括起来的额外指令结束。如果块指令可以在大括...

nginx 使用 proxy_pass 代理 请求转发

例如本地80端口Nginx代理8088端口服务,同样是访问 http://127.0.0.1/endian/look配置1:location /endian/ {proxy_pass http://127.0.0.1:8088;}会访问被代理服务的: http://127.0.0.1:8088/en...

Nginx - 调优 nginx怎么优化

worker调优worker是Nginx的进程,一个worker理论上可以处理几万个请求,为了更好利用Nginx的缓存机制,让worker运行在固定的CPU上,从而减少worker切换CPU时造成的性能消耗。worker的数量并不是越多越好,worker的数量一般配制与物理CPU的物理核心数相同。C...