51单片机bit、sbin、sfr、sfr_16区别分析
完整word版第4章单片机原理课后答案
习题1. C51特有的数据类型有哪些?答:C51特有的数据类型有位型bit、特殊位型sbit、8位特殊功能寄存器型sfr和16位特殊功能。
sfr16寄存器型2. C51中的存储器类型有几种,它们分别表示的存储器区域是什么?答:C51中的存储器类型有6种,分别表示的存储器区域是:data:直接寻址的片内RAM低128B,访问速度快bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata:间接寻址访问的片内RAM,允许访问全部片内RAMpdata:用Ri间接访问的片外RAM低256Bxdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAMcode:程序存储器ROM 64KB空间3. 在C51中,bit位与sbit位有什么区别?答:bit位类型符用于定义一般的位变量,定义的位变量位于片内数据存储器的位寻址区。
定义时不能指定地址,只能由编译器自动分配。
sbit位类型符用于定义位地址确定的位变量,定义的位变量可以在片内数据存储器位寻址区,也可为特殊功能寄存器中的可位寻址位。
定义时必须指明其位地址,可以是位直接地址,也可以是可位寻址的变量带位号,还可以是可位寻址的特殊功能寄存器变量带位号。
4. 在C51中,通过绝对地址来访问的存储器有几种?答:绝对地址访问形式有三种:宏定义、指针和关键字“_at_”。
5. 在C51中,中断函数与一般函数有什么不同?答:中断函数是C51的一个重要特点,C51允许用户创建中断函数。
中断函数用interruptm修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断01——定时/计数器T02——外部中断13——定时/计数器T14——串行口中断5——定时/计数器T2中断函数需要注意如下几点。
(1) 中断函数不能进行参数传递(2) 中断函数没有返回值(3) 在任何情况下都不能直接调用中断函数(4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同(5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容(6) C51编译器从绝对地址8m+3处产生一个中断向量(7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明6. 按给定的存储类型和数据类型,写出下列变量的说明形式。
51单片机数据存储器结构详解
51单片机数据存储器结构详解1、bit是在内部数据存储空间中20h..2fh区域中一个位的地址,这在data的20h以后以字节形式出现,可互相参照。
另外加上8051可寻址的sfr,但刚刚试过,只是00h--7fh起作用,也就是说当数据有变化时颜色变红,以后的从80h到--ffh就不是位寻址区了,是位寻址的特殊寄存器,如涉及到了可位寻址的那11个当然会有反应。
复位后,程序计数器PC的内容为0000H,内部RAM的每个单元的值不确定。
每个功能寄存器的重置值如下:堆栈指针SP的重置值为07h,累加器ACC和寄存器B的重置值为00h,数据指针dptr的重置值为0000H,P0、P1、P2和P3的重置值为0ffh。
其他SFR (如PSW、TCON、tmod、tl0、Th0、TL1和Th1)的重置值也为00h。
2、wave中是低128字节和高128字节(0-7fh),低128字节是片内ram区,高128字节(80-ffh)是sfr(特殊功能寄存器)bit则是位于低128字节的20h..2fh区域,即data的20h..2fh区域3.代码位于0000H中,代码地址介于0ffh和FFH之间。
例如:org5000h标签:在db2h、3bh、43h、66h、5h、6dh、88H之后,代码从5000h变为dB4、data是在0到127之间的一个数据存储器地址,或者加128..255范围内的一个特殊功能寄存器(sfr)地址。
两者访问的方式不同。
实际上由于psw的复位设置psw.3=rs0和psw.4=rs1皆为0,所以通用工作寄存器区就是第0区,所以data的00--07h部分是与reg栏中的r0--r7对应的。
以后的则仅代表低128字节的内部ram。
5.IData是0到255范围内的IData内存地址。
IData与数据重叠128字节。
在某些地方,只有数据代表256字节的片上RAM,扩展数据是0到65535范围内的扩展数据存储器地址。
单片机及应用第3章习题解答
第3章思考题及习题31.C51在标准C的基础上,扩展了哪几种数据类型?答:扩展了4种数据类型(见教材表3-1中最后4行)。
它们分别是:bit、sfr、sfr16和sbit。
2.C51有哪几种数据存储类型?其中数据类型“idata,code,xdata,pdata”各对应AT89S8051单片机的哪些存储空间答:C51有6种数据存储类型data、bdata、idata、xdata、pdata和code。
数据存储类型idata对应片内RAM的256字节。
数据存储类型code对应程序存储区。
数据存储类型xdata对应片外64KB的RAM空间。
数据存储类型pdata对应片外RAM的256字节。
3.bit与 sbit定义的位变量有什么区别?答:bit是用来定义普通的位变量,它的值只能是二进制的0或1。
而sbit定义的是特殊功能寄存器的可寻址位,它的值是可以进行位寻址的特殊功能寄存器的某位的绝对地址,例如PSW寄存器OV位的绝对地址0xd2。
4.说明3种数据存储模式(1)SMALL模式(2)COMPACT模式(3)LARGE模式之间的差别。
答:3种数据存储模式之间的差别如下:(1)SMALL模式。
在该模式下,所有变量都默认位于8051单片机内部的数据存储器,这与使用data指定存储器类型的方式一样。
在此模式下,变量访问的效率高,但是所有数据对象和堆栈必须使用内部RAM。
(2)COMPACT模式。
本模式下的所有变量都默认在外部数据存储器的1页(256字节)内,这与使用pdata指定存储器类型是一样的。
该存储器类型适用于变量不超过256字节的情况,此限制是由寻址方式决定的,相当于使用数据指针@Ri进行寻址。
与SMALL模式相比,该存储模式的效率比较低,对变量访问的速度也慢一些,但比LARGE模式快。
(3)LARGE模式。
在LARGE模式下,所有变量都默认位于外部数据存储器,相当于使用数据指针@DPTR进行寻址。
C51单片机21个特殊功能寄存器
21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。
这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):分别说明如下:1、ACC---是累加器,通常用A表示这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW-----程序状态字。
这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。
它的各位功能请看下表:下面我们逐一介绍各位的用途CY:进位标志。
,如果做加法的话,两数位运算器只能表示到0-255中的运算器是一种8位的运算器,我们知道,88051,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。
这样就没事了。
有相加可能会超过2550CY==1;无进、借位,进、借位,CY )78H+97H(01111000+10010111例:。
51单片机特殊功能寄存器(SFR)介绍
51单片机特殊功能寄存器(SFR)介绍51单片机特殊功能寄存器(SFR)介绍1、21 个寄存器介绍51 系列单片机内部主要有四大功能模块,分别是I/O 口模块、中断模块、定时器模块和串口通信模块(串行I/O 口),如其结构和功能如下图:图151 单片机结构和功能图51 单片机掌握的好坏,其实就是能否正确操作这四个功能模块,而其操作的实质则又是能否对每个模块所对应寄存器的正确操纵。
所以下面重点介绍一下51 系列单片机内部的特殊功能寄存器(简称SFR,以下说明以此代替)。
(关于什么叫特殊功能寄存器,这里先不作介绍,不懂的请查阅51 单片机相关资料。
)51 单片机内部共有21 个SFR,其布局如图2,从图中可以看出,每个SFR 占1 个字节,多数字节单元中的每一位又有专用的位名称。
这21 个SFR 又按是否可以位寻址分为两大部分,ACC、IE、P1 等11 个可以位寻址,SP、TMOD 等不可以位寻址。
图2 51 单片机SFR 布局图2、位寻址解释下面以P1、IE 寄存器(可位寻)和TMOD(不可位发)为例解释一下位寻址。
能位寻址是指能够对它的每一位都可以进行位操作,如图3,如P1 口接8 个灯,灯阳极接正极,阴极接单片机的P1 口的8 个脚。
现在要让接P1 口第1 个引脚的灯亮,程序中可以写P1=0xfe,也可以先定义deng1=P1,即P1 口的第1 位,至于为什么写P1,是因为KEIL 软件规定的,然后deng1=0。
也就是P1=0xfe 和deng1=0 都是可以点亮第一个灯,后者deng1=0 属于位操作,前者P1=0xfe 属于总线操作,也就是8 个引脚一起操作。
图3 8 位灯接线图下面再以IE 寄存器为例进行位操作的解释。
IE 寄存器为中断允许寄存器,如各位的作用。
51单片机bit、sbin、sfr、sfr_16区别分析
bit、sbit、sfr、sfr 16区别分析以及#ifndef的使用2009-11-12 09:081.bit和sbit都是C51扩展的变量类型。
bit和int char之类的差不多,只不过char=8位, bit=1位而已。
都是变量,编译器在编译过程中分配地址。
除非你指定,否则这个地址是随机的。
这个地址是整个可寻址空间,RAM+FLASH+扩展空间。
bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。
一旦用了sbit xxx = REGE^6这样的定义,这个sbit量就确定地址了。
sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
2.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。
它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
3.sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。
利用它可以访问51单片机内部的所有特殊功能寄存器。
如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr P1 = 0x90; //定义P1 I/O 口,其地址90Hsfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义: (1) sbit 位变量名=位地址sbit P1_1 = Ox91;这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.(2) sbit 位变量名=特殊功能寄存器名^位位置sft P1 = 0x90;sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法(3) sbit 位变量名=字节地址^位位置sbit P1_1 = 0x90 ^ 1;这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示.在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位sbit ab12=ab[1]^12;操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。
C51单片机的数据类型
C51单片机的数据类型C51支持C语言的全部标准数据类型,除此之外,还加入了用于特地访问80C51硬件的数据类型,如:bit、sbit、sfr和sfrl6。
这些数据类型在ANSIC中是没有的。
bit:声明位变量,其值为0或1。
sbit:声明可位寻址变量中的某个位变量,其值为0或1sfr:声明特别功能寄存器,地址范围为:0~255。
sfr16:同上,地址范围为0~65535。
C51编译器支持表5-1列出的数据类型。
除了这些变量类型外,变量能被组合到结构、联合和数组中。
兼容ANSIC标准的数据类型可通过指针访问,但扩展的bit、sbit、sfr和sfrl6数据类型专用于访问80C51的特别功能寄存器,故不能通过指针进行访问。
表5-1 C51数据类型数据类型位字节值的范围char81-128~127unsigned char810~255enum162-32768~32767 short162-32768~32767 unsigned short 1620~65535int162-32768~32767 unsigned int160~65535long324-2147483648~2147483647 unsigned long3240~4294967295float324±1.175494E-38~±3.402823E+38 bit1-0,1sbit1-0,1810~255sfr161620~6553580C51有21个特别功能寄存器,它们在片内RAM支配了肯定地址,80C51的芯片说明中已经为它们用预定义标识符起了名字。
C51要做的就是承认这些标识符并将其与肯定地址联系起来。
可以用sfr 与sfr16两种标识符。
例5.1 用sfr数据类型定义特别功能寄存器示例。
sfr SCON = 0x98;/*声明SCON为串口掌握器,地址为0x98*/ sfr P0 = 0x80;/*声明P0为特别功能寄存器,地址为0x80*/sfr TMOD = 0x89;/*声明TMOD为定时器/计数器的模式寄存器,地址为0x89*/sfr PSW = 0xD0;/*声明PSW为特别功能寄存器,地址为0xD0*/ 说明:sfr之后的寄存器名称必需大写,定义之后可以直接对这些寄存器赋值。
C51数据类型
C51数据类型引言概述:C51数据类型是指在C语言中使用的一种数据类型,特指在C51单片机编程中使用的数据类型。
C51是一种广泛应用于嵌入式系统开辟的单片机架构,其数据类型的选择和使用对于编程的效率和性能至关重要。
本文将从五个大点出发,详细阐述C51数据类型的特点和使用方法。
正文内容:1. 基本数据类型1.1 位数据类型:C51中的位数据类型用于表示单个位的值,可以用于对单个引脚进行操作。
常用的位数据类型有bit和sbit,前者用于普通变量,后者用于特殊功能寄存器。
1.2 字符数据类型:C51中的字符数据类型用于表示单个字符的值,采用ASCII 编码。
常用的字符数据类型有char和sfr,前者用于普通变量,后者用于特殊功能寄存器。
1.3 整数数据类型:C51中的整数数据类型用于表示整数值,包括有符号和无符号整数。
常用的整数数据类型有int、unsigned int、short和unsigned short,分别表示有符号整数、无符号整数、短整数和无符号短整数。
2. 扩展数据类型2.1 长整数数据类型:C51中的长整数数据类型用于表示较大范围的整数值,常用的数据类型有long和unsigned long,分别表示有符号长整数和无符号长整数。
2.2 浮点数数据类型:C51中的浮点数数据类型用于表示小数值,常用的数据类型有float和double,分别表示单精度浮点数和双精度浮点数。
2.3 枚举数据类型:C51中的枚举数据类型用于定义一组取值范围有限的符号常量,常用于状态表示和开关控制。
3. 数组和指针3.1 数组:C51中的数组是一种用于存储相同类型数据的集合,可以按照索引访问其中的元素。
数组在嵌入式系统中常用于存储传感器数据和缓冲区。
3.2 指针:C51中的指针是一种用于存储内存地址的变量,可以用于间接访问和修改数据。
指针在嵌入式系统中常用于动态内存分配和函数调用。
4. 结构体和联合体4.1 结构体:C51中的结构体是一种用于存储多个不同类型数据的集合,可以按照成员名访问其中的数据。
51单片机头文件及特殊功能寄存器SFR详解
B0H
P3 端口
A0H
P2 端口
90H
P1 端口
80H
P0 端口
不可位寻址部份寄存器(共 10 个)
81H
堆栈指针
82H
数据指针(低 8 位)
83H
数据指针(高 8 位)
87H
电源控制及波特率选择
89H
定时器方式选择
8AH
定时器 0 低 8 位
8CH
定时器 0 高 8 位
8BH
定时器 1 低 8 位
8DH
定时器 1 高 8 位位
99H
串行数据收/发缓冲器
FFH FFH FFH FFH
07H 00H 00H 0XXX0000H 00H 00H 00H 00H 00H XXXXXXXXB
图 2 51 单片机 SFR 布局图
注意: 在这四大部分中,除 I/O 口操作相关 P1 P2 P3 P4 相对独立外,其它 11 个寄存器使用时通常会相互结合使用,也就 是说中断、定时器和串口通信三者通常会结合起来用,如外部中断时,设置边沿触发还是电平触发需设置 TCON 寄存 器中的 TR0 和 TR1 位,使用定时器时又可能用到中断,而串口通信时设置波特率又直接跟定时器相关。
寄存器地址
寄存器中称
可以位寻址部部份寄存器器(共 11 个)
E0H
累加器器
F0H
乘除法辅助寄存器器
D0H
程序状态字
D8H
中断优先控制
A8H
中断允许控制
98H
串行口控制
88H
定时器控制
1 / 21
复位值
C51单片机21个特殊功能寄存器
21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。
这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):分别说明如下:1、ACC---是累加器,通常用A表示这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A ≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW-----程序状态字。
这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。
它的各位功能请看下表:下面我们逐一介绍各位的用途CY:进位标志。
8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。
这样就没事了。
有进、借位,CY=1;无进、借位,CY=0例:78H+97H(01111000+10010111)AC:辅助进、借位(高半字节与低半字节间的进、借位)。
51单片机特殊功能寄存器SFR介绍
51单片机特殊功能寄存器(SFR)介绍 1、21个寄存器介绍51系列单片机内部主要有四大功能模块,分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口),如其结构和功能如下图:图1 51单片机结构和功能图51单片机掌握的好坏,其实就是能否正确操作这四个功能模块,而其操作的实质则又是能否对每个模块所对应寄存器的正确操纵。
所以下面重点介绍一下51系列单片机内部的特殊功能寄存器(简称SFR,以下说明以此代替)。
(关于什么叫特殊功能寄存器,这里先不作介绍,不懂的请查阅51单片机相关资料。
)51单片机内部共有21个SFR,其布局如图2,从图中可以看出,每个SFR占1个字节,多数字节单元中的每一位又有专用的“位名称”。
这21个SFR又按是否可以位寻址分为两大部分,ACC、IE、P1等11个可以位寻址,SP、TMOD等不可以位寻址。
图2 51单片机SFR布局图2、位寻址解释下面以P1、IE寄存器(可位寻)和TMOD(不可位发)为例解释一下位寻址。
能位寻址是指能够对它的每一位都可以进行位操作,如图3,如P1口接8个灯,灯阳极接正极,阴极接单片机的P1口的8个脚。
现在要让接P1口第1个引脚的灯亮,程序中可以写P1=0xfe,也可以先定义deng1=P1^0,即P1口的第1位,至于为什么写P1^0,是因为KEIL软件规定的,然后deng1=0。
也就是P1=0xfe和deng1=0都是可以点亮第一个灯,后者deng1=0属于位操作,前者P1=0xfe 属于总线操作,也就是8个引脚一起操作。
图3 8位灯接线图下面再以IE寄存器为例进行位操作的解释。
IE寄存器为中断允许寄存器,如各位的作用如图4.其中第7位EA是51单片机5个中断的总开关,如要进入任何一个中断时,需先把EA打开,因为可以进行位操作,此时程序有两种写法:1)IE=0x80(假如其它位为0,即1000 0000),也可以直接写EA=1,后者EA=1即属于位操作。
51单片机共有21个特殊功能寄存器
51单片机共有21个特殊功能寄存器在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。
这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):分别说明如下:1、ACC---是累加器,通常用A表示这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW-----程序状态字这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。
它的各位功能请看下表:4、DPTR(DPH、DPL)--------数据指针可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。
分成DPL(低8位)和DPH(高8位)两个寄存器。
用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作。
5、P0、P1、P2、P3--------输入输出口(I/O)寄存器这个我们已经知道,是四个并行输入/输出口(I/O)的寄存器。
它里面的内容对应着管脚的输出。
6、IE-----中断充许寄存器可按位寻址,地址:A8H●EA (IE.7):EA=0时,所有中断禁止(即不产生中断);EA=1时,各中断的产生由个别的允许位决定●- (IE.6):保留●ET2(IE.5):定时2溢出中断允许(8052用)●ES (IE.4):串行口中断允许(ES=1允许,ES=0禁止)●ET1(IE.3):定时1中断允许●EX1(IE.2):外中断INT1中断允许●ET0(IE.1):定时器0中断允许●EX0(IE.0):外部中断INT0的中断允许7、IP-----中断优先级控制寄存器可按位寻址,地址位B8H●- (IP.7):保留●- (IP.6):保留●PT2(IP.5):定时2中断优先(8052用)●PS (IP.4):串行口中断优先●PT1(IP.3):定时1中断优先●PX1(IP.2):外中断INT1中断优先●PT0(IP.1):定时器0中断优先●PX0(IP.0):外部中断INT0的中断优先8、TMOD-----定时器控制寄存器不按位寻址,地址89H●GATE :定时操作开关控制位,当GATE=1时,INT0或INT1引脚为高电平,同时TCON 中的TR0或TR1控制位为1时,计时/计数器0或1才开始工作。
关于51单片机中的RAM、SFR和位地址的问题
关于51单片机中的RAM、SFR和位地址的问题51单片机中_有_4EH这个位地址。
51单片机片内RAM的20H~2FH,这十六字节,可以按照“位”来寻址。
这里面共有128个“位地址”,分别为00H~7FH。
位地址4EH,是在“字节地址为29H的字节单元”中的第6位。
后记:做而论道搜集了51单片机中片内RAM的使用规范,整理如下。
MCS-51系列单片机片内RAM共有128字节,地址范围为00H~7FH。
在这128字节中,全部都可以按照字节地址进行操作(读、写或运算),直接或间接寻址方式皆可。
在这128字节中,按照使用特点,可以分成三类:工作寄存器区、位寻址区和通用数据区。
片内RAM的使用分类可见表1。
下面按照它们的功能特点,分别加以介绍。
1.工作寄存器区在MCS-51系列单片机的片内RAM中,有四个工作寄存器区,分别称为工作寄存器区0~工作寄存器区3。
每区有八个字节,除了可以用字节地址号码操作之外,还可以用R0、R1…R7为名称对其操作。
用名称进行操作,称为寄存器寻址,指令代码较为简短。
其中R0、R1可以作为间接寻址寄存器,以其中内容作为地址,能够对片内RAM(或片外RAM的256字节)进行间接寻址。
在任何时刻,只能使用一个工作寄存器区。
当前使用那个区,可以通过指令设置PSW中的RS1和RS0来决定。
PSW称为程序状态字,是下面要介绍的特殊功能寄存器。
通过设置RS1和RS0,可以快速切换当前工作寄存器区,适合在不同的程序段中进行保护现场。
当前没有使用的工作寄存器区,不能使用R0、R1…R7等名称,但可以按字节地址对其随意读写。
复位时RS1和RS0皆初始化为0,故此复位后将自动使用工作寄存器区0。
2.位寻址区位寻址区共有16字节,字节地址为20H~2FH,每个字节中的8个“位”,都有一个“位地址”。
共有128个位,“位地址”的范围为00H~7FH。
这个区域中的“字节地址”与“位地址”的对应关系可见表2。
C51的数据类型
C51的数据类型引言概述:C51是一种常用的8位单片机,其数据类型在程序设计中起着至关重要的作用。
了解C51的数据类型对于编写高效、可靠的程序至关重要。
本文将从基本数据类型、扩展数据类型、特殊数据类型、用户定义数据类型和常见数据类型错误等五个方面详细介绍C51的数据类型。
一、基本数据类型:1.1 位类型:bit类型用于表示单个位的数据,只能取0或1两个值。
1.2 字节类型:byte类型用于表示一个字节的数据,取值范围为0到255。
1.3 整型:int类型用于表示整数数据,取值范围为-32768到32767。
二、扩展数据类型:2.1 无符号整型:unsigned int类型用于表示无符号整数数据,取值范围为0到65535。
2.2 长整型:long类型用于表示长整数数据,取值范围为-2147483648到2147483647。
2.3 无符号长整型:unsigned long类型用于表示无符号长整数数据,取值范围为0到4294967295。
三、特殊数据类型:3.1 浮点型:float类型用于表示浮点数数据,可以表示小数。
3.2 双精度浮点型:double类型用于表示双精度浮点数数据,精度更高。
3.3 字符型:char类型用于表示字符数据,取值范围为-128到127。
四、用户定义数据类型:4.1 枚举类型:enum类型用于定义枚举类型,可以为一组数值起别名。
4.2 结构体类型:struct类型用于定义结构体类型,可以将不同类型的数据组合在一起。
4.3 联合类型:union类型用于定义联合类型,不同成员共享同一内存空间。
五、常见数据类型错误:5.1 数据类型不匹配:在赋值或比较时,数据类型不匹配可能导致程序错误。
5.2 数据类型溢出:数据类型溢出可能导致数据丢失或错误计算。
5.3 数据类型转换:数据类型转换时需要注意精度丢失和溢出的问题,避免数据错误。
总结:C51的数据类型包括基本数据类型、扩展数据类型、特殊数据类型、用户定义数据类型和常见数据类型错误。
C51的数据类型
C51的数据类型C51是一种常用的单片机型号,广泛应用于嵌入式系统和微控制器开辟中。
在C51编程中,数据类型是非常重要的概念,它决定了变量在内存中的存储方式和所占用的空间大小。
本文将详细介绍C51的数据类型及其特点。
一、基本数据类型1. 位(bit):C51的最小存储单位是位,它只能存储0或者1。
位类型的变量在内存中占用1位空间。
2. 位域(bit-field):位域是一种特殊的数据类型,它允许将一个字节中的位划分为多个字段,并为每一个字段指定不同的位数。
位域可以节省内存空间,提高程序的执行效率。
3. 字节(byte):字节是C51中最基本的数据类型,它占用8位空间,可以存储-128到127之间的整数。
4. 无符号字节(unsigned byte):无符号字节是字节的一种特殊类型,它只能存储0到255之间的整数。
5. 半字(halfword):半字是由两个字节组成的数据类型,它占用16位空间,可以存储-32768到32767之间的整数。
6. 无符号半字(unsigned halfword):无符号半字是半字的一种特殊类型,它只能存储0到65535之间的整数。
7. 字(word):字是由四个字节组成的数据类型,它占用32位空间,可以存储-2147483648到2147483647之间的整数。
8. 无符号字(unsigned word):无符号字是字的一种特殊类型,它只能存储0到4294967295之间的整数。
二、扩展数据类型1. 长整型(long):长整型是C51中的扩展数据类型,它占用4个字节空间,可以存储更大范围的整数,从-2147483648到2147483647之间。
2. 无符号长整型(unsigned long):无符号长整型是长整型的一种特殊类型,它只能存储0到4294967295之间的整数。
3. 单精度浮点型(float):单精度浮点型是一种用于表示带小数部份的数值的数据类型,它占用4个字节空间,可以存储小数。
51单片机存储器、堆栈、SFR
与中断相关的(2个) IP (Interrupt Priority Register) IE (Interrupt Enable Register)
29
特殊功能寄存器(PC)
程序计数器PC(Program Counter)
电源控制及波特率选择寄存器
串行口控制寄存器
串行数据缓冲寄存器
定时控制寄存器
27
定时器方式选择寄存器
定时器0低8位
定时器0高8位
定时器1低8位
定时器1高8位
与端口相关的(7个)
P0、P1、P2、P3:
四个并行输入/输出口的寄存器。它里面的内容对应着管
脚的输出。
SCON (Serial Control Register)
2.1.2 哈佛结构
◆ 8051单片机与一般微机的存储器配置方 式很不相同。
◆ 51单片机的存储器在物理结构上分为程 5 序存储空间和数据存储空间,共有四个: 片内和片外程序存储空间以及片内和片外 数据存储空间,这种在物理结构上把程序 存储器和数据存储器分开的结构形式称为
哈佛结构。
6
89C51单片机存储器配置
存储器配置(片内RAM)
片内RAM 128字节(00H—7FH)
89C51 128字节
FFH
52子系列才有 的RAM区
80H 7FH
普通RAM区
30H
2FH 20H
位寻址区
1FH 00H
工作寄存器区
FFH SFR分布在 80H-FFH
其中92个位
可位寻址
80H
10
所有的RAM区(包括位 寻址区、工作寄存器 区)都可以用于存放 数据,故也称为数据 缓存寄存器
51单片机特殊功能寄存器(SFR)SBUF使用方法
51单⽚机特殊功能寄存器(SFR)SBUF使⽤⽅法 串⾏⼝中有两个缓冲寄存器SBUF,⼀个是发送寄存器,⼀个是接收寄存器,在物理结构上是完全独⽴的。
它们都是字节寻址的寄存器,字节地址均为99H。
这个重叠的地址靠读/写指令区分:串⾏发送时,CPU向SBUF写⼊数据,此时99H表⽰发送SBUF;串⾏接收时,CPU从SBUF读出数据,此时99H表⽰接收SBUF。
单⽚机串⼝ #include <reg52.h>#include <absacc.h> #define unit unsigned int #define uchar unsigned char uchar date; uchar recFlag;//接收数据标识,0 未接收数据 1 接收数据 void init_serial(); void send(); void receive(); main() { init_serial(); IE=0; //屏蔽中断 while(1) { receive(); send();} } void init_serial() //初始化串⼝ { TMOD=0x20; //定时器T1使⽤⼯作⽅式2 TH1=250; //设置初值 TH0=250; TR1=1; //开始计时 PCON=0x80; //SMOD=1; SCON=0x50; //⼯作⽅式1,波特率9600bit/s,允许接收 TI=1; } void send() { if(TI==1) //检测输出是否READY { if(recFlag==1) //是否接收过数据 { SBUF=date; //发送数据 recFlag=0; TI=0; } } } void receive() { if(RI==1) //检测是否有数据接收 { date=SBUF; //接收数据 recFlag=1; //设置接收标识符 RI=0; } }。
c51单片机变量类型
c51单片机变量类型
C51单片机(通常指的是基于8051内核的单片机)支持多种数据类型,这些数据类型基本上与标准的C语言数据类型相同。
以下是一些常用的数据类型:
1. 基本数据类型:
* `char`: 字符型,占用1字节。
* `int`: 整型,通常占用2字节。
* `float`: 单精度浮点型,通常占用4字节。
* `double`: 双精度浮点型,通常占用8字节。
2. 指针类型:与标准C语言相同,如`int *p;` 表示一个指向整数的指针。
3. 特殊功能寄存器(SFR)类型:这些是针对8051单片机特有的一些寄存器定义的类型,例如`SFR`、`sbit`。
4. 位类型:
* `bit`: 用于定义一个位变量。
* `sbit`: 用于定义可直接寻址的位变量。
5. 数组和结构体:与标准C语言相同,可以定义各种大小和类型的数组和结构体。
6. 联合体(union):与标准C语言相同,用于在相同的内存位置存储不同的数据类型。
7. 枚举类型:与标准C语言相同,用于定义一组命名的整型常量。
需要注意的是,具体的内存大小和字节顺序(大端或小端)可能会根据编译器的设置和目标硬件有所不同。
因此,当你在为特定硬件编程时,最好查阅该硬件的数据手册或参考手册以了解精确的内存布局和字节顺序。
单片机bit类型
单片机bit类型
以下是一些关于单片机bit类型:
1.定义:bit是单片机编程中的一种特殊数据类型,用于定义位
变量。
它只能表示两种状态:0或1。
2.内存分配:bit类型的变量内存地址由编译器在可寻址区动态
分配,而非固定地址。
3.值域:bit类型变量的值域较小,只能取0或1,用于表示两种
状态或逻辑条件。
4.应用场合:bit类型主要用于标志位的定义,适用于需要精确
控制单片机位级操作的场景。
5.与其他数据类型的区别:bit类型与int、char等数据类型相比,
具有更小的值域和特定的应用场景。
它不能用于存储较大的数值或复杂的数据结构。
6.与sbit的区别:bit和sbit都是位类型,但sbit主要用于访问
特殊功能寄存器(SFR)中的位,必须在外部定义全局变量;
而bit既可以在外部定义,也可以在内部定义。
7.使用注意事项:在使用bit类型时,需要确保正确初始化变量,
避免未定义的行为。
同时,由于bit类型变量的内存地址是动态分配的,因此在编写代码时需要注意避免地址冲突或越界访问的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bit、sbin、sfr、sfr 16区别分析
1.bit和sbit都是C51扩展的变量类型。
bit和int char之类的差不多,只不过char=8位, bit=1位而已。
都是变量,编译器在编译过程中分配地址。
除非你指定,否则这个地址是随机的。
这个地址是整个可寻址空间,RAM+FLASH+扩展空间。
bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。
一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。
sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
2.bit位标量
bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。
它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
3.sfr特殊功能寄存器
sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。
利用它可以访问51单片机内部的所有特殊功能寄存器。
如用sfr P1 = 0x90这一句定P1
为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr P1 = 0x90; //定义P1 I/O 口,其地址90H
sfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.
sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,
如8052 的T2 定时器,可以定义为:
sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH
用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.
sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要
用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义: (1) sbit 位变量名=位地址
sbit P1_1 = Ox91;
这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于
80H-FFH 之间.
(2) sbit 位变量名=特殊功能寄存器名^位位置
sft P1 = 0x90;
sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可
寻址位位于特殊功能寄存器中时可采用这种方法
(3) sbit 位变量名=字节地址^位位置
sbit P1_1 = 0x90 ^ 1;
这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示.
在C51
存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单
片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:
unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位
sbit ab12=ab[1]^12;
操作符"^"后面的位位置的最大值取决于指定的基址类
型,char0-7,int0-15,long0-31.
sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:
sfrt 变量名=地址值。
2)符号P1_0 来表示P1.0 引脚。
在C 语言里,如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0 是不是就是P1.0呢?你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C
的关键字sbit 来定义,sbit 的用法有三种:
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR 名称^变量位地址值
第三种方法:sbit 位变量名=SFR 地址值^变量位地址值
如定义PSW 中的OV 可以用以下三种方法:
sbit OV=0xd2 (1)说明:0xd2 是OV 的位地址值
sbit OV=PSW^2 (2)说明:其中PSW 必须先用sfr 定义好
sbit OV=0xD0^2 (3)说明:0xD0 就是PSW 的地址值
因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引脚,如果你愿意也可以
起P10 一类的名字,只要下面程序中也随之更改就行了。
*AT89C51的特殊功能寄存器表请看附录二
4.sfr16 16位特殊功能寄存器
sfr16占用两个内存单元,值域为0~65535。
sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。
5.sbit可录址位
sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。
如先前我们定义了
sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义
sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚
//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;
这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。
通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。
当然您也可以自己写自己的定义文件,用您认为好记的名字。
data表明数据在片内数据存储区;
xdata表明数据在片外数据存储区;
code表明数据在程序存储区;
extern定义的数据是在另外一个模块,当引用其它文件中的变量时要加上extern。
extern 的重要意义在于表明要定义的数据已经在其他地方定义过,此处只是引用,所以编译器不会另外开辟内存。