从点亮LED了解51单片机工作过程

一、

1、简介

发光二极管light-emitting diode,简称为LED,是一种常用的发光器件

2、特性

1、带电流的方向只能是从正极流向负极(我们称之为LED的“向前电压”),这时候LED会发光。

2、只要电压够大,任何大小的电流都会无限制地从电路中流经LED。这个通过LED的电流称为“正向电流”

3、其他相关

3.1 电阻值计算:
根据欧姆定律:U(电压v) = I(电流A)R(电阻Ω) 通过调节这个电阻值,我们就可以准确控制LED通过的电流达到安全的值。
3.2 LED可承受电流(常见):
颜色电流mA
红色20-30mA
绿色20mA
蓝色20mA
白色10-20mA
黄色20mA

二、亮灯

1、步骤

1.1 查看主板

一般在主板上会有丝印标号或者丝印描述,如下图:
在这里插入图片描述

1.2 打开原理图,查找丝印:

会搜索到对应的模块如下图:MCU原理图和LED原理图:

在这里插入图片描述
在这里插入图片描述

1.3 分析原理图:

1、图LED模块中,VCC代表电源正极,根据前面了解到的LED的特性,使得电流从正极流向负极,即可发光。

2、也就是使得红框中的部分输出低电平即可点亮LED灯

3、图中红框的标号称之为网络标号,代表与另一部分(MCU或其他芯片)之间相连接

4、最终找到了MCU中P2引脚,即P2.0—P2.7对应LED模块红框中的部分,那么也就是让这几个引脚的值等于0即可

1.4 思考

为什么要加电阻?

1、LED跟普通二极管不同的地方在于,只要电压够大,任何大小的电流都会无限制地从电路中流经LED。比如你直接给LED接5V电源,会有很大电流流过LED,远远超过LED所能承受的最大电流。这种大电流会在短时间内就将LED烧毁。

2、所以我们需要一个电阻来限制通过LED的电流,保证电流不会超过LED的最大额定电流值。这个通过LED的电流称为“正向电流”。

3、这个用来限流的电阻就连在LED的正极和电源正极之间(也就是LED的向前路径),根据欧姆定律,调节这个电阻值,我们就可以准确控制LED通过的电流达到安全的值。

2、编码

2.1 方式一:8个灯一起控制
#include "REG52.H"

void main()
{
    /*
    1、P2可以理解为C中的库函数,包含了头文件即可
    */
    P2 = 0xFE; // 8个灯一起控制:1111 1110
    while(1);//这样程序会一直执行
}
2.2 方式2:一位一位控制
#include "REG52.H"
//定义位变量的关键字sbit
sbit LED = P2^0;//定义一个位变量LSB(Least Significant Bit, 最低有效位),映射到端口P2的第0位上。

void main()
{
    while(1)//这样程序会一直执行
    {
        LED = 0; 
    }
}

3、分析

3.1 初始状态

在这里插入图片描述

3.2 汇编代码解析
编号指令所在地址机器码汇编指令功能
1C:0x000002表示LJMP长跳转指令;0003表示跳转目标地址LJMP C:0003跳转到地址0x0003处
2C:0x000378表示MOV指令的机器码,7F是立即数#0x7F的编码MOV R0,#0x7F将立即数0x7F移动到寄存器R0中
3C:0x0005E4 - 指令的机器码,E4表示CLR A指令CLR A清空累加器A中的数据,将A设置为0
4C:0x0006F6表示MOV @Ri,数据指令MOV @R0,A将累加器A中的数据移动到地址寄存器R0间接指向的存储单元中
5C:0x0007D8表示DJNZ指令,FD是相对跳转偏移量DJNZ R0,C:0006寄存器R0的值减1,如果减一后的值不为0,则跳转到C:0006地址执行
6C:0x000975 - MOV直接寻址指令的机器码编码
81 寄存器SP在内存中的映射地址0x81
立即数源操作数0x07
MOV SP(0x81),#0x07将16进制立即数0x07写入到内存地址0x81这个位置中
7C:0x000C02000F - 机器码,表示无条件长跳转LJMP指令,000F为跳转目标地址LJMP main(C:000F)无条件地跳转到主函数main的开始地址0x000F处
8C:0x000FC2表示CLR位寻址指令,A0为端口地址CLR led(0xA0.0)端口P2.0对应的引脚复位为0电平
9C:0x001180表示SJMP短跳转,FC是目标地址的相对偏移量SJMP main(C:000F)无条件地跳转回地址为0x000F的main()函数,再次执行用户编写的C代码
3.3 汇编指令解析
1、为什么跳转到0x0003
1.1 51单片机的程序执行是从预定的地址0x0003开始的,为了与中断向量表保持一致的编程习惯。
1.2 中断查询次序表

在这里插入图片描述

2、r0的初始值为什么0x7F
2.1 命令使用了直接寻址的方式操作立即数,所以应该查看数据存储区的直接寻址区	 

2.2 51单片机数据存储器SRAM分为低128RAM、高128RAM和特殊功能寄存器区

2.3 高128RAM区只能使用间接寻址,低128RAM既可以间接也可以直接,特殊功能寄存器区只能使用直接寻址

2.4 综上所述,我们不需要使用特殊寄存器,所以,选择低128RAM区
在这里插入图片描述
2.5 从数据存储器结构看,7F正好指向RAM最顶端,这样后面利用R0作为指针,通过减一操作,可以逐个字节遍历整个RAM区域

3、低128RAM解析
地址作用
0x00-0x07:寄存器组存放R0-R7 和B这些寄存器本身的内容,是CPU直接访问使用的工作寄存器
0x08-0x1F:位地址able区域每个字节位都可以直接位寻址访问,通常映射一些I/O口或状态位
0x20-0x2F:直接寻址的控制寄存器SCON,SBUF,PCON,IP等控制类寄存器,通过直接寻址控制外设或中断系统
0x30-0x7F:通用数据RAM区域存放主程序的变量和数据,也是堆栈溢出的接收区域
3.1 直接寻址的控制寄存器
3.1.1 51单片机本身就自带一些控制用的寄存器,比如串口控制寄存器SCON。

3.1.2 这些寄存器实际上是存在于CPU内核里的,也可以理解为一种特殊的内部存储空间。

3.1.3 为了让我们更方便地访问这些内核寄存器,51单片机把一些寄存器的地址,与RAM内部的某些地址进行了一对一映射绑定。

3.1.4 就像建立了一张地址转换表。当我们访问RAM指定地址时,会自动转换到对应的寄存器上
3.2 位地址able区域
3.2.1 这个区域的每个字节,都被进一步分割成了8个比特位

3.2.2 每个比特位都可以通过位寻址独立访问,而不是把整个字节作为一个整体来读写。

3.2.3 正常RAM区域: 可能要先读出一个字节,修改这个字节的bit0位置1,然后写回整个字节。

3.2.4 位地址able区域: 直接向内存地址0x08写一个1,那么与之映射的P1.0就被置高电平,非常简单直观。例如:sbit LED = P2^0;
3.3 寄存器组
3.3.1 这部分与CPU内部的8个通用寄存器R0-R7映射在一起,地址0对应R0,地址7对应R7。

3.3.2 读或者写这8个RAM地址,就是访问对应的R0-R7寄存器本身,所以这一部分与通用工作寄存器直接绑定在一起

3.3.3 R0-R7这些通用寄存器在8051CPU架构中都是8位宽度的1字节寄存器,是8位

3.4 最终状态

灯亮,寄存器R0清零
在这里插入图片描述

三、总结

在这里插入图片描述
在这里插入图片描述

结合内部结构图和P2工作原理图,总结过程如下:

1、上电后,晶振开始振荡,发生时钟信号。复位电路检测到上电状态,向CPU发送一个复位脉冲。
2、CPU内部状态机进入复位模式,程序计数器PC、指令寄存器IR以及其他寄存器的值被清零。
3、复位信号释放后,PC从0000H地址送出读存储器信号,于是程序恢复执行流程。
4、指令从外部Flash存储器或者内置ROM取得,通过数据总线送入至IR。
5、CPU中的指令译码器对IR进行解码,生成控制口线信号,以及微操作所需要的时序信号。
6、当执行到IO口访问指令时,地址译码器根据指令确定需要访问的端口寄存器地址。
7、CPU通过内部地址总线和数据总线向此端口寄存器写入控制字。
8、端口控制字经过Buffer传送到端口锁存器中进行暂存。
9、锁存器同步驱动各端口位的输出驱动器,决定相应端口引脚的输出高低电平。
10、此时外部LED会随着端口位的电平变化而熄灭或点亮。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值