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

发布者:星尘之泪最新更新时间:2015-10-23 来源: eefocus关键字:C51  运算量  特殊功能寄存器  变量  位变量 手机看文章 扫描二维码
随时随地手机看文章
C51就是c语言for 51单片机,这里边还是有很多不同的,在c语言里运算量相信都知道那叫一个简单,直接int, float就哦了[转载]C51—运算量(重点:特殊功能寄存器变量、位变量,当然这里也可以直接int, float,但是他们还是有不同的,这里就介绍一下运算量中的不同![转载]C51—运算量(重点:特殊功能寄存器变量、位变量,相同的我就直接跳过~(果断不说了,不同的对于以后c语言开发51单片机还是相当有用的,慢慢的就会体会到了~~~~~[转载]C51—运算量(重点:特殊功能寄存器变量、位变量,尤其是特殊功能寄存器变量、位变量、还有绝对地址的访问!

C51的运算量(只说重点~):

C51中的运算量主要是常量和变量。

1、常量

常量是指在程序执行过程中不能改变的量。在C51中支持整型常量、浮点型常量、字符型常量和字符串型常量。

1)整型常量

2)浮点型常量

3)字符型常量

4)字符串型常量

2、变量

变量就是在程序运行过程中可以改变的量呗。

一个变量有两部分组成:变量名和变量值。每个变量都有一个变量名,在存储器中占用一定的存储单元,变量的数据类型不同,占用的存储单元数就不同。在存储单元中存放的内容就是变量值。

1)数据类型说明符

在定义变量时必须通过数据类型说明符来指明变量的数据类型,指明变量在存储器中占用的字节数。可以使基本数据类型说明符,也可以是组合数据类型说明符,还可以是typedef或者#define定义的类型别名(这里一定要注意typedef一般用来定义别名!尽量不要用#define啊~~我就不解释了[转载]C51—运算量(重点:特殊功能寄存器变量、位变量,太专业了~~不过用宏定义就一定要用#define)

例如:

typedef unsigned char uchar;     //这个是有;的

typedef unsigned int  uint;

或者:

#define uchar unsigned char      //这个就没有;    而且它们两个定义相反

#define uint  unsigned int

2)变量名

变量名有两种:普通变量和指针变量。他们的区别是指针变量名前面带“*”号。

3)存储种类

存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有4种,分别是:自动(auto)、外部(extern)、静态(static)和存储器(register)。

a、auto

当定义它的函数体或者复合语句执行时,C51才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,如果缺省存储种类,则默认为此。

b、extern

被定以后分配固定的内存空间,在程序整个执行时间内都有效,知道程序结束时才释放。

c、static

使用static定义的变量成为外部变量,可分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见。这样不仅使变量在定义它的函数体外可以被保护,还可以实现当离开函数体时值不被改变。外部静态变量是在函数体外定义的静态变量,它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或者多模块处理中(这点很重要,以后会用到很多,尤其是多模块,写大程序必须具备的),外部静态变量只在文件内部或者模块内部有效。

d、register

它定义的变量存放在CPU内部的寄存器中,处理速度快,但是数目有限。

4)存储器类型

存储器类型用来指明变量所处的单片机的存储区域情况。类型如下:

data:直接寻址的片内RAM低128B,访问速度快

bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问

idata:间接寻址访问的片内RAM,允许访问全部片内RAM

pdata:用Ri简洁访问的片外RAM低256B

xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM

code:程序存储器ROM64KB

注意:定义变量时可以省略“存储类型”,省略时C51编译器将按存储模式默认存储器类型。具体的存储情况啊~~一会你就知道了,继续往下看~~哈[转载]C51—运算量(重点:特殊功能寄存器变量、位变量

例如:

char data var1;      //在片内RAM低128B定义用直接寻址方式访问的自足型变量var1

unsigned char bdata var2;       //在片内RAM位寻址区(20H~2FH)单元定义可字节处理和位处理的无符号字符型变量var2

5)特殊功能寄存器变量

在51单片机中有很多特殊功能寄存器(不过这些有些东西还是不需要我们来关心的~~~因为在调用#include"reg52.h"的时候里面都给你整好了[转载]C51—运算量(重点:特殊功能寄存器变量、位变量),通过这些特殊功能寄存器可以控制51单片机的定时器、计数器、串口、I/0及其他功能部件(这里很重要的~~~~~~),没一个特殊功能寄存器再片内RAM中都对应一个字节单元或者两个字节单元。

在C51中,允许用户对这些特殊功能寄存器进行访问,但是访问时需要通过sfr或者sfr16类型说明符进行定义,定义是需要指明他们所对应的片内RAM单元的地址。(你过关不用担心,直接调用#include"reg52.h"就哦了~)

例如:

sfr PSW=0xd0;

sfr SCON=0x98;

sfr16 DPTR=0x82;

6)位变量

在C51中,允许用户通过位类型符定义位变量。

位类型符有两个: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、存储模式(个人感觉真的用不到这些东东了,因为你丫的要是嫌小可以换个大的,而且还相当的便宜~~~~[转载]C51—运算量(重点:特殊功能寄存器变量、位变量,我以前试过扩展一个RAM和ROM,擦[转载]C51—运算量(重点:特殊功能寄存器变量、位变量不成啊~~)

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

1)SMALL模式

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

2)COMPACT模式

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

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 int  uint;

void main()

{

  uchar var1;

  uint var2;

  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_ (这个用的最多了~~~[转载]C51—运算量(重点:特殊功能寄存器变量、位变量

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

一般格式:

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

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

例如:

typedef unsigned char uchar;

typedef unsigned int uint;

data uchar x1 _at_ 0x40;      //在data区中定义字节变量x1,地址为0x40H,这里是uchar

xdata uint x2 _at_ 0x2000;    //在xdata区中定义字变量x2,它的地址为0x2000H,这里是uint

 

 

我感觉我真的不想再写了,累死了~~~擦[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量[转载]C51—运算量(重点:特殊功能寄存器变量、位变量

不过完工了,爽啊~~解脱


关键字:C51  运算量  特殊功能寄存器  变量  位变量 引用地址:C51—运算量(重点:特殊功能寄存器变量、位变量

上一篇:51单片机—再论IIC—软件通用包(汇编、c语言)—03
下一篇:51单片机—AT24C1024(带程序解析!)—07

推荐阅读最新更新时间:2024-03-16 14:37

HMI内部变量如何在PLC中使用
在一个项目中见到HMI定义的内部变量,可以传送给PLC,两者进行数据交换。格式为DB .DBw 。请问这是如何实现的,需要做哪些设置 答:1、通讯——变量——鼠标右键——添加变量。 2、通讯?变量下建立报警变量(注意:报警变量不能为BOOL类型,只能是Word或者Int类型的变量),例如:我们这里建立一个报警变量,地址为MW20。 3、进入报警管理?离散量报警输入相应文本,触发变量选择“报警变量”,触发器位填入相应的位号。例如: 文本 触发变量 触发位号 实际PLC地址 电机故障 报警变量 1 M21.1 皮带机打滑 报警变量 8 M20.0 温度报警 报警变量 9 M20.1 压力报警 报警变量 0 M21.0 这里要注意的是西门
[嵌入式]
对于c51外部中断和程序调用的理解
首先介绍一下C51外部中断的基本概念 中断的优点: 1、实时处理。需要CPU立即做出相应或处理。 2、异常处理。运行过程中,出现断电、程序出错等问题,就需要CPU对故障源进行处理。 3、提高效率。采用中断技术可以大大提高CPU的运行效率。 中断源:C51单片机有5个中断源(2个外部中断、2个定时器中断和一个串口中断)。对中断的配置操作,主要通过控制三个寄存器就可以(中断允许寄存器IE)、定时器控制寄存器(TCON)和中断优先级寄存器(IP)。即通过控制EA EX IT 的直接赋值,即可调用中断服务程序 注:中断服务程序与while(1)中的程序调用是不一样的 中断服务函数:在CPU接收到中断后,会执行相应中断的中断服务函数
[单片机]
对于<font color='red'>c51</font>外部中断和程序调用的理解
STM8全局变量溢出问题解决
1、变量存储空间结构 STM8S105系列CPU的RAM地址范围为0~0x7FF的2K空间,其中默认将高512字节分配给堆栈,剩下0~0x5FF字节为变量存储空间 。在0~0x5FF的空间范围内,低256字节被定义为Zero page,其中包括.bsct,.ubsct,.bit,.share,各段的含义如下: 可见, 当segment .ubsct overflow错误出现时, 应该是低0~FF段空间出现溢出 cosmic默认将所有变量存储在zero page段, 如要将变量置于0x100~0x5FF的空间里, 需要将变量前添加@near的申明, 如同idata的功能 通常将所有全局变量都加上@near申明, 以放置在zero
[单片机]
C51中延时程序的编写
C51及C51和汇编的混合编程的资料都是从前辈那儿偷来的,先谢谢各位前辈的分享!:) 众所周知,c51在编程时很难掌握程序运行的时间,所以编写延时程序时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。 1、us级延时程序 常用的一个函数如下: void delayus(unsigned char x) { while(--x) ; } 生成的汇编代码为: C:0x001C
[单片机]
C51单片机看门狗电路
采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图1所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图1电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。 看门狗定时器的预置时间是通过X25045的状态寄存器的相应位来设定的。如表1所示,X25
[单片机]
<font color='red'>C51</font>单片机看门狗电路
C51教程 第五个C51程序:内部资源之定时计数器
内部资源之定时器 16位计数器:T0 分为 TH0(高八位) 和 TL0(低八位) T1 分为TH1(高八位) 和 TL1(低八位) (1)相关口线:T0:P3.4,定时计数器0外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.4作IO口使用 T1:P3.5,定时计数器1外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.5作IO口使用 输入信号下降沿有效,前一个机期周期为高电平 ,后一个机期周期为低电平表示有脉冲,信号周期: T =2Tfr=2*12*Tosc,即信号的频率f (1/f) =(24/fosc) f =fosc/24 (2)相关控制字:TM
[单片机]
<font color='red'>C51</font>教程 第五个<font color='red'>C51</font>程序:内部资源之定时计数器
Proteus C51仿真学习板6——ADC
在将ADC之前,先聊聊其前因后果——由于计算机在自动控制、检测以及其他领域广泛应用数字电子技术,而大自然的信号全是模拟信号,如果通过计算机保存自然信号呢?那么就需要ADC(模数转换器Analog-Digital Converter)来讲模拟信号转换为数字信号,这样才能存储到计算机中。 那么ADC是如何转换的呢? 对选定一个瞬间对模拟信号进行采样; 将值转换为数字量; 按照一定编码格式转换。 一个模拟信号肯定是不能采样一个点的,而是许多点集合而成。当长方形又窄又长时几乎接近竖线时,就可以很好的还原之前的波形了。用官方的话说:抽样定理——若原图的最大频率是fmax,那么采样频率要比原图的最大频率2倍还要大,这样才能准
[单片机]
Proteus <font color='red'>C51</font>仿真学习板6——ADC
西门子博途设计 ProDiag 变量监控操作方式
为了更方便描述,本文件仅讨论“FB_Meld_4”块。 “FB_Meld_8”的操作方式相同。 对于 FB_Vorwahl 和 FB_Ruf 必须遵守该操作方式。 如果是 FB_Bauteilkontrolle,在检查容器的情况下允许通过 Config-Bit 取消块内部的消息,并且在输出端 Stoexx 将用户定义的变量监控参数化(可从块帮助得知详细信息)。 通过块“FB_Meld_4”创建监控的操作方式 创建块“FB_Meld_4”的实例,并且将其与所需的变量连接。 去定义所连接的变量 在 DB 中选择所连接的变量,并且添加一个新的监控。 在这里显示组态的总览: 必须选择“故障消息”作为监控方式。
[嵌入式]
西门子博途设计 ProDiag <font color='red'>变量</font>监控操作方式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved