zoukankan      html  css  js  c++  java
  • 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类型的字符数组加空终止符()构成,定义字符串时有多种方式:

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

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

      3、明定义:char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', ‘'}; //定义为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个用空白占位,最后一个用结束

      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.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;                //类型暗转换

  • 相关阅读:
    RDS MySQL 空间问题的原因和解决
    debian8最小化安装,字符界面的中文配置
    ekho安装及测试(中文文字转语音)
    sqlite 常用命令
    记录一次并没有什么用的对比测试
    debian 8 解压安装mysql(版本5.7.19)
    收藏的书录,值得花时间去读的书
    shell脚本监控Linux系统的登录情况
    gcc cc1: all warnings being treated as errors
    FreeSWITCH取消Digest校验流程
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/14286752.html
Copyright © 2011-2022 走看看