2024年5月6日发(作者:)

reg51reg52区别

在KEIL中,选择芯片的时候,是不能选STC系列的。

不过,对于STC的任何一个系列,你都可以选择AT89S52系列。

STC系列兼容51系列的单片机,也就是说,51系列的单片机有的功

能STC一般都有。在书写程序的时候,编译器的检错,是不会具体针

对你新建工作程时所选某一块芯片来检错的。虽STC系列兼容

AT89S52的功能。但,有也不同之处,因为现在STC系列的大部分单

片机都对其功能进行了增强。就连STC系列很普通的单片机都扩展了

外部RAM使其数据存储器达到了1280byte 如果你要用到其增强的功

能,那就是学会定义头文件。 万变不离其宗,学会了定义头文件,这

个问题解决了。以下是我这一阵子,对头文件的学习及一些体会。可

以让你少走很多弯路。:

二, reg51.头文件剖析

我们平时写单片机应用程序的时候,所使用的头文件大多都是用

的的reg51.h或是用reg52.h。会写C51的人都会用,但对其头文件

内部的定义有所了解的人确并不多。

下面对其内部做详细解释,方便读者作进一步的了解,并能运用

各类型号的单片机。因为增强型号的单片机的增强功能都是通过特殊

功能寄存器控制。

打开 reg52.h 头文件,会发现是由大量的 sfr ,sbit的声明组成,甚

至于还有sfr16.其实这样的声明都是与单片机内部功能寄存器(特殊功

能寄存器)联系起来的,下面对其做出详细解释

sfr: 声明变量

SFR 声明一个变量,它的声明与其它的C变量声明基本相同,唯

一的区别,SFR在声明的同时为其指定特殊功能寄存器作为存储地址,

而不同于C变量声明的整型,字符型等等由编译器自动分配存储空间。

如reg52.h头文件,第一条声明就是sfr P0 = 0x80;

此处声明一个变量P0,并指定其存储地址为特殊功能寄存器

0x80;,在加入reg52.h头文件后。编写应用程序时P0就可以直接使用

而无需定义,对P0的操作就是,对内部特殊功能寄存器(0x80对应

用MCU的P0口)的操作,可进行读写操作。

如果将第一条声明改为sfr K0 = 0x80; 那么,如果要把单片机的

P0口全部拉低,则不能写P0=0x00;而应保存后再在应用程序中写成

K0=0x00;否则编译器会提示“P0为未定义标识符”

使用方法:

sfr [variable] = [address] //为变量分配一个特殊功能寄存器。

1 等号右边,只能是十进制,十六进制整型的数据常量,,不允

许带操作符的表达式

经典的8051内核支持的SFR地址从0x80H~0xFF 飞利浦

80C51MX系列0x180H~0x1FF

2 SFR不能声明于任何函数内部,包括main函数。只能声明于函

数外。

3 用SFR声明一个变量后,不能用取地址运算符&获取其地址,

编译无法通过,编译器会提示非法操作。

4 有一

点须特别注意,51内核0x80~0xff,为特殊功能寄存器地址区间,但

并不是所有的地址都有定义,如果说你所用的MCU芯片上对于某个地

址没有定义,那么用sfr在定义变量的时候,不要把变量的地址分配到

未定义的特殊功能寄存器上,虽然编译时能通过,用KEIL仿真时貌似

是没有问题,但下载到芯片里运行时,是会出问题的。比如说,向一

个未定义的特殊功能寄存器执行读操作,读出来的就是一个未知的数。

(读者可自行测试,先把串口通信调通,然后做一个简单的人机交互。

读出一个数后,再发给计算机,用串口调试助手或是串口监控查看。

这用方法在仿真的时候很有用。)所以具体那些特殊功能寄存器能够