arduino编程基础之--程序 元素

  Arduino编程采用C语言编程的语法,由于arduino是基于avr单片机的,因此也做了一些修改,并且对函数进行了大量的扩充,使得arduino的端口和外设使用更加方便。

一、变量OR常量

  1、变量:就是一些数据的代号而已,但是关于变量名其实各种语言都有要求,其中C语言的变量名明确规定:可以包括字母大写、小写都可以,下划线和数字,数字不能排第一个(规定);这里有个坑,就是windows下用应用,有的区分大小写,有的不区分;其他的补充就是除了循环变量,尽量让变量名做到顾名知意,也就是高手说的,代码的自解释性。

  2、为什么要变量:为了更好的应用和表示数据,如果我们知道一个同学的身高是1.65m,但是随着时间的流逝,可能该同学毕业时,身高已经是1.92m了,如果直接用数据表示,就不如用变量来表示下,使用起来就是很方便。

  3、变量的要素:左值和右值,这两个要素都和变量的类型有关,不同的类型需要的存储空间大小不同(左值),能存储的最值也不同(右值),C语言中通过指针将左值和右值完美结合,解析指针获取右值,指针本身表示左值;其实,仔细想来,变量也是将左值和右值实现了结合,取地址获取变量的左值,变量本质获取变量的右值;因此无论是指针还是变量都是C编程中的重要元素。

  4、变量的作用域:

  在函数外声明的变量就是全局变量;在函数中声明的变量就是局部变量,在代码块中的变量叫块变量。

  5、变量的修饰符:

  static:静态变量,常用来创建对某个函数可见的变量,但与一般局部变量不同的是,局部变量在每次调用时,都会创建和销毁,而静态变量在函数调用后已经保留原来的值。静态变量只在函数第一次调用时被创建和初始化。

  volatile:易失变量或内存型变量,和static变量相反,这种变量容易被外界改变,每次使用需要从RAM中读取变量值方为上策;

  const:常量关键字,简单说就是值不能变化的量;其实常量更多的是一种协定,程序在运行过程中一般都会根据契约精神不会让常量变化,但不是说常量一定不能变化,如果有程序员不讲武德,也是可以改变常量的值的。其实和常量类型的有一种宏定义,从表面看来都是不能变化的量,但是主要是常量是编译期间在程序的栈空间中,而宏定义则是在预编译期间完成替换,基本不占用编译时间。宏定义更多用来定义函数,定义变量和常量差不多。

  arduino中几个常量:逻辑层:true和false,其中false为0,不为0就是true

            硬件层:管脚输出电压定义HIGH和LOW,就是表面含义

                管脚功能定义INPUT和OUTPUT,表示输入和输出

 

二、数据类型

  1、boolean类型

  布尔类型,表示一个变量只能有两种取值,true or false,每个boolean变量占一个字节的内存

  2、char类型

  字符类型,可以表示ADCII码中的编码,也可以表示数值,在-128~127,赋值的时候可以使用字符,也可以使用数值

  3、unsigned char类型

  无符号字符类型占用1个字节,与byte类型相同,表示范围2~255

  4、byte类型

  字节型,表示一个字节存储8位无符号数,范围为0~255

  5、int类型

  表示整数的基本类型,占用2字节,整数范围为:-32768~32767,即-2^15~2^15-1

  整型使用2的补码方式存储负数,最高位位符号位,表示数的正负,其余位取反加1:具体如下:

  为了简化问题,现在假如有byte型数据表示-20,写的过程为:先将最高位写为1;剩下的位数表示20, 1001 | 0100,再将除最高位的求反为: 1110 | 1011, 将结果加1为: 1110 | 1100

                      读的过程为:先读取最高位为1,表明是负数,将剩下的位数求反:1001 | 0011,结果为-19,将结果减去1,实际值就是-20

  6、unsigned int类型

  无符号整型与整型的唯一区别就是不能存储负数,当变量的值超过类型所能表示的最大值值,结果就会走向另一个极端,变的非常小,反之也一样。

  7、word类型

  unsigned int完全相同

  8、long类型

  是扩展的数字存储变量,可存储32位大小的变流量,从-2^31~2^31-1

  9、unsigned long类型

  作为long型的无符号类型,不能储存负值,数据存储范围从0~2^32

  10、float类型

  可以拥有小数点的数据。

  常常用来模拟连续值,比整型具有更大的精确度;

  取值范围-3.4028235E+38~3.4028235E+38;

  被存储位32位的信息;

  只有6~7位有效数字;

  尽量不要用浮点类型的数据比较大小,必须这么做,可以设置一个误差范围,小于就可以判定相等更合适

  浮点类型的数据计算速度远慢于整型计算,尽量避免浮点运算,可以先将数据表示位整型,到最后结果时再转换位浮点类型

  11、double类型

  arduino上的double类型和float类型完全一致

  12、string类型

  两种表现形式:字符串数据类型,做一个字符串,由char类型的字符数组加空终止符(\0)构成,定义字符串时有多种方式:

  1、只声明:char Str1[15]               //该字符串中只能存储14个字符,不要忘了终止符(\0),以下一样

  2、潜定义:char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};    //定义为8,考虑到存储7个字符,需加终止符

  3、明定义:char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', ‘\0'}; //定义为8,存储7个字符,明确加上了终止符  

  4、推定义:char Str4[] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};    //定义为空,考虑到存储7个字符,加终止符,可推出为8

  5、char Str5[8] = "arduino";              //和定义2效果完全一样

  6、char Str6[] = "arduino";                //和定义4效果完全一样

  7、char Str7[15] = "arduino";              //这种定义为后来存储更多字符预留空间,前边存储了arduino7个字符,中间7个用空白占位,最后一个用\0结束

  8、char Str8[] = "arduino""is""good!";         //将很长的字符串按类别打包,使用更方便

  说明:

  1)、空终结符的ASCII码为0,通过该值明确表示函数可以到此结束了,是个约定,后面即便有数据也不再读取了,字符串的结尾会自动填充,也必须填充空字符串;

  2)、字符必须用单引号包括,字符串必须用双引号包括,如果用字符数组定义时,用字符分解而以;

  3)、过长的字符串,可以分成较短的字符串,可以称之为字符串分开打包;如上边定义8所示;

  4)、字符串数组,当需要大量的字符时,常常用字符串表示,比如墨水屏显示中等;如:

    char *myStrings[] = {"This is one!",

              "This is two!",

              "This is thr!",

              This is fou!";

              };

    void setup(){

      Serial.begin(9600);

    }

    void loop(){

      for(int i = 0; i < 6; i++){

        Serial.println(myStrings[i]);

        delay(500);

      }

    }

  代码解析,定义中使用字符 指针类型的数组,其实就是数组中的数组,等价与2维数组,也可以等于指针的指针;

  loop中的应用是,就是根据定义,第一打印第一个字符串,由于myStrings[i]是个字符指针,执向每个字符串的首字符地址,打印过程知道碰到\0才结束,0.5s后增加i的值,从而指向下一个字符串,打印等,以此类推,完成了所有字符串的打印。

  13、String object类型

  操作罗字符串的简单操作,连接、增加、寻找和替换字符串,官方参考手册具体为: 

  https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/ 

Operators

  14、Arrays类型

  数组类型和其他的差不多,数组三要素类型、名称、大小,通过下表访问数组元素;

  15、void类型

  主要用在函数类型和指针

  16、sizeof()

  类型大小的获取操作符

三、类型转换

  最终形态和声明的类型不一致时,可以通过类型转换完成数据的匹配,主要包括暗转换和明转换,暗转换主要发生在数据类型变小时,可以由编译器自动完成转换;明转换需要有用户明确提出转换才能转换。主要包括char、byte、int、word、long、float类型间转换,语法就是再类型后加上(),括号中添加需要转的变量即可,例如:

  int  var1 = 65;

  char var2 = char(var1);            //类型强制转化

  char var1 = 65;

  int var2 = var1;                //类型暗转换

 

posted @ 2021-01-16 17:46  叕叒双又  阅读(765)  评论(0编辑  收藏  举报