您的位置 首页 模拟

51单片机之C言语-4.1数据类型

从这一章起我们开始学习单片机C语言,既然是语言那么就应该有基本词汇和相关的语法。我们先来看看数据类型。讲数据之前先简单说说单片机的

从这一章起咱们开端学习单片机C言语,已然是言语那么就应该有基本词汇和相关的语法。咱们先来看看数据类型。讲数据之前先简略说说单片机的存储结构。咱们知道单片机要运转之前,咱们需求给他写指令,指令寄存在ROM存储器上。咱们再细想一下,已然寄存在ROM上,那么咱们来想一个问题,比方我的指令中有个数字‘3’要,这个‘3’是怎样寄存的?信任这个很简单,单片机中寄存的都是二进制,那么首先要转成二进制11B,格局如下:

这个不便是表明3了吗?也便是说,假设你要放这个数,我把这个数先转成二进制方式(能够直接运用电脑自带的计算机来转化),然后找单片机的存储器要2个格子放进去1或许0就行了。这样了解对不对呢?不对。你向单片机要格子的时分,单片机要么给你8个格子,要么16个,也便是8整数倍。为什么是这样?由于单片机存储器的最小单元是一个字节(8位).也便是说,即便你只想放一个数字1,单片机也会给你8个格子。这儿咱们能够这样来了解存储器:

每一行8个单元格,每个单元格能放0或许1.ROM由很多个这样的单元格组成。详细的咱们后边再讲。所以这样咱们寄存3,30,40,120等等就简单了,都是放在同一行的单元格中。这样每一行能寄存的巨细规模为0-255.也便是说在0-255直接恣意巨细的数据都很好存储了。像这样的数据咱们就叫char型。可是又有了个问题,假设我要寄存-3这个负数,怎样办?咱们说过这些单元格只能放1或许0,不能放负号进去,怎样办?所以咱们想了个方法,就从8个单元格中取一个出来,用0表明正,1表明负。取哪一个单元格,最高位也便是最左面的那个为最高位。假设我现在在最高位放一个1,那么单片机怎样知道这个最高位是1仍是表明负数,比方:

1111_0110这个是多少,246仍是-118,怎样差异?看看咱们是怎样告知单片机的,

unsignedchar 表明最高位为数字,signed char表明最高位为正负。

好了,问题来了。怎么我现在要寄存256怎样办?8个单元格必定不行用了,需求9个单元格,前面说了,要么8个单元格,要么16个单元格,单片机不给你9个单元格,这样咱们只好用16个单元格,即便只用了9个单元格,有点糟蹋. 这16个格子就表明int整型。相同的,正负也是占用最高位的一个格子,unsigned int 表明最高位的单元格是数字,signed int最高单元格表明正负。举个比如:65367

假设是unsigned int,则表明65367

假设是signed int,表明-32599

很简单的能够算出,unsigned int的规模:0-65535

signedint的规模: -32768 – 32767

现在咱们知道了8个单元格便是char,16单元格便是int(规模限于本单片机).那么有没有24个单元格呢?没有,只要32个格子,这个是固定的。32格子便是长整型了,用long表明。相同的,能够知道,

unsignedlong 规模:0 – 4294967295,

signedlong 规模:-2147483648 – 2147483647

经过以上的剖析,咱们能够知道,假设要运用的数据只需求占用8个格子,就没有必要占用16个格子,这样能够节约存储空间。

别的这儿弥补两个程序中常常用到的两个指令 define和typedef

1. 无参宏界说

#define 标志符 字符串

其间的”#”表明这是一条预处理指令。凡是以”#”最初的均为预处理指令。”标志符”为所界说的宏名。”字符串”能够是常数,表达式,格局串等。

例如:

#define M (y*y+3*y)

它的作用是指定标志符M来替代表达式(y*y+3*y). 在编写源程序时,一切的(y*y+3*y)都可由M替代。

留意#define M(y*y+3*y)后边不能够有分号”;”,不然M将分号一同替换

2. 类型界说符typedef

C言语不只供给了丰厚的数据类型,并且还答应由用户自己界说类型阐明符,也便是说答应由用户为数据类型取”别号”。类型界说符typedef即可用来完结此功用。typedef界说的一般方式为:typedef 原类型名 新类型名例如 typedef char NAME[20];表明Name是字符数组类型,数组长度为20,留意后边带有分号。然后能够用NAME阐明变量,如:NAME a1, a2, s1,s2;彻底等效于:char a1[20], a2[20],s1[20],s2[20]宏界说define与类型阐明符typedef的差异在单片机编程中咱们常常看到:#define uchar unsigned char#define uint unsigned int也能够运用typedef来界说:typtedef unsigned char uchar;typedef unsigned int uint;可是碰到如下状况就不能互换了,#define PIN1 int *typedef (int *) PIN2;从方式上看这两者类似,但在实际运用中却不相同。下面用PIN1,PIN2阐明变量时就能够看出它们的差异:PIN1 a, b;在宏代换后变成:int *a,b;表明a是指向整形的指针变量,而b是整型变量。但是:PIN2 a,b;表明a,b都是指向整型的指针变量。由于PIN2是一个类型阐明符。由这个比如可见,宏界说尽管也可表明数据类型,但毕竟是作为字符代换。在运用时要十分当心,以防止犯错。以上咱们概述了数据类型,现在咱们各举一个比如阐明,例1 比较unsigned char; unsigned int; unsigned long 占用存储空间的巨细运转程序之前需求设置keil优化等级,将优化等级设置为0进程如下:在keil界面-> project->Options for target target 1…点击C51,挑选Level为0

代码如下:

#include “reg52.h”

sbit LED0=P1^3;

void main(void)

{

unsigned char i;

i=0x30;

LED0=i;

while(1);

}

//输出成果信息 Program Size: data=10.0 xdata=0 code=27

#include “reg52.h”

sbit LED0=P1^3;

void main(void)

{

unsigned int i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=11.0 xdata=0 code=32

#include “reg52.h”

sbit LED0=P1^3;

void main(void)

{

unsigned long i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=13.0 xdata=0 code=46

//unsigned char: Program Size: data=10.0 xdata=0 code=27//unsigned int: Program Size: data=11.0 xdata=0 code=32//unsigned long:Program Size: data=13.0 xdata=0 code=46可见相同一个数据0x30, 运用不同的数据类型界说,将占有不同的存储空间例2 define的运用

#include “reg52.h”

#define uchar unsigned char //留意后边没有分号

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

例3 typedef的运用

#include “reg52.h”

typedef unsigned char uchar;//留意后边有分号

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/319662.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部