Ⅰ 什么是单片机的寄存器
寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。 寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。 例如,x86 指令集定义八个 32 位元寄存器的集合,但一个实作 x86 指令集的 CPU 可以包含比八个更多的寄存器。 寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 http://ke..com/view/6159.htm
Ⅱ 单片机寄存器的定义
寄存器中存放的机器码是用来控制各个管脚的
因此我们常常要在寄存器中写入初值或者在程序运行中写入
寄存器有固定地址的(01代码)
但是我们在用的时候不用01代码来写入
因为我们也记不住
所以单片机事先已经定义好了相应的可读的代码供我们使用
比如:在单片机中总中断为IE中的EA
其实EA是一个寄存器单元或者说它就代表了那个单元
我们如果相对那个寄存器操作只需要对EA就行了
比如EA=1,则总中断打开
我们不知道原始的地址01代码究竟是多少
就算知道也没有用
因为无论C语言还是汇编都不能在01代码的地址上写入值的
Ⅲ pic单片机a0以后得寄存器地址怎么定义
MPLAB开发环境中,包含各种PIC系列单片机的头文件,我在理解头文件中关于寄存器位地址定义时绕了些弯路,所以特意写出来加强记忆。
以LATA寄存器为例:在pic16f1938.h头文件中,关于LATA寄存器的定义如下
// Register: LATA
volatile unsigned char LATA @ 0x10C;
// bit and bitfield definitions
volatile bit LATA0 @ ((unsigned)&LATA*8)+0;
volatile bit LATA1 @ ((unsigned)&LATA*8)+1;
volatile bit LATA2 @ ((unsigned)&LATA*8)+2;
volatile bit LATA3 @ ((unsigned)&LATA*8)+3;
volatile bit LATA4 @ ((unsigned)&LATA*8)+4;
volatile bit LATA5 @ ((unsigned)&LATA*8)+5;
volatile bit LATA6 @ ((unsigned)&LATA*8)+6;
volatile bit LATA7 @ ((unsigned)&LATA*8)+7;
一、代码解析
1. “@”符号
在很多嵌入式编译环境中,"@"符号表示“将符号左边的变量钳制在符号右边的地址” 。
C语言中本来是没有“@”符号的,但在MPLAB编译环境里,“@”相当于汇编中的“EQU”伪指令,即
C语言代码:
LATA @ 0x10C
等价于汇编指令:
LATA EQU 0x10C
用自然语言表述,就是:char型变量LATA的值,存放在字节地址为“0x10C”的内存空间。
2. “LATA0 @ ((unsigned)&LATA*8)+0”语句
① 在C语言中,“unsigned”是“unsigned int”的简写, 在这句代码中的作用是强制类型转换,即:将“&LATA*8”的结果强制类型转换为无符号整型;
② “&LATA*8”语句,由于取地址符“&”的优先级高于乘号“*”,所以这句代码的意思是:取LATA的地址“0x10C”,并将这个值乘以8。从二进制角度来看,就是将“00 0001 0000 1100”左移3位。(其中的二进制数,是由“0x10C”转换而来,由于PIC16F1938的地址总线宽度是14位的,所以该二进制数只能有14位。) 左移之后,结果是“00 1000 0110 0000”(0x860);
于是,“((unsigned)&LATA*8)+0”语句的运算结果就是“0x860”。
用自然语言表述该语句的执行结果:bit型变量LATA0的值,存放在位地址为“0x860”的内存空间。
二、验证
接下来,就该验证一下LATA0的位地址是不是“0x860”了。
既然已经知道了LATA寄存器的字节地址是0x10C,那只要计算一下它的位地址就好:
十六进制(0x10C)—> 十进制(268)
十进制(268 × 8 = 2144) —> 十六进制(0x860)
即LATA0的位地址是“0x860”,和代码的执行结果一致。
至此,位地址定义代码解析结束,重点是要了解位地址的计算方法。
Ⅳ 单片机寄存器是什么
寄存器是中央处理器内的其中组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
寄存器(Register)
寄存器是内存阶层 中的最顶端,也是系统操作资料的最快速途径。寄存器通常都是以他们可以保存的 位元 数量来估量,举例来说,一个 "8 位元寄存器" 或 "32 位元 寄存器"。寄存器现在都以寄存器档案 的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存 以及在数种机器上的其他方式来实作出来。
寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 "架构寄存器"。
例如,x86 指令及定义八个 32 位元寄存器的集合,但一个实作 x86 指令集的 CPU 可以包含比八个更多的寄存器。
寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
寄存器的用途:
1.可将寄存器内的数据执行算术及逻辑运算。
2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。
3.可以用来读写数据到电脑的周边设备。
Ⅳ 51单片机中如何用C语言自定义一个寄存器,求大神帮忙
寄存器是CPU内部重要的数据存储资源,主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间,也就是说CPU操作寄存器比操作内存快(寄存器是直接存取,而内存是寻址存取)。
汇编比C语言效率高,经常操作寄存器也是一个原因吧。
C语言可以把变量定义为寄存器类型的,将数据直接存放在CPU的寄存器中,使用关键字register定义变量。
例如register a=123;定义a为寄存器类型变量。
使用register定义的变量尽可能存放到寄存器中,但不绝对。
Ⅵ 单片机中特殊功能寄存器的定义与初始化的区别
这两者的区别大了呀。。。
SCON寄存器在单片机中的地址是0x98...
sfr
SCON=ox98,是一个特殊寄存器的定义,也就是告诉你SCON的地址是0x98.当然这个是你目前不用考虑的。因为头文件(reg52.H等,就是在编写程序开头写的那个)都已经写好了。可以打开keil->c51->ASM->reg52.INC查看。。里面都是寄存器的定义。
SCON=0x52。。首先SCON寄存器的标志位有:
SM0,SM1,SM2,REN,TB8,RB8,TI,RI.
SCON=0X52,其实就是定好标志位的值。相当于:
SM0=0;
SM1=1;
SM2=1;
REN=0;
TB8=0;
RB8=0;
TI=1;
RI=0;
也可以写成上述形式,因为SCON地址可以被8整除(凡是地址可以被8整除的都可以位寻址),可以位寻址(即可以一个个位的赋值)
希望采纳,如有不懂,可以HI我。。。
Ⅶ C语言中,如何定义单片机的寄存器
1.
位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在
C
语言中,也就不能用指针来操作。所以不能定义单片机的寄存器。
2.
访问寄存器可以通过直接地址引用来完成。
例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
可以定义一个访问Rn的函数
typedef unsigned char uchar;
uchar dacRn(uchar n) //n=[0..7]
{
uchar data *p;
n += (PSW & 0x18); //PSW 7:CY 6:AC 5:F0 4:RS1 3:RS0 2:OV 1:F1 0:P
//本来要右移三位变为0-3,但由于是8个一组要乘以8(左移3位),所以直接加上寄存器编号就可以了
return *(uchar data *)n;
}
Ⅷ 单片机 sfr定义
P0~P3、PSW、ACC等这些寄存器在sfr中的地址,是intel设计MCS-51单片机时就定下的。后来许多厂家生产51单片机时都沿用了这定义,以保证程序的兼容性。 至于如下的寄存器 sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频 sfr P0M1 = 0X93; sfr P0M0 = 0X94; sfr P1M1 = 0X91; sfr P1M0 = 0X92; sfrP2M1 = 0X95; sfrP2M0 = 0X96; 是STC生产的单片机,因为加入了自己设计的功能选项,所以就增加了这些寄存器。
Ⅸ C语言中,如何定义单片机的寄存器
位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 C 语言中,也就不能用指针来操作。所以不能定义单片机的寄存器。
访问寄存器可以通过直接地址引用来完成。
例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
可以定义一个访问Rn的函数
typedefunsignedcharuchar;
uchardacRn(ucharn)//n=[0..7]
{
uchardata*p;
n+=(PSW&0x18);//PSW7:CY6:AC5:F04:RS13:RS02:OV1:F10:P
//本来要右移三位变为0-3,但由于是8个一组要乘以8(左移3位),所以直接加上寄存器编号就可以了
return*(uchardata*)n;
}
Ⅹ 单片机中什么是寄存器
寄存器是指由基本的RS触发器结构衍生出来的D触发,
类似于内存,可以存数据,但一般比内存操作更容易,
一般可直接位操作速度更快,而内存追求的是高密度,
低成本低功耗