精华内容
下载资源
问答
  • [存储种类] 数据类型 [存储器类型] 变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。而...

    [存储种类] 数据类型 [存储器类型] 变量名表

    在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。

    而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 AT89C51特殊功能寄存器列表

    存储器类型

    说 明

    data

    直接访问内部数据存储器(128字节),访问速度最快

    bdata

    可位寻址内部数据存储器(16字节),允许位与字节混合访问

    idata

    间接访问内部数据存储器(256字节),允许访问全部内部地址

    pdata

    分页访问外部数据存储器(256字节),用MOVX @Ri指令访问

    xdata

    外部数据存储器(64KB),用MOVX @DPTR指令访问

    code

    程序存储器(64KB),用MOVC @A+DPTR指令访问

    表6-1 存储器类型

    如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。

    SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。

    COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。

    LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。

    之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。

    sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:

    sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;

    sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;

    我们可以这样定义AT89C51的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。

    下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:

    sfr P1 = 0x90; //这里没有使用预定义文件,

    sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器

    sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用

    sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚

    void main(void)

    {

    unsigned int a;

    unsigned char b;

    do{

    for (a=0;a<50000;a++)

    P1_0 = 0; //点亮P1_0

    for (a=0;a<50000;a++)

    P1_7 = 0; //点亮P1_7

    for (b=0;b<255;b++)

    {

    for (a=0;a<10000;a++)

    P1 = b; //用b的值来做跑马灯的花样

    }

    P1 = 255; //熄灭P1上的LED

    for (b=0;b<255;b++)

    {

    for (a=0;a<10000;a++) //P1_1闪烁

    P1_1 = 0;

    for (a=0;a<10000;a++)

    P1_1 = 1;

    }

    }while(1);

    }

    转自:http://blog.sina.com.cn/s/blog_739afc250100vbpj.html

    展开全文
  • 进行boot升级时,发现应用层的常量值不变,断电后才恢复。原因为:

    进行boot升级时,发现应用层的常量值不变,断电后才恢复。原因为:

    展开全文
  • 二进制数给整型变量赋值

    千次阅读 2016-11-26 12:31:37
    C语言中的数据基本类型包括:char short int long float double . 用哪种类型定义的就叫XX类型变量,如字符型变量,整型变量,...1 c语言中,变量不可以用二进制数来赋值2 在c语言中,若要给变量赋整型值,则只可以用
     C语言中的数据基本类型包括:char short int long float double . 用哪种类型定义的就叫XX类型变量,如字符型变量,整型变量,浮点型变量。各种变量中存储的数据,都是以二进制进行存储的。因类型的不同,采用的二进制编译格式不同。如:整形类都是用补码存储,浮点型采用IEEE754标准存储。

    1 c语言中,变量不可以用二进制数来赋值

    2 在c语言中,若要给变量赋整型值,则只可以用十进制数、八进制数和十六进制数来赋值

    3 示例

    1
    2
    3
    4
    int  n;
    n = 12;        //使用十进制数来赋值
    n = 012;   //使用八进制数来赋值
    n = 0x12;  //使用十六进制数来赋值

    4 扩展

        在Java中,变量是可以用二进制数来赋值的。一个示例如下

    1
    2
    3
    int  n = 0b111;
    System.out.println(n);
    //输出的结果为: 7
    展开全文
  • 单片机c语言变量的定义和赋值

    千次阅读 2012-02-10 17:57:18
    [存储种类] 数据类型 [存储器类型] 变量名表  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为...

    [存储种类] 数据类型 [存储器类型] 变量名表

      在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。
      而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 AT89C51特殊功能寄存器列表

    存储器类型

    说 明

    data

    直接访问内部数据存储器(128字节),访问速度最快

    bdata

    可位寻址内部数据存储器(16字节),允许位与字节混合访问

    idata

    间接访问内部数据存储器(256字节),允许访问全部内部地址

    pdata

    分页访问外部数据存储器(256字节),用MOVX @Ri指令访问

    xdata

    外部数据存储器(64KB),用MOVX @DPTR指令访问

    code

    程序存储器(64KB),用MOVC @A+DPTR指令访问


    表6-1 存储器类型
      如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。
       SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。
       COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。
       LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。
       之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。
       sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:
         sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;
         sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;

       我们可以这样定义AT89C51的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。
    下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:

    sfr P1 = 0x90; //这里没有使用预定义文件,
    sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器
    sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用
    sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚
    void main(void)
    {
    unsigned int a;
    unsigned char b;
    do{
    for (a=0;a<50000;a++)
    P1_0 = 0; //点亮P1_0
    for (a=0;a<50000;a++)
    P1_7 = 0; //点亮P1_7
    for (b=0;b<255;b++)
    {
    for (a=0;a<10000;a++)
    P1 = b; //用b的值来做跑马灯的花样
    }
    P1 = 255; //熄灭P1上的LED
    for (b=0;b<255;b++)
    {
    for (a=0;a<10000;a++) //P1_1闪烁
    P1_1 = 0;
    for (a=0;a<10000;a++)
    P1_1 = 1;
    }
    }while(1);
    }


    转自:http://blog.sina.com.cn/s/blog_739afc250100vbpj.html



    展开全文
  • 单片机全局变量 局部变量

    千次阅读 2018-04-16 20:34:07
    若在C51中定义一个全局变量,编译器将在RAM中为该变量指定一个专用地址,在C程序中给变量赋的值将存入这个专用地址中,程序操作该变量是,首先从专用地址中取出存放的值,然后再进行计算。全局变量被定义在内存中的...
  • 单片机全局变量 局部变量 堆与栈

    千次阅读 2017-01-06 12:50:11
    局部变量,全局变量
  • 出现这种情况是因为两个变量指针指向了同一个对象,需要深度赋值 data2=JSON.parse(JSON.stringify(data1));
  • (1)初始值不是0的全局变量 在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间)。 (2)未初始化的局部变量 ...
  • 结构体的声明 ``` struct IMPERIAL{ int **my_map; int numVar; void(*initialMap)(int **, int ); void(*clearMap)(int **, int );...编译过了,没有报错,执行到这一步程序就会直接卡住
  • http://www.eeskill.com/article/id/38703文章中讲述了信号的使用,在这里讲一下变量的使用。
  • 单片机常用的几种赋值操作

    千次阅读 2019-09-22 14:24:26
    之前使用单片机编程时,通常会使用一些较为不专业的语句,现在和大家一起学习下常见的单片机赋值操作; 一、把变量的某位清零 //定义一个变量 a = 1001 1111 b (二进制数) unsigned char a = 0x9f; //对 bit2 清零...
  • 单片机全局变量 局部变量 堆与栈 的区别 局部变量空间,就是堆栈空间,也就是栈空间。 从局部变量声明的时候,它就在堆栈空间了,而不是调用函数的时候,才让它入栈的。 定义一个局部变量a,编译器会将a...
  • 本文用多个例子来介绍信号与变量的区别以及赋值语句发生时刻的不同。大家可以跟着一起分析具体的执行过程,并且对结果进行仿真,看是否正确。
  • 数组与普通变量一样,也必须先定义,后使用。数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。下面就对数组进行详细的介绍。(1)一维数组一维数组是最简单的数组,用来存放类型相同的数据。数据...
  • [存储种类] 数据类型 [存储器类型] 变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。而...
  • [存储种类] 数据类型 [存储器类型] 变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。而...
  • 单片机中C语言指针与变量

    千次阅读 2015-07-30 22:22:39
    注:keil中单片机C编程 若指针没有指向提前声明的变量,会产生混乱 eg: 情景一: 情景二: Type *p,*q; Type *p,*q,pp,qq; 给指针p赋值; p=&pp; 给指针q赋值; q=&qq; p或q的值会出问题 正常,没问题(Type为...
  • 在for循环中static变量赋值一次后(初次赋值)就在不会被重新赋值(说白了就是 static int s_1 = 1;这条语句失效)但是变量i可以继续重新被定义和赋值。 二、单片机编程中C语言之间的差别。 1、在C51中多了 特殊功能...
  • 通过实例说明初始化对程序的影响。 有许多书上说,变量最好要赋初值。但是为什么要初值呢?不赋初值可能会出现什么样的意外呢?以下就我在以51单片机为MCU,Keil为编译器看到的实现现象作分析。
  • STM32单片机extern全局变量

    千次阅读 2020-10-27 16:44:14
    当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办? 如果你把temple定义在A中...
  • 指针变量赋值:(不用 *)指针变量变量名 = 所指向的变量名 修饰符 修饰符 释义 unsigned 无符号 auto 自动分配存储地址,一般优先考虑低位的 RAM static 静态类型,一开始即被分配存储空间,定义的...
  • 单片机资源有限的情况下(64k以下) 将全局变量编程static变量,然后用函数接口进行面向对象的封装有没有必要?...但是实际上,第一个方法也会有这样的问题,无非是直接赋值变量改成赋值函数,当然赋值函数里有上下限判断.
  • 关于51单片机的IO接口的地址与赋值大小理解前提了解关于51单片机的IO接口的地址与赋值大小理解其他单片机定义 前提了解 提示:我们需要回顾C语言的类型定义,如int aa=1;代码编译运行的时候计算机运行到int aa=1,...
  •  问:auto变量也会在未赋值的情况下,默认初始值为0? No!但是你得到的结果是有可能是1 (换行)2(换行) 3(换行),这可能是你的编译器的造成的,换个编译器试试。  再问:为什么C语言要区别对待auto与...
  • __align(32): 变量的数据进行32字节对齐。 __attribute __ ((at(0X68000000))); : __attribute __ ()本身用于修改变量属性。 ...
  • 描述今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime--写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,之前也注意到...
  • 当VCC重新恢复到正常电压时,单片机延迟32768个时钟后,上电复位/掉电复位状态结束。 2、按键复位 3、软件复位 涉及的单片机系统在运行过程中,有时难免会遇到需要软件复位的情况。有些古老的单片机在硬件上可能不...
  • 单片机中断函数中的全局变量问题

    千次阅读 2019-06-26 15:42:55
    然后呢,我不想在中断函数里写太多代码,便只在中断函数里放了一个全局变量,按下按钮进入中断时改变该变量的值,然后在主程序中判断该值,来执行接下来的程序,部分程序代码如下: void main...
  • 一、变量的作用域 作用域:变量的有效范围。分为:局部变量和全局变量。 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用。 1.2全局变量 在函数外声明的变量就是全局变量。 二、变量的存储类别 ...
  • 描述数据类型在数据结构中的定义是...本文主要以51单片机中的数据类型为中心而展开的话题。在keil C51或者iar for c8051编译器下:int 占两个字节 范围:-32768~+32767long占四个字节 范围:-2147483648~+2147483647...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,685
精华内容 3,074
关键字:

单片机变量赋值