51单片机——程序执行过程(手工汇编)

学习目的:通过具体的任务,了解单片机开发的过程。

涉及到的内容

一、任务要求

指示灯LED4闪烁,亮0.5秒,灭0.5秒,无限循环。

二、针对于硬件的编程

1.确定原理图(清楚LED的硬件位置)

在实际的开发板上确定指示灯LED的实际位置

2.确定硬件上的物理关系(清楚LED的硬件连接关系)

在原理图上确定指示灯LED与单片机端口的连接关系

三、设计步骤

1.用我们自己的语言描述工作流程

1.1 指示灯LED4亮

1.2 延时0.5秒

1.3 指示灯LED4灭

1.4 延时0.5秒

1.5 跳转到1.1步

2.确定硬件连接关系,确定驱动逻辑

2.1 指示灯LED4→P1.5→反相器→限流电阻→指示灯的正极→,指示灯的负极接地

2.2 指示灯LED4亮

P1.5输出低电平,反相后为高电平,电压高于发光二极管的开启电压,亮

忽略掉其他信息,简单来描述,即 P1.5 = 0,亮

汇编语言实现:CLR P15 (清零)

2.2 指示灯LED4灭

P1.5输出高电平,反相后为低电平,电压低于发光二极管的开启电压,灭

忽略掉其他信息,简单来描述,即 P1.5 = 1,灭

汇编语言实现:SETB P15 (置位,把某一位变高)

3.延时子程序

实现方法

  1. 软件延时 与单片机相关 与指令执行周期相关(在工程中这种做法不可取)
  2. 硬件定时 与单片机相关 与硬件定时器相关 均与系统时钟相关
  3. 软硬结合 取长补短

软件延时

3.1 确定系统时钟

[补]周期指令

在51单片机中,执行一条指令的最小单元是12个时钟,即单片机的机器周期是由12个时钟周期构成的。

如果单片机的时钟是12MHz,则机器周期为1us。

3.2 确定指令周期数

这里与单片机的总线位宽有关,单片机的总线位宽是8位,即数据总线是8位,单片机一次只能处理一个字节,1字节可描述的无符号数为0-255。

具体执行过程:

DJNZ是双周期指令,即执行一次用2us。

该过程重复两次即可得到500us,涉及到循环执行。

将上述过程简化后的结果:

汇编语言里的子程序相当于C语言中的函数,子程序后需要有一个RET作为返回。

如何构建子程序?

四、完整的汇编指令

ORG不是汇编指令,是给编译器看的,ORG的作用是将下一条指令安排在所指地址中。

1.程序计数器PC

1)如何读取机器码

(单片机一次只能读取一个字节,这与单片机的总线位宽有关)

2)程序执行的方式

(分析指令和执行指令都是靠硬件电路实现的 )

若要对流程控制,则需要修改PC

修改PC值的方法:

(没有直接修改PC的指令)

2.手工汇编

PC指针的初始值为0000H是由硬件电路决定的,单片机复位后PC值为0,所以程序的入口地址(程序的起始点)就是 0000H 地址。这里安排长跳转LJMP是为了预留出中断服务程序的入口地址。

1)LJMP指令执行的过程:

PC是从 0003H 变成 0100H,而不是从 0000H 变成 0100H。

2)SJMP指令执行过程:

查表可得SIMP的操作码为 80H

使PC值由 010CH 变为 0100H,也就是让 010CH 加上 XH 等于 0100H,即让 0100H 减去 010CH 即可得到 XH,但是短跳转只能提供8位的偏移量,X不可能等于 FFF4,所以翻译出的机器码为 F4H。

(PC是16位的,所以所有的运算都是按16位进行操作)

3)LCALL指令执行过程:

第一次长调用时PC值从 0105H 变成 0400H

第一次返回时PC值从 0408H 变成 0105H

第二次长调用时PC值从 010AH 变成 0400H

第二次返回时PC值从 0408H 变成 010AH

[补] 堆栈指针SP

51单片机的堆栈是向上生成,PC的默认值是07H,该单元永远用不到。

压栈的第一个数是PC的低八位,先保存低八位再保存高八位。

注:本文出自对bilibili 科大老孟手工汇编_004_程序执行过程 内容的学习笔记。

相关推荐
Rock_yzh2 小时前
AI学习日记——参数的初始化
人工智能·python·深度学习·学习·机器学习
CiLerLinux3 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘3 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin3 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远20214 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
bnsarocket5 小时前
Verilog和FPGA的自学笔记1——FPGA
笔记·fpga开发·verilog·自学
今天只学一颗糖5 小时前
Linux学习笔记--insmod 命令
linux·笔记·学习
charlie1145141915 小时前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
丰锋ff5 小时前
2016 年真题配套词汇单词笔记(考研真相)
笔记
楼田莉子5 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习