前言
《单片机原理与技术》戴胜华老师的教材版本,px4飞控使用的是stm32单片机,学习下单片机技术有利于理解px4的底层代码,单片机教材那么多,选择戴胜华老师的版本是MOOC中有戴老师的版本,B站有大量的视频。
前四章内容分别是
-
单片机概述
-
MCS-51单片机的结构与原理
-
指令系统
MCS-51 单片机的结构与原理
单片机的硬件功能(第一张图)
其中戴老师讲到了三条总线,单片机总共有三条总线BUS(数据总线、地址总线、控制总线):
关于总线的资料来源于网络:
- 数据总线
51 单片机的数据总线为P0 口,P0 口为双向数据通道,CPU 从P0 口送出和读回数据。
- 地址总线
51 系列单片机的地址总线为16 位。
为了节约芯片引脚,采用P0 口复用方式,除了作为数据总线外,在ALE 信号时序匹配下,通过外置的数据锁存器,在总线访问前半周期从P0口送出低8位地址,后半周期从P0 口送出8 位数据。
高8位地址则通过P2 口送出。
- 控制总线
51 系列单片机的控制总线包括读控制信号P3.7 和写控制信号P3.6 等,二者分别作为总线模式下数据读和数据写的信号
具体不懂啊。
CPU内部结构
- 算数运算单元ALU(8 位)
加减乘除,与或非异逻辑运算、循环处理、位处理。
- 寄存器阵列
寄存器就是将二进制数放进去寄存——戴老师
(1)工作寄存器R0~R7(8位)
暂存运算结果和中间结果。
4个工作寄存器区,工作寄存器0区~3区。每个区含8个寄存器R0 ~R7.
同程序状态寄存器PSW的4与3来切换工作寄存器,选用一个工作寄存器区来进行读写操作。
一般使用的工作区寄存器为0区。
(2)累加器Acc(8位)
需要ALU处理的数据和计算结果多数要进过A累加器,即加法需要用到这个寄存器。
(3)寄存器B(8位)
与A配合完成乘除法。也可作为通用的寄存器。
(4)程序状态字PSW
记录目前的程序的状态,有无进位,有无溢出,还有前面说到的工作区地址范围。
(5)数据指针(16位)
这个寄存器怎么变成16位了,反正16位的不是在RAM中,RAM中的地址都只有8位的。
存放片外存储器地址,作为片外存储器的指针。可分为两个8位的寄存器DPH、DLH使用。
(6)堆栈指针SP(8位)
堆栈我理解,大量的数据,中断需要用到这个。
复位时SP=07H(为啥不懂)
(7)程序计数器PC(16位)
程序执行到哪,PC就指向哪里,也可以反过来说。
存储器结构(第二章图)
2^16次方为64K,即16位的地址最大只能用到64k,这就说明为什么ROM和外部存储器最大只能到64K,其中
第二个方框中的上面部分分为两个小框框,但是地址是一样的,戴老师说通过不同的寻址方式(直接寻址、通过寄存器间接寻址)即确定是用的特殊寄存器的地址或者是RAM的地址。
程序存储器
- 在MCS-51中的指令系统仅有两条
MOVC A,@A+DPTR
MOVC A,@A+PC
其中我通过谷歌查询到@为取地址符
- 复位后,程序计数器PC的内容为0000H
其中发现你入口仅有8个单元,需要添加跳转指令。
数据存储器
(1) 从00H~1FH的32B单元是4个工作区寄存器Ri,只选择一组,其他空间作为一般的RAM使用。
(2)地址20H~2FH的16B共128位。是可为寻址的内部RAM区,他们既可字节寻址,也可以位寻址。
(3)剩下的80B只能按字节寻址的内部RAM区,为用户区,MCS51单片机的堆栈安排在内部RAM内,堆栈的深度以不超过内部RAM的空间为限。
疑问:
1.为什么(2)中的地址就可以位寻址,(3)中的便不可以,为什么要这样设置呢。书上讲到他们的位地址定义为00H~7FH,那字节地址也有7FH,他两不会冲突嘛?
2. 为什么(2)中的位地址可以定义为00H~7FH?
专用寄存器
寄存器比较难,表查看p15 2-4,只能使用寻址方式访问。
**疑问:**
1. 为什么具有位寻址能力的特殊功能寄存器正好能被8整除呢,难道是为了1位处理器方便找?
8种寄存器介绍
- 程序计数器
- 累加器A
累加器A是一个最常用的专用的寄存器,属于SFR,大部分的单操作数指令都取自累加器,很多双操作指令数也取自累加器,加减乘除算数运算指令结果也存放在累加器A或者A、B寄存器中。
- 寄存器B
在乘除指令中,用到B寄存器。乘法的指令的两个操作数分别取自A和B,其结果存放在A、B寄存器中。除法指令中,被除数取自A,除数取自B,运算后商数存放于A,余数存放于B.
- 程序状态寄存器PSW
- 堆栈指针SP
堆栈指针SP是一个8位专用寄存器,它指示堆栈顶部在内部RAM块中的位置。复位之后,SP初始化为07H,使得堆栈事实上由08H单元开始,考虑到0BH~1FH单元分别属于工作寄存器1 ~ 3区,应该设置sp的值大些。MCS-51的堆栈是向上生成的。列如(sp)=60H,CPU执行一条调用指令或者响应中断后,PC进栈,PC的低8位送入61H,PC的高8位送入62H。保护数据和断部数据
- 数据指针DPTR
- 端口p0 ~3
- 串行数据缓冲器SBUF
串行数据缓冲SBUF用于存放欲发送或者已经接受的数据,它在SFR块中只有一个字节地址,但在物理上由两个独立的寄存器组成,一个是发送缓冲器SBUF,另一个是接受缓冲器SBUF。当要发送的数据传送到SBUF时,进的是发送缓冲SBUF;接收时,外部来的数据存入接受缓冲器SBUF。
- 定时器
MCS-51单片机有两个16位定时器/计数器T0和T1,它们各由两个独立的8位寄存器组成,共为4个独立的寄存器,即TH0,TL0,TH1,TL1。可以对四个寄存器寻址,但不能把T0或者T1当做一个16位的寄存器。但是我不明白这个是干啥的
外部数据存储器
IO端口
- MSC51 有4个双向的8位并行I/o口:P0~p3
- 每一个口都有一个8位的锁存器
- 复位后他们的初始状态为全“1”。
P0口味三态双向口
三态是(0 1 高阻)线断开了,高阻
P1 …
P2 …
P3…
这个之后慢慢理解
IO的接口要求与负载能力
p0(无上拉电阻)的每位输出可驱动8个LSTTL负载,
P1~P3口(有上拉电阻)可驱动4个LSTTL负载。
复位电路
复位之后的电路
CPU时序
一个晶体两个电容就可以构成时钟电路,一个机器周期12个震荡周期。
CPU引脚功能
工作方式
第三章 单片机指令系统
寻址方式
共有七种寻址方式
1. 立即寻址
该方式 把操作数(立即数)包含在指令节中,在立即数前加上“#”表示立即寻址方式。
2. 直接寻址
寻址空间:
内部RAM的低128字节;
特殊功能寄存器SFR(直接寻址是访问sfr的唯一方式)。
直接寻址是指操作码后面的一个字节是实际操作数地址。
感觉视频里没有讲清楚
3. 寄存器寻址方式
该方式是把操作数存放在指定的寄存器。能实现这种寻址的寄存器有:
R0~R7、A、B、DPTR。(难道其他就不能了吗,好像是只有这些可以用来存储下中间数据)。
4. 寄存器间接寻址
该方式是把操作数的所在地址存放在指定 的寄存器中。
寻址空间为程序存储器。
能实现这种寻址方式的寄存器有R0、R1、DPTR(为啥只有R0~R1可以,其他的不行 了)
5. 相对寻址
6. 位寻址
指令系统
感觉这章讲的很简单
到这我居然能够看懂一点书上的汇编程序例题,_