在开始讲对C51单片机中特殊寄存器(SPR)的定义前,先简单介绍下我们在进行51单片机开发时经常看到的两个关键字"sbit”和"sfr“:
sfr用于将一个单片机的特殊功能寄存器(specialfunctionregister)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(referto)该寄存器
sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。
接着我们以STC系列的51单片机为例简单的了解下单片机的特殊功能寄存器布局,如下:
MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SPR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。
为了能直接访问这些SPR,FranklinC51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适合与对MCS-51系列单片机进行C语言编程,特殊的能寄存器C51定义的一般语法格式如下:
sfrsfr-name=intconstant;
“sfr”是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能寄存器名,“=”后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器“sfr-name”的字节地址,这个常数值的范围必须在SFR地址范围内,位于0x80~0xFF。
例如:
sfrSCON=0x98; /* 串口控制寄存在器地址98H*/
sfrTMOD=0x89; /*定时器/计数器方式控制寄存器地址89H*/
MCS-51系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的“sfr”定义放入一个头文件中,该文件应包括MCS-51单片机系列机型中的SFR定义。C51编译器的“reg51.h”头文件是这样一个文件。
在新的MCS-51系列产品中,SFR在功能上经常组合为16位值,当SFR的高字节地址直接位于低字节之后时,对16位SFR的值可以直接进行访问。例如52子系列的定时器/计数器2就是这种情况。为了有效地访问这类SFR,可使用关键字“sfr16”来定义,其定义语句的语法格式与8位SFR相同,只是“=”后面的地址必须用16位于的SFR的低字节地址,即低字节地址作为“sfr16”的定义地址。例如:
sfr16T2=0xCC/*定时器/计数器2;T2低8位地址为0CCH,T2高8位地址为0CDH*/
这种定义适用于所有的新的16位SFR,但不能用于定时器/计数器0和1。
对于位寻址的SFR中的位,C51的扩充功能支持特殊位的定义,像SFR一样不与标准C兼容,使用“sbit” 来定义位寻址单元。
定义语句的一般语法格式有如下三种:
第一种格式:sbitbit-name=sfr-name^intconstant ;
“sbit”是定义语句的关键字,后跟一个寻址位符号名(该位符号名必须是MCS-51单片机中规定的位名称),“=”后的“sfr=name”中的位号,必须是0~7范围中的数。例如:
sfrPSW=0Xd0; /*定义PSW予寄存器地址为D0H*/
sfrOV=PSW^2; /*定义OV位为PSW.2,地址为D2H/*
sfrCY=PSW^7; /*定义CY位为PSW.7 地址为D7H^*/
第二种格式:sbitbit-name=intconstant^intconstant;
“=”后的intconstant为寻址地址们所在的特殊功能寄存器的字节地址,“^” 符号后的intconstant为寻址位在特殊功能寄存器中的位号。例如:
sbitOV=0Xd0^2; /*定义OV位地址是D0H字节中的第2位*/
sbitCY=0XD0^7; /*定义CY位地址是D0H字节中的第7位*/
第三种格式:sbitbit-name=intconstant;
“=”后的intconstant为寻址位的绝对地址。例如:
sbitOV=0XD2; /*定义OV位地址为D2H*/
sbitOY=0XD7; /*定义CY位地址为D7H*/
特殊功能位代表了一个独立的定义类,不能与其它位定义和位域互换。
了解完了关于特殊功能寄存器的定义,有人又会产生疑问:
我们用sfrP0=0×80表示P0,用sfrSP=0×81表示SP,这个没有歧义。但有疑问的是:假如用sbitP0_1=0×81表示P0口的第一位,那么我想表示SP寄存器的第0位怎么办呢?如果也是定义成sbitSP_0=0×81那么明显会有二义性,编译器理解不了。其实这个问题是不存在的,从图1中可以看出,SPR又可以分为两个区域:可位寻址区和不可位寻址区。可位寻址区的寄存器地址能够被8整除,而不可位寻址区的寄存器地址不满足这一要求。因此例子中的sbitSP_0=0×81对于SP寄存器这是无效的应该写成sfrSP=0x81。
例如:sbitP1^1=0x81;sfrSP=0x81;
它们虽然都引用了同一个地址0×81,但是对于编译器来说,这两者的含义完全不同,前者因为有sfr关键字,所以是字节地址。后者因为是sbit关键字,所以是位寻址,表示的是一个bit。
关键字:MCS51 单片机 特殊功能寄存器
引用地址:
在MCS51单片机中对特殊功能寄存器的C51定义
推荐阅读最新更新时间:2024-03-16 14:54
Microchip发布全新PIC® MCU系列,更多CIP让设计越来越简单
全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)日前推出了旗下最强大的8位PIC® 单片机(MCU)系列——PIC16F15386系列。除了Microchip现有的各个独立于内核的外设(CIP),该系列还包含一个32 MHz高精度内部振荡器以及多种存储功能,比如带有自举程序友好的写保护功能的内存访问分区(MAP),以避免意外重写的发生。器件信息区(DIA)提供受保护的存储空间,以存储唯一器件标识和校准值。PIC16F15386系列还为用户提供了完备的、易于使用的开发体验,借助MPLAB® Xpress与Microchip MPLAB®代码配
[单片机]
51单片机定时器使用经验总结
单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2. 尽量用形像的方法记忆。 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像。 3. TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。其格式为:其中低四位定义定时器/计数器C/
[单片机]
MSP430单片机各种寄存器总结(2)——UCS
第二章 UCS寄存器 2.1 UCSCTL0 上述的两个区域并不需要设置,在配置FFL的时候直接设置成0即可,FLL配置完成后会自动被设置。 2.2 UCSCTL1 DCORSEL,DCOCLK的频率范围设置参数,通过它来设置DCOCLK的频率范围,比如:设置DCOCLK的输出频率范围为0.64~14.0MHz 如下图所示,可知设置频率为0.64~14.0MHz的DCO需要将DCORSEL的值设置为3. UCSCTL1 = DCORSEL_3; //DCORSEL_3是宏定义,为0x0030 2.3 UCSCTL2 & UCSCTL3 2.3.1 寄存器示意图 2.3.2 锁频环FLL 上述两个是
[单片机]
高端MCU战火烧到M4:X86仍猛攻,ARM不懈怠
目前基于ARM架构的处理器在移动设备市场额已经超过90%。在服务器市场,微软早在今年第一季度就宣布,将在下一版Windows(8)操作系统中支持ARM微处理器(以前Windows几乎一直是x86的独家操作系统)。ARM势力的扩张已让世人瞩目。 ARM的节节胜利,崛起于各家授权公司的创新和竞争 继飞思卡尔、NXP分别在去年8月、11月推出基于ARM Cortex-M4内核的微控制器产品之后,ST、TI在今年9月也相继发布相应产品,加剧了32位MCU市场的竞争局势。当意法半导体(ST)微控制器市场部经理曹锦东在“MCU!MCU!2011”大会上高调以“最高性能”定义了ST基于Cortex-M4内核的系列产品STM32 F4(它高达168
[手机便携]
MSP430单片机在电力系统中对开关电源控制的设计
1 引言 MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗的混合信号处理器. 由于其超低功耗、强大的处理能力、高性能模拟技术及丰富的片上外围模块、系统工作稳定、方便高效的开发环境得到广大用户的高度评价。本文采用MSP430单片机控制开关电源时期稳定运行。 2 系统设计 本系统采用MSP430F155型号单片机实现对开关电源的稳定控制,主要包括如下几个部分:MSP430核心部分、反馈信号处理部分、信号输出给定部分、控制电路部分、通讯部分及CPU外围电路。系统总体结构如图1所示: 图1 系统总体结构 3 硬件部分设计 3.1 MSP430核心部分 MSP430F155单片机具有非
[单片机]
大众“缺芯停产”,国产MCU能否解燃眉之急?
最近, 大众 汽车因为“关键芯片”缺货导致汽车停产的消息引发热议。中国是汽车生产大国,随着汽车向新能源、智能互联发展, 车载半导体 的使用量急剧增加,缺芯导致停产亦为国内汽车行业敲响了警钟。其中,作为车载半导体最重要的芯片之一 MCU ,状况又是如何?国产 MCU 能否加快替代以解燃眉之急? 汽车芯片水涨船高 随着汽车电子化程度越来越高,汽车的创新也越来越体现在所使用的半导体器件上。 图源 Databeans 据统计,2020 年,全球汽车芯片市场规模预计为 3000 亿元,占全球半导体市场份额约 10%。据测算,未来单车芯片价值将从约 2800 元提升到 12000 元左右。 从一些具体器件的所需数量,可以看出未
[汽车电子]
单片机 12864lcd 滚动显示
#include reg52.h #define Disp_On 0x3f #define Disp_Off 0x3e #define Col_Add 0x40 #define Page_A
[单片机]
基于MSP430单片机的智能网络水表抄表系统设计
随着电子通信与计算机网络技术的发展,远程抄表技术在水、电和煤气计量方面得以推广应用。为适应这个发展方向,在研制出有线远传水表及其数据采集器的基础上,开发了专用的数据集中器,以实现远传水表抄表系统。该系统有三层网络结构:上位机管理系统、集中器和智能网络水表。智能网络水表通过RS-485总线和集中器连接,集中器通过调制解调器MODEM和电话网连接进行远程通讯,将数据通过电话网传输给上位机管理系统,在降低成本的同时提高了数据传输的可靠性。该系统具有良好的伸缩性,同时,上位机管理系统也可以和银行联网,组成四级网络,为后续功能扩展奠定了基础。 1 智能网络水表 智能网络水表的工作原理是在普通转盘计数的水表中加装干簧管和永磁铁
[单片机]