大家是否思考过一个问题,为什么现在的51单片机在做宣传的时候,不外乎都是称作为“增强型51单片机”?与传统的51单片机相比,究竟哪些地方得到了扩展?在回答这个问题之前,我们先来看一下本书的主角——STC8A8K64S4A12。图1是传统51单片机和STC8A8K64S4A12增强型51单片机的资源对比图。
图1 传统MCS-51单片机和增强型51单片机的资源对比图
通过图1的资源对比图我们可以发现,就STC8A8K64S4A12这个增强型51单片机而言,它相比于传统的51单片机主要在以下几个方面做了提升:
增大了数据存储器SRAM;
扩大了供电电压的范围;
增加了机器周期可配置功能,从而避免了外部晶振12分频的问题;
增加了一系列外设。
接着,我们具体来看,这些功能到底是如何实现的。
1、内部数据存储器SRAM的增强单片机要想扩充资源,首先需要做的就是内存的扩展。因为控制这些扩展资源的寄存器,都需要内存地址的依托。另外,传统的51单片机的内存最大只有256字节,我们在开发程序时,用户所定义的变量都存放在这个内存里面,其中还包括了位寻址区,特殊功能寄存器区等我们无法使用的空间,早期的单片机应用,如控制一个开关,处理一个串口命令这些功能还够用,但是随着我们的应用越来越复杂,这么少的内存真是“巧妇难为无米之炊”。因此,内存的扩展非常必要。增强型51单片机的内存扩展,还有一个无法改变的是传统51单片的内存排列,图2列举的MCS-51单片机内部256字节RAM存储分布,因为这个存储分布是和整个51单片机架构息息相关的,无法对其有任何撼动。
图2 传统51单片机的内存排列
增强型51单片机的内存扩展,和传统8051单片机访问外部扩展RAM的方法相同,唯一区别是,传统的51单片在内存扩展之后,P0口和P2口将无法使用,但是增强型51单片机则仍然保留着这两个口的正常功能。由于增强型单片机扩展出来的内存是属于外部存储器扩展,因此如果你对于变量存储的空间有需求,则在编程时需要显示地指明这些变量的存储位置。如果使用汇编语言,则需要使用“MOVX”指令。如果使用C语言,则需要使用“xdata”关键词进行指定,不过为了C语言的可移植性,对于使用这种非标准C语言的关键词,我还是持保留态度。
2、内部程序存储器FlashROM的增强内部程序存储器的扩展方式,也和传统51单片机外部程序存储器的扩展方式类似。但是STC8系列封装管脚为40及以上的单片机,具有扩展64KB外部数据存储器的能力。访问外部数据存储器期间,WR/RD,ALE信号要有效。除此之外,在内部程序存储器被扩大之后,一般增强型51单片机都会在一些特定地址的ROM和RAM之中,存入一些特定的产品信息。图3是STC系列单片机中所保留的一些特定信息。
图3 STC系列单片机中所保留的一些特定信息
3、外设如何扩展传统的51单片机用于控制外设的寄存器地址都是排放在内部RAM的128字节特殊功能寄存器区。这段特殊功能寄存器地址区,传统的8051单片机已经用了一部分用于控制其资源,传统8051单片机特殊功能寄存器区的使用如图4所示。
图4 传统8051单片机的特殊功能寄存器使用传统的
51单片机一共用了21个特殊功能寄存器地址。为了保持与传统8051单片机的兼容,这段特殊功能寄存器原有的资源分配不能改变。因此,使用剩余的107个特殊功能寄存器地址,是外设寄存器扩展的一个途径。如图5所示,STC8数据手册上面列出了STC8的特殊功能寄存器列表。
图5 STC8数据手册列出的特殊功能寄存器列表(1)
图5 STC8数据手册列出的特殊功能寄存器列表(续1)
图5 STC8数据手册列出的特殊功能寄存器列表(续2)
然而,随着外设资源的不断增加,越来越多的外设寄存器需要被编码,原本128字节的特殊功能寄存器区已经用完,想要再扩充资源,只能将这些特殊功能寄存器存放在内部扩展的RAM上面。如图6所示。
图6 内部数据存储器排放的特殊功能寄存器
图6 内部数据存储器排放的特殊功能寄存器(续)