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仿真时貌似
是没有问题,但下载到芯片里运行时,是会出问题的。比如说,向一
个未定义的特殊功能寄存器执行读操作,读出来的就是一个未知的数。
(读者可自行测试,先把串口通信调通,然后做一个简单的人机交互。
读出一个数后,再发给计算机,用串口调试助手或是串口监控查看。
这用方法在仿真的时候很有用。)所以具体那些特殊功能寄存器能够
发布评论