【C51单片机入门指南】:揭秘单片机世界,快速上手实战应用
发布时间: 2024-07-08 06:51:20 阅读量: 72 订阅数: 49
![c51单片机应用与c语言程序设计](https://img-blog.csdnimg.cn/20200603214059736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTg3NzQw,size_16,color_FFFFFF,t_70)
# 1. C51单片机简介
C51单片机是英特尔公司推出的一系列8位单片机,具有广泛的应用。它采用哈佛结构,内部集成了CPU、存储器和I/O接口等模块,具有较高的性价比和易用性。C51单片机广泛应用于工业控制、仪器仪表、智能家居等领域。
### C51单片机的特点
- 采用哈佛结构,程序存储器和数据存储器分开
- 8位数据总线,16位地址总线
- 具有丰富的I/O接口,包括并行I/O、串行I/O、中断等
- 支持多种编程语言,包括汇编语言、C语言等
- 功耗低,抗干扰能力强,稳定性高
# 2. C51单片机硬件架构
### 2.1 C51单片机的内部结构
C51单片机内部结构主要包括以下几个部分:
#### 2.1.1 CPU核心
CPU核心是单片机的核心部分,负责执行指令、处理数据和控制整个系统。C51单片机采用8051内核,具有以下特点:
- 8位数据总线
- 16位地址总线
- 单周期指令执行
- 128字节内部RAM
- 4KB内部ROM
#### 2.1.2 存储器
C51单片机具有以下存储器:
- **内部RAM:**128字节,用于存储程序和数据。
- **内部ROM:**4KB,用于存储程序代码。
- **外部存储器:**可通过I/O端口扩展,用于存储更多程序和数据。
#### 2.1.3 I/O接口
I/O接口用于与外部设备进行通信。C51单片机具有以下I/O接口:
- **并行I/O端口:**P0、P1、P2和P3,每个端口有8个I/O引脚。
- **串行I/O端口:**UART0和UART1,用于与串行设备通信。
- **定时器/计数器:**T0、T1和T2,用于生成定时中断和脉冲宽度调制(PWM)信号。
- **中断控制器:**用于管理外部中断和内部中断。
### 2.2 C51单片机的引脚功能
C51单片机共有40个引脚,其功能如下:
| 引脚 | 功能 |
|---|---|
| VCC | 电源正极 |
| GND | 电源负极 |
| XTAL1 | 外部时钟输入 |
| XTAL2 | 外部时钟输出 |
| P0.0-P0.7 | 并行I/O端口P0 |
| P1.0-P1.7 | 并行I/O端口P1 |
| P2.0-P2.7 | 并行I/O端口P2 |
| P3.0-P3.7 | 并行I/O端口P3 |
| RXD0 | 串行接收数据引脚 |
| TXD0 | 串行发送数据引脚 |
| INT0 | 外部中断0引脚 |
| INT1 | 外部中断1引脚 |
| T0 | 定时器0输入/输出引脚 |
| T1 | 定时器1输入/输出引脚 |
| WR | 外部存储器写使能引脚 |
| RD | 外部存储器读使能引脚 |
| PSEN | 外部存储器片选引脚 |
| ALE | 地址锁存器使能引脚 |
### 2.3 C51单片机的时钟系统
C51单片机的时钟系统由以下部分组成:
#### 2.3.1 时钟源
C51单片机有两种时钟源:
- **内部振荡器:**提供一个稳定的时钟信号,频率通常为12MHz或24MHz。
- **外部晶体振荡器:**连接到XTAL1和XTAL2引脚,提供更精确的时钟信号。
#### 2.3.2 时钟配置
C51单片机的时钟配置通过以下寄存器进行:
- **CKCON寄存器:**用于选择时钟源和配置时钟分频器。
- **OSCCON寄存器:**用于配置内部振荡器。
# 3.1 C51单片机汇编语言
#### 3.1.1 汇编语言指令
C51单片机汇编语言指令集丰富,包括数据传送指令、算术指令、逻辑指令、分支指令、位操作指令等。每条指令都有一个助记符和一个操作码,助记符便于记忆,操作码用于机器识别。
| 指令助记符 | 操作码 | 功能 |
|---|---|---|
| MOV | 74 | 将源操作数移动到目标操作数 |
| ADD | 24 | 将源操作数加到目标操作数 |
| SUB | 94 | 将源操作数从目标操作数中减去 |
| MUL | A4 | 将源操作数与目标操作数相乘 |
| DIV | B4 | 将目标操作数除以源操作数 |
| AND | A0 | 对源操作数和目标操作数进行逻辑与操作 |
| OR | B0 | 对源操作数和目标操作数进行逻辑或操作 |
| XOR | E0 | 对源操作数和目标操作数进行逻辑异或操作 |
| JMP | 75 | 无条件跳转到指定地址 |
| JZ | 74 | 如果零标志位为真,则跳转到指定地址 |
| JNZ | 75 | 如果零标志位为假,则跳转到指定地址 |
#### 3.1.2 汇编语言程序结构
C51单片机汇编语言程序由以下部分组成:
* **头文件:**包含预处理器指令和宏定义。
* **数据段:**定义程序中使用的变量和常量。
* **代码段:**包含程序执行的指令。
* **中断服务程序:**处理中断事件的代码。
汇编语言程序结构清晰,便于理解和维护。
```
; 头文件
INCLUDE "C51.H"
; 数据段
DATA_SEGMENT
DATA1: DB 10
DATA2: DB 20
END_DATA_SEGMENT
; 代码段
CODE_SEGMENT
MAIN:
MOV A, DATA1
ADD A, DATA2
MOV R0, A
JMP END
END_CODE_SEGMENT
; 中断服务程序
INTERRUPT_SEGMENT
INT0_ISR:
RET
END_INTERRUPT_SEGMENT
```
**代码逻辑分析:**
* 头文件中包含了C51单片机的头文件,定义了寄存器和指令的符号。
* 数据段定义了两个变量DATA1和DATA2,分别存储了10和20。
* 代码段中,MAIN函数将DATA1和DATA2相加,并将结果存储在寄存器R0中。然后跳转到END标签。
* 中断服务程序INT0_ISR定义了一个中断服务例程,当INT0中断发生时执行。
# 4. C51 单片机开发工具
### 4.1 Keil uVision5
#### 4.1.1 开发环境介绍
Keil uVision5 是 ARM 公司开发的一款集成开发环境(IDE),主要用于单片机和嵌入式系统的开发。它提供了一系列功能,包括代码编辑、编译、调试和仿真。
Keil uVision5 的主要特点包括:
- **直观的界面:**用户友好的界面,易于导航和使用。
- **强大的编辑器:**支持语法高亮、自动完成和代码折叠等功能。
- **高级调试器:**提供单步执行、断点设置和变量监视等调试功能。
- **集成仿真器:**支持使用 ARM 仿真器进行硬件仿真。
- **广泛的设备支持:**支持各种 ARM 和非 ARM 单片机和微控制器。
#### 4.1.2 项目创建和管理
在 Keil uVision5 中创建项目非常简单:
1. **新建项目:**单击“文件”菜单,然后选择“新建”>“项目”。
2. **选择设备:**在“新建项目”对话框中,选择要开发的单片机或微控制器。
3. **配置项目:**设置项目名称、路径和编译器选项。
4. **创建源文件:**添加源代码文件(.c 或 .asm)到项目中。
Keil uVision5 提供了强大的项目管理功能,包括:
- **项目组:**将多个项目组织到项目组中,便于管理。
- **目标管理:**创建和管理不同的编译目标,例如调试版本和发布版本。
- **版本控制:**支持使用 Git 和 Subversion 等版本控制系统。
### 4.2 IAR Embedded Workbench
#### 4.2.1 开发环境介绍
IAR Embedded Workbench 是 IAR Systems 公司开发的一款集成开发环境,专为嵌入式系统开发而设计。它提供了一系列功能,包括代码编辑、编译、调试和仿真。
IAR Embedded Workbench 的主要特点包括:
- **代码编辑器:**功能强大的代码编辑器,支持语法高亮、自动完成和代码折叠等功能。
- **编译器:**优化编译器,生成高效的代码。
- **调试器:**高级调试器,提供单步执行、断点设置和变量监视等调试功能。
- **仿真器:**支持使用 IAR 仿真器进行硬件仿真。
- **广泛的设备支持:**支持各种 ARM、RISC-V 和其他单片机和微控制器。
#### 4.2.2 项目创建和管理
在 IAR Embedded Workbench 中创建项目也很简单:
1. **新建项目:**单击“文件”菜单,然后选择“新建”>“项目”。
2. **选择设备:**在“新建项目”对话框中,选择要开发的单片机或微控制器。
3. **配置项目:**设置项目名称、路径和编译器选项。
4. **创建源文件:**添加源代码文件(.c 或 .asm)到项目中。
IAR Embedded Workbench 提供了强大的项目管理功能,包括:
- **项目组:**将多个项目组织到项目组中,便于管理。
- **目标管理:**创建和管理不同的编译目标,例如调试版本和发布版本。
- **版本控制:**支持使用 Git 和 Subversion 等版本控制系统。
# 5. C51单片机实战应用
### 5.1 LED闪烁程序
#### 5.1.1 程序设计
LED闪烁程序是C51单片机最简单的应用之一,它通过控制LED的亮灭来实现闪烁效果。程序设计如下:
```c
#include <reg51.h>
void main()
{
while(1)
{
P1 = 0x01; // LED亮
delay(500); // 延时500ms
P1 = 0x00; // LED灭
delay(500); // 延时500ms
}
}
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 120; j++); // 120个机器周期约等于1ms
}
}
```
**代码逻辑分析:**
* `main()`函数是程序入口,不断循环执行。
* 在循环中,先将P1端口置为0x01,使LED亮。
* 然后调用`delay()`函数延时500ms。
* 延时结束后,将P1端口置为0x00,使LED灭。
* 再次调用`delay()`函数延时500ms。
* 如此循环,实现LED闪烁效果。
**参数说明:**
* `delay()`函数的参数`ms`表示延时时间,单位为ms。
#### 5.1.2 程序调试
1. 将程序下载到C51单片机中。
2. 连接LED到P1端口。
3. 上电运行程序。
4. 观察LED闪烁效果。
### 5.2 数码管显示程序
#### 5.2.1 程序设计
数码管显示程序可以将数字显示在数码管上,实现数字显示功能。程序设计如下:
```c
#include <reg51.h>
const unsigned char code seg_code[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void main()
{
unsigned char num = 0;
while(1)
{
P0 = seg_code[num]; // 显示数字
delay(500); // 延时500ms
num++;
if(num > 9) num = 0;
}
}
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 120; j++); // 120个机器周期约等于1ms
}
}
```
**代码逻辑分析:**
* `main()`函数是程序入口,不断循环执行。
* 在循环中,先将P0端口置为`seg_code[num]`,显示数字`num`。
* 然后调用`delay()`函数延时500ms。
* 延时结束后,`num`加1。
* 如果`num`大于9,则重置为0。
* 如此循环,实现数码管数字显示效果。
**参数说明:**
* `delay()`函数的参数`ms`表示延时时间,单位为ms。
#### 5.2.2 程序调试
1. 将程序下载到C51单片机中。
2. 连接数码管到P0端口。
3. 上电运行程序。
4. 观察数码管显示数字效果。
# 6.1 C51单片机中断处理
### 6.1.1 中断机制
中断是一种硬件机制,当发生特定事件时,它会暂停当前正在执行的程序,并跳转到一个专门的中断处理程序。中断处理程序执行完后,程序将继续从中断发生点继续执行。
C51单片机有5个中断源:
- 外部中断0 (INT0)
- 外部中断1 (INT1)
- 定时器0溢出中断 (TF0)
- 定时器1溢出中断 (TF1)
- 串口中断 (RI)
### 6.1.2 中断处理程序
每个中断源都有一个对应的中断处理程序。中断处理程序是一个函数,当发生中断时,程序会跳转到该函数。中断处理程序的名称由中断源决定,例如:
- `void interrupt 0`:外部中断0处理程序
- `void interrupt 1`:外部中断1处理程序
- `void interrupt 2`:定时器0溢出中断处理程序
- `void interrupt 3`:定时器1溢出中断处理程序
- `void interrupt 4`:串口中断处理程序
中断处理程序必须遵循以下规则:
- 必须以`void`类型声明
- 必须有一个参数,该参数是一个字节,表示中断源
- 必须使用`interrupt`关键字声明
**示例代码:**
```c
void interrupt 0() {
// 外部中断0处理程序
}
void interrupt 1() {
// 外部中断1处理程序
}
```
### 6.1.3 中断使能和优先级
为了使中断生效,必须在程序中启用它们。可以使用`IE`寄存器启用中断,该寄存器有5个位,每个位对应一个中断源。要启用中断,只需将相应的位设置为1。
中断优先级由`IP`寄存器控制,该寄存器有5个位,每个位对应一个中断源。优先级最高的位是0,优先级最低的位是4。当发生多个中断时,优先级最高的中断将得到处理。
**示例代码:**
```c
// 启用外部中断0
IE |= 0x01;
// 设置外部中断0的优先级为最高
IP |= 0x01;
```
0
0