微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C51—运算量(重点:特殊功能寄存器变量、位变量

C51—运算量(重点:特殊功能寄存器变量、位变量

时间:11-25 来源:互联网 点击:

位类型符有两个:bit和sbit。可以定义两种位变量。

a、bit型位变量

在格式中可以加上各种修饰,但是要注意存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。

例如:

bit bdata a1;

b、sbit型位变量

sbit位类型符用于定义在可位寻址字节或者特殊功能寄存器中的位,定义时需要指明其位地址,可以使位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。

例如(这些东西都在#include"reg52.h"中):

sbit OV=0xd2;

sbit CY=0xd7;

unsigned char bdata flag;

sbit flag_0=flag^0; //字节地址与位号之间、特殊功能寄存器与位号之间一般用“^”作间隔

sfr P1=x090;

sbit P1_1=P1^1;

3、存储模式(个人感觉真的用不到这些东东了,因为你丫的要是嫌小可以换个大的,而且还相当的便宜~~~~,我以前试过扩展一个RAM和ROM,擦不成啊~~)

C51编译器支持3种存储模式:SMALL模式、COMPACT模式和LARGE模式。不同的存储模式对变量默认的存储器类型不一样。

1)SMALL模式

SMALL模式成为小编译模式,在SMALL模式下,编译时函数参数以及变量被默认在片内RAM中,存储类型为data。

2)COMPACT模式

COMPACT模式称为紧凑编译模式,在COMPACT模式下,编译时函数参数和变量被默认在片外RAM的低256B空间,存储类型为pdata。

3)LARGE模式

LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64KB空间了,存储器类型为xdata。

例如:

#pragma small //变量的存储模式为SMALL

char k1; //存储类型为data

int xdata m1; //存储类型xdata

#pragma compact //变量的存储模式为COMPACT

char k2;

int xdata m2;

int func1(int x1,int y1) large //函数的存储模式为LARGE

{

return(x1+y1);

}

int func2(int x2,int y2) //编译的存储模式隐含为SMALL,没有指明模式,隐含SMALL

{

return(x2-y2);

}

4、绝对地址的访问(这里才是重点中的重点啊~~~)

在C51中,可以通过变量的形势访问51单片机的存储器,也可以通过绝对地址来访问存储器。三种方法:

1)使用C51运行库中预定义宏(就是调用#include"absacc.h")

C51编译器提供了一组宏定义来对51单片机的code、data、pdata和xdata空间进行绝对寻址!

规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:

#define CBYTE((unsigned char volatile*)0x50000L) //CBYTE以字节形势对code区寻址

#define DBYTE((unsigned char volatile*)0x40000L)//data区

#define PBYTE((unsigned char volatile*)0x30000L) //pdata区

#define XBYTE((unsigned char volatile*)0x20000L) //xdata区

#define CWORD(unsigned int volatile*)0x50000L) //以字形式对code区寻址

#define DWORD(unsigned int volatile*)0x40000L)

#define PWORD(unsigned int volatile*)0x30000L)

#define XWORD(unsigned int volstile*)0x20000L)

例如:

#include"absacc.h"

#include"reg52.h"

typedef unsigned char uchar;

typedef unsigned intuint;

void main()

{

uchar var1;

uintvar2;

var1=XBYTE[0x0005]; //XBYTE[0x0005]访问片外RAM的0005字节单元

var2=XWORD[0x0002];//XWORD[0x0002]访问片外RAM的0002字单元

.

.

.

while(1);

}

2)通过指针访问

采用指针的访问的方法,可以在C51程序中对任意指定的存储器单元进行访问。

typedef unsigned char uchar;

typedef unsigned int uint;

void func()

{

uchar data var1;

uchar pdata *dp1; //定义一个指向pdata区的指针dp1

uint xdata *dp2; //定义一个指向xdata区的指针dp2,为uint型

uchar data*dp3; //定义一个指向data区的指针dp3,为char型

dp1=0x30; //dp1指针赋值,指向pdata区的30H单元

dp2=0x1000; //dp2指针赋值(uint型),指向xdata区的1000H单元

*dp1=0xff;//将数据0xff送到片外RAM30H单元

*dp2=0x1234; //将数据0x1234(由于是uint型,你懂得~~~),送到片外RAM1000H单元

dp3=&var1; //dp3指针指向data区的var1变量

*dp3=0x20;//给变量var1赋值0x20

}

3)使用C51扩展关键字 _at_ (这个用的最多了~~~

总算完了,我真的要累死了~~~~擦擦擦擦啊

一般格式:

[存储类型] 数据类型说明 变量名 _at_ 地址常量;

其中,存储类型为data、bdata、idata、pdata、xdata等C51能识别的数据类型,如果省略,则会按照存储模式规定的默认存储类型确定变量的存储区域(这里又用到上边的了);数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top