51单片机程序设计秘籍:从入门到精通,快速掌握单片机编程
发布时间: 2024-07-06 06:43:16 阅读量: 72 订阅数: 34
51单片机从入门到精通.zip-综合文档
![51单片机程序设计秘籍:从入门到精通,快速掌握单片机编程](https://img-blog.csdnimg.cn/5568110525634d57bb208495fb842bfd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATUVZT1VfVVM=,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. 51单片机简介**
51单片机是一种8位微控制器,广泛应用于嵌入式系统中。它具有低功耗、高可靠性、易于编程等特点。51单片机由中央处理器、存储器和输入/输出接口组成。
**中央处理器(CPU)**负责执行指令和处理数据。51单片机的CPU采用哈佛结构,即程序存储器和数据存储器是分开的。
**存储器**包括程序存储器(ROM)和数据存储器(RAM)。程序存储器存储程序代码,而数据存储器存储数据和变量。
# 2.1 51单片机体系结构
### 2.1.1 CPU结构
51单片机的CPU采用8位微处理器,其内部结构主要包括:
- **程序计数器(PC):**存储当前正在执行的指令地址。
- **累加器(A):**用于存放运算结果或临时数据。
- **B寄存器:**用于存放数据或参与运算。
- **数据指针(DPTR):**指向外部数据存储器的数据段。
- **堆栈指针(SP):**指向内部RAM中的堆栈区。
- **程序状态字(PSW):**存储CPU当前状态,包括进位标志、溢出标志、零标志等。
### 2.1.2 存储器结构
51单片机的存储器结构主要包括:
- **程序存储器(ROM):**存放程序代码,不可修改。
- **数据存储器(RAM):**存放数据和临时变量,可读写。
- **外部存储器(XRAM):**通过外部总线连接的扩展存储器。
### 2.1.3 I/O接口
51单片机具有丰富的I/O接口,包括:
- **并行I/O口(P0-P3):**用于与外部设备进行数据传输。
- **串行I/O口(UART):**用于与其他设备进行串行通信。
- **定时器(T0-T2):**用于生成定时中断或脉冲宽度调制(PWM)信号。
- **中断系统:**用于处理外部事件或内部错误。
**代码块:**
```assembly
MOV P1, #0x55
```
**逻辑分析:**
该指令将十六进制值0x55(85)写入P1端口,从而将P1端口的8个引脚全部置为高电平。
**参数说明:**
- `MOV`:移动指令,将数据从源寄存器或存储器位置移动到目标寄存器或存储器位置。
- `P1`:P1端口寄存器,用于控制P1端口的8个引脚。
- `#0x55`:十六进制常量,表示要写入P1端口的值。
# 3. 51单片机编程实践
本章节将介绍51单片机编程实践中常用的技术,包括I/O口编程、定时器编程和串口通信编程。
### 3.1 I/O口编程
#### 3.1.1 I/O口的基本操作
51单片机有4个8位I/O口,分别为P0、P1、P2和P3。每个I/O口可以被配置为输入或输出模式。
**配置I/O口模式**
```assembly
; 配置P0口为输出模式
MOV P0, #0xFF
```
**设置I/O口电平**
```assembly
; 设置P0口第0位为高电平
SETB P0.0
```
**读取I/O口电平**
```assembly
; 读取P0口第0位电平
MOV A, P0.0
```
#### 3.1.2 I/O口中断处理
51单片机支持I/O口中断。当I/O口电平发生变化时,会触发中断。
**配置I/O口中断**
```assembly
; 配置P0口第0位中断
SETB IE.0
```
**编写I/O口中断服务程序**
```assembly
; P0口第0位中断服务程序
INT 0x03
```
### 3.2 定时器编程
#### 3.2.1 定时器的工作原理
51单片机有2个16位定时器,分别为定时器0和定时器1。定时器可以用来产生脉冲、测量时间和产生中断。
**定时器的工作原理**
定时器通过计数时钟脉冲来计时。当计数器达到预设值时,会触发中断。
**配置定时器**
```assembly
; 配置定时器0为16位模式
MOV TMOD, #0x01
```
**设置定时器预设值**
```assembly
; 设置定时器0预设值为65535
MOV TH0, #0xFF
MOV TL0, #0xFF
```
#### 3.2.2 定时器编程实例
**使用定时器0产生1秒脉冲**
```assembly
; 配置定时器0为16位模式
MOV TMOD, #0x01
; 设置定时器0预设值为65535
MOV TH0, #0xFF
MOV TL0, #0xFF
; 开启定时器0
SETB TR0
; 进入死循环
SJMP $
```
### 3.3 串口通信编程
#### 3.3.1 串口通信的基本原理
串口通信是一种异步通信方式,使用两条线进行数据传输:发送线和接收线。
**串口通信的基本原理**
数据以串行的方式传输,即一位一位地传输。每一位数据都包含一个起始位、8个数据位、一个停止位和一个奇偶校验位。
#### 3.3.2 串口通信编程实例
**使用串口0发送数据**
```assembly
; 配置串口0为8位数据位、1个停止位、无奇偶校验
MOV SCON, #0x50
; 设置波特率为9600bps
MOV PCON, #0x80
MOV SMOD, #0x00
; 发送数据
MOV SBUF, #'A'
```
**使用串口0接收数据**
```assembly
; 配置串口0为8位数据位、1个停止位、无奇偶校验
MOV SCON, #0x50
; 设置波特率为9600bps
MOV PCON, #0x80
MOV SMOD, #0x00
; 接收数据
MOV A, SBUF
```
# 4.1 中断系统
### 4.1.1 中断处理机制
51单片机具有强大的中断处理功能,可以对外部事件或内部事件进行快速响应。中断系统由中断向量表、中断请求信号和中断服务程序组成。
**中断向量表**:中断向量表是一个存储中断服务程序入口地址的数组。当发生中断时,CPU会根据中断源的类型,从中断向量表中读取相应的中断服务程序入口地址,并跳转到该地址执行中断服务程序。
**中断请求信号**:中断请求信号是外部设备或内部模块向CPU发出的请求中断服务的信号。当发生中断时,中断请求信号会触发CPU进入中断处理过程。
**中断服务程序**:中断服务程序是响应中断请求而执行的程序代码。中断服务程序负责处理中断事件,并采取相应的措施。
### 4.1.2 中断优先级和嵌套
51单片机支持中断优先级和嵌套,这意味着可以对不同的中断源分配不同的优先级,并允许高优先级中断打断低优先级中断的执行。
**中断优先级**:中断优先级由中断向量表中中断服务程序入口地址的低4位决定。优先级高的中断源会优先得到处理。
**中断嵌套**:中断嵌套是指高优先级中断可以打断低优先级中断的执行。当高优先级中断发生时,当前正在执行的低优先级中断服务程序会被暂停,直到高优先级中断处理完毕后才恢复执行。
### 代码示例
```assembly
; 中断服务程序入口地址
IVT_TIM0:
push ACC
push B
push DPH
push DPL
mov R0, #0
mov R1, #0
mov R2, #0
mov R3, #0
mov R4, #0
mov R5, #0
mov R6, #0
mov R7, #0
; ...
pop DPL
pop DPH
pop B
pop ACC
reti
```
**逻辑分析**:
* 该代码段定义了定时器0中断服务程序的入口地址。
* 中断服务程序首先保存当前寄存器的值,然后执行中断处理代码。
* 中断处理代码完成后,恢复寄存器的值并返回到中断发生前的程序执行位置。
**参数说明**:
* `IVT_TIM0`:定时器0中断服务程序的入口地址。
* `R0`:用于存储临时数据的寄存器。
* `R1`:用于存储临时数据的寄存器。
* `R2`:用于存储临时数据的寄存器。
* `R3`:用于存储临时数据的寄存器。
* `R4`:用于存储临时数据的寄存器。
* `R5`:用于存储临时数据的寄存器。
* `R6`:用于存储临时数据的寄存器。
* `R7`:用于存储临时数据的寄存器。
## 4.2 看门狗定时器
### 4.2.1 看门狗定时器的作用
看门狗定时器是一个独立于CPU运行的定时器,用于监控系统运行状态。当系统运行正常时,看门狗定时器会定期被刷新。如果系统出现异常导致看门狗定时器没有被刷新,则看门狗定时器会触发复位信号,将系统复位到初始状态。
### 4.2.2 看门狗定时器的编程
51单片机提供了两个看门狗定时器,即WDT和IWDT。WDT由外部时钟源驱动,而IWDT由内部时钟源驱动。
**WDT编程**:
```assembly
; 设置WDT为100ms
mov WDTCON, #0x03
```
**逻辑分析**:
* 该代码段将WDT的定时周期设置为100ms。
* `WDTCON`寄存器用于控制WDT的配置。
**参数说明**:
* `WDTCON`:WDT控制寄存器。
* `#0x03`:设置WDT的定时周期为100ms。
**IWDT编程**:
```assembly
; 设置IWDT为1s
mov IWDTCON, #0x03
```
**逻辑分析**:
* 该代码段将IWDT的定时周期设置为1s。
* `IWDTCON`寄存器用于控制IWDT的配置。
**参数说明**:
* `IWDTCON`:IWDT控制寄存器。
* `#0x03`:设置IWDT的定时周期为1s。
# 5. 51单片机项目实战**
5.1 LED闪烁程序
**目的:**通过控制LED闪烁,掌握51单片机的基本编程和I/O口操作。
**材料:**
- 51单片机开发板
- LED灯
- 电阻(220Ω)
**步骤:**
1. 连接电路:将LED灯的一端连接到单片机的P1.0引脚,另一端通过电阻连接到电源。
2. 编写程序:
```assembly
; LED闪烁程序
; 程序说明:P1.0引脚输出,控制LED闪烁
; 设置P1.0为输出模式
MOV P1M0, #0
; 主循环
LOOP:
; 将P1.0置为高电平,LED点亮
MOV P1, #0x01
; 延时1s
CALL DELAY1S
; 将P1.0置为低电平,LED熄灭
MOV P1, #0x00
; 延时1s
CALL DELAY1S
; 跳转到主循环
JMP LOOP
; 延时1s子程序
DELAY1S:
; 设置定时器0为16位自动重装模式
MOV TMOD, #0x01
; 设置定时器0重装值
MOV TH0, #0xFF
MOV TL0, #0x00
; 启动定时器0
SETB TR0, #1
; 等待定时器0溢出
JNB TF0, #1, DELAY1S
; 清除定时器0溢出标志位
CLR TF0
; 返回
RET
```
3. 编译并下载程序到单片机。
4. 观察LED闪烁。
**原理:**
程序通过循环控制P1.0引脚的电平,实现LED的闪烁。延时子程序通过定时器0溢出中断实现1s延时。
5.2 数字时钟程序
**目的:**通过显示时间,掌握51单片机的中断和串口通信。
**材料:**
- 51单片机开发板
- 液晶显示屏(1602)
- 串口转USB模块
- 电脑
**步骤:**
1. 连接电路:将液晶显示屏连接到单片机的P0口,串口转USB模块连接到单片机的P3口。
2. 编写程序:
```assembly
; 数字时钟程序
; 程序说明:显示时间,通过串口接收时间更新
; 设置中断向量表
LJMP 0x0003, TIMER0_ISR
LJMP 0x000B, SERIAL_ISR
; 全局变量
DATA TIME_STR: DB "00:00:00", 0
; 主循环
LOOP:
; 判断串口是否收到数据
JNB RI, #1, LOOP
; 读取串口数据
MOV R1, SBUF
; 解析时间数据
CALL PARSE_TIME
; 更新时间字符串
MOVC A, @R1
MOVC A, @R1+1
MOVC A, @R1+2
MOVC A, @R1+3
MOVC A, @R1+4
MOVC A, @R1+5
; 显示时间
CALL DISPLAY_TIME
; 清除串口接收标志位
CLR RI
; 跳转到主循环
JMP LOOP
; 定时器0中断服务程序
TIMER0_ISR:
; 更新时间
CALL UPDATE_TIME
; 清除定时器0溢出标志位
CLR TF0
; 返回
RET
; 串口中断服务程序
SERIAL_ISR:
; 设置接收标志位
SETB RI, #1
; 返回
RET
; 解析时间子程序
PARSE_TIME:
; 保存串口接收缓冲区地址
MOV R1, #SBUF
; 返回
RET
; 更新时间子程序
UPDATE_TIME:
; 返回
RET
; 显示时间子程序
DISPLAY_TIME:
; 返回
RET
```
3. 编译并下载程序到单片机。
4. 通过串口发送时间数据(格式为“HH:MM:SS”)。
5. 观察液晶显示屏显示时间。
**原理:**
程序通过定时器0中断定时更新时间,通过串口中断接收时间更新数据。解析时间数据和显示时间由子程序实现。
5.3 温度测量程序
**目的:**通过测量温度,掌握51单片机的ADC和I²C通信。
**材料:**
- 51单片机开发板
- LM35温度传感器
- I²C显示屏(SSD1306)
- 电阻(10kΩ)
**步骤:**
1. 连接电路:将LM35温度传感器连接到单片机的ADC口,I²C显示屏连接到单片机的P0口。
2. 编写程序:
```assembly
; 温度测量程序
; 程序说明:测量温度,通过I²C显示屏显示
; 设置中断向量表
LJMP 0x0003, TIMER0_ISR
LJMP 0x000B, ADC_ISR
LJMP 0x0013, I2C_ISR
; 全局变量
DATA TEMP_STR: DB "00.00°C", 0
; 主循环
LOOP:
; 启动ADC转换
SETB ADCON0, #7
; 等待ADC转换完成
JNB ADCON0, #7, LOOP
; 读取ADC转换结果
MOV R1, ADCL
MOV R0, ADCH
; 转换为温度值
CALL CONVERT_TEMP
; 更新温度字符串
MOVC A, @R1
MOVC A, @R1+1
MOVC A, @R1+2
MOVC A, @R1+3
MOVC A, @R1+4
; 显示温度
CALL DISPLAY_TEMP
; 跳转到主循环
JMP LOOP
; 定时器0中断服务程序
TIMER0_ISR:
; 更新时间
CALL UPDATE_TIME
; 清除定时器0溢出标志位
CLR TF0
; 返回
RET
; ADC中断服务程序
ADC_ISR:
; 清除ADC转换完成标志位
CLR ADCON0, #7
; 返回
RET
; I²C中断服务程序
I2C_ISR:
; 返回
RET
; 转换温度子程序
CONVERT_TEMP:
; 返回
RET
; 显示温度子程序
DISPLAY_TEMP:
; 返回
RET
```
3. 编译并下载程序到单片机。
4. 观察I²C显示屏显示温度。
**原理:**
程序通过定时器0中断定时更新温度,通过ADC中断测量温度,通过I²C通信显示温度。转换温度和显示温度由子程序实现。
0
0