每次写51的东西我都有种恍恍惚惚的不合时宜,2022年了老是写一个8位的单片机。
但是无论怎么说都不能磨灭它传奇的一生,我觉得该写。
我几乎搜集到了现在互联网上所有的关于51的PDF书籍(看完我都要bb一次)假期就干这个事情。
这本虽然老一点,但是写的是真的详细,很不错
其实对于现代的嵌入式开发来看,汇编已经很少见了,但是对于学习来说,理解内在却是一个绕不过的问题。
对了,还有一本讲通信协议的:
这个是一本少见的讲协议的书
看看目录
好了,闲话不多说,开始今天的叭叭。
对于51来说,它真的是一种比较简单的单片机结构
放眼内部,也没有多少东西
可能所有书里面都会出现这些话,那你有没有想过,究竟是什么意思?怎么做到的,我早就说过,计算机就是设计出来的,那这个问题就是变成了,为什么这样设计?
随着体系结构的深入,你会恍然大悟,原来如此。
PSW包含了程序的状态信息,另外在数据手册里面是这样的
对于一个8bit的寄存器,最多只能处理255的数,超出去的数字我们不能丢失信息,所以这里就设计了各种的进位的标志位,就好像是电子的草稿纸一样。
SP就是要时时刻刻地指向待执行地下一个指令地位置,那么你也可以在这里加一个跳转指令来控制你的程序去往任意地地方。
暂且先看这个,说明了是哈佛结构地单片机
就像这样
这是诺伊曼地结构
哈佛架构与冯诺依曼的最大区别在于:
哈佛架构的数据总线,指令总线是分开独立的,CPU通过Icode从Flash中取指令,再译码,得到数据的地址,再通过Dcode总线和SRAM进行数据交互。
哈佛架构的优势: 并行体系结构,将程序指令和数据存储在不同的存储空间中,每个存储器独立编址、独立访问。哈佛架构的微处理器通常具有较高的执行效率,其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令。同时也提供了较大的存储器带宽,各自有自己的总线。
程序存储器就是我们经常说的flash,放用户程序,数据和表格信息
复位后从0000H处开始运行
当然了目前的空间一般是看不见什么外接的flash的,后面的话还比较有用,中断入口都是固定的,都在储存单元。
我问你,数据存储器的缩写是什么?SRAM!!!兄弟。
用来储存程序执行的中间结果,和过程数据,在物理和逻辑上面分为两个地址空间,内部Ram(256字节),内部扩展RAM(1024字节)
这句话还挺关键的,256的RAM分为两个部分,高位和低位,地位是比较自由的部分。但是高位的话是公用了一样的地址映射,但是需要通过不同的寻址方式来取数据。
就像这样,高位和SFR重叠了
低位是这样的
这段就是对这个储存区域的解读了,4个区域,相应的地址。工作区有4组,每组8个8位的工作寄存器,R0-R7,一组不够用哇,用那组使用RS1,RS0控制。
上面空白的地方就是数据缓冲区
这段话解释的更加明朗了,工作寄存器供用户编程使用,临时保存8位信息,一般位寻址是想找到当前的内容情况。用户使用的就是80字节。
特殊功能寄存器的地址排布,这些寄存器互相作用
另外,其实15的片子其实扩展了许多的寄存器。
地址空间分立,需要考虑更多的取值问题。
这里插一段Keli的使用教程:
新建项目,选择STC
写自己的片子
加入启动文件
点击这里新建一共文件
保存成C文件
在这里添加一下
选择刚刚建立的C文件
这个东西比较傻逼,你加完以后这个窗口不关闭,需要自己手动关闭
这个时候应该是这样的
c文件的上面右键插入一个头文件
接着就可以打开了
这里有个疑问,VSCode打开这个东西的时候,屏幕闪的很厉害,我不理解。
这就是头文件封装的地址
记得在设置里面打开hax文件生成
写个简单的函数,编译一下,没毛病
虽然截图是KELI2的版本,但是这么多年了,还是没有变化