前言
首先阅读这篇文章需要有 51 单片机 C 语言编程基础(至少要学完定时器)。这篇文章作为我的一个学习笔记,总结我学到的内容,后面在学习的过程中会慢慢补充,如果有错误的地方欢迎大家批评指正
一、CPU架构和指令集
因为这个不是重点内容,咱们这里不讨论,不是很懂的朋友先去看这个视频
https://www.bilibili.com/video/BV1xE411N74Twww.bilibili.com/video/BV1xE411N74T
二、51单片机地址结构
2.1 普林斯顿与哈佛结构
51 单片机采用哈佛结构,共有 4 个物理存储空间:片内 RAM、片内 ROM、片外 RAM、片外 ROM
上面是三个逻辑空间,因为片内片外 ROM 统一编址
片内和片外
我是这么理解片内和片外的。在下面图片中,芯片封装里面的就是片内,芯片封装外面的就是片外
data:片内 RAM 从 0x00~0x7F
idata:片内 RAM 从 0x00~0xFF
pdata:片外 RAM 从 0x00~0xFF
xdata:片外 RAM 从 0x0000~0xFFFF
2.2 程序存储器 - ROM
1、前面说 ROM 统一编址是什么意思呢?
下面这幅图是给 AT89C51 芯片 EA 引脚传入 1(高电平)的情况。此时使用片内 0000H 到 0FFFH 的地址空间和片外 0FFFH 到 FFFFH 的地址空间作为一个 ROM
下面这幅图是给 AT89C51 芯片 EA 引脚传入 0(低电平)的情况。此时不使用片内地址空间,只使用片外 0000H 到 FFFFH 的地址空间作为一个 ROM
如果上面仿真软件看不懂或者电路图不懂的小伙伴可以去看这个视频
https://www.bilibili.com/video/BV1H7411n7AYwww.bilibili.com/video/BV1H7411n7AY
2、注意
1、从上面的寻址能力来看的话,我们知道地址线是 16 根
单片机内部的程序存储器用于存储单片机工作时候的程序,单片机内部专门设置一个 16 位的程序计数器(PC),用于指示下一时刻单片机要执行的程序在 ROM 空间中的地址位置,即可以存储 64Kb 空间大小
2、程序存储器物理上可以分为片内程序存储器和片外存储器,不同单片机型号有不同的片内程序存储器空间大小。我查了网上的一些人说的,现在可能只有片内内存了,也就是下图的这个芯片包含 64KB ROM 内存(我等一会去查芯片介绍)
3、ROM 简介
ROM 是存放程序、表格或常数,且掉电不丢失
也就是说我们写好的程序(见下图)是存在 ROM 里的
4、ROM 的 6 个特殊存储器单元——用于程序引导
0000H | 跳转指令(8位) |
0001H | 跳转指令执行的位置(1) |
0002H | 跳转指令执行的位置(2) |
0003H | 跳转指令(8位) |
0004H | 跳转指令执行的位置(3) |
0005H | 跳转指令执行的位置(4) |
上面的表格中依次记录着跳转指令和他要跳转的地址。
因为地址是 16 位的,而一个地址里面存 8 位,所以我们要用两个内存地址的空间来存放主程序入口地址。我还没有查询 0001H 和 0002H 两个地址拼接的的时候,哪 8 个字节放在高位,所以后面再来完善一下
主程序一般应安排在 0030H 地址以后 (在有中断需要时)
2.3 RAM
1、RAM 和 ROM
51 单片机采用的是哈佛结构,即数据和程序分开,这样可以提高程序的执行速度,如果是 MOV 21H #35H 这样的指令,#35H 是作为一个立即数,是要和指令放在一起的,就是放在了 rom 里,如果是定义了的变量,那么就会放到数据存储器 ram 里,在定义变量的时候,可以通过命令选择变量放到 rom 或是 ram 中
2、RAM 的区域
总共有 256 字节的区域,低 128 位存储的内容如下
用户 RAM 区是用来压栈保护寄存器的数据的。在处理中断的时候要中断当前函数,此时就要保存当前函数中的一些变量的内容,然后跳转到中断处理函数执行。执行完了中断处理函数,把压入到栈中的当前函数产量恢复,从而从断点处继续执行当前函数
高 128 字节存储的内容如下
我们程序里面设置 P0 口输出什么之类的,就是修改这一块的地址存放的内容
3、寻址方式示例代码
三、引脚
3.1 时序电路
时序在上一篇文章中有讲解,这里简单的再介绍一下,上面那个电路给我们单片机产生如下波形的输入
假设这个波是 12HZ,就是 1 秒产生 12 个波峰。经过下面的公式计算,就是 1 秒就是 1 个指令周期,汇编指令有很多,要用的指令周期也不相同,但是都在 1 - 4 周期之中
3.2 复位电路
每次开机或者按下按钮以后就会复位
复位条件:在 RST/VPD 引脚端出现 ≥10ms 时间的高电平 (≥3V) 的状态