版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章Arduino语法基础从C语言出发,掌握Arduino编程的核心语法《Arduino应用技术(第二版)》·第二篇Arduino基础高职电子信息类专业教学用本章学习目标学完本章,你将能够回答:Arduino程序为什么长这样?数据怎么存、怎么算、怎么控制流程?1掌握Arduino程序基本结构2掌握Arduino数据类型与运算3掌握Arduino程序流程控制4掌握Arduino中的库函数5掌握Arduino自定义函数先想一想:为什么Arduino代码和C语言这么像?你会写C的HelloWorld,但第一次看到Blink时,还是有不少问号……main()去哪了?为什么只有setup()和loop()?pinMode、digitalWrite这些"函数"从哪来?为什么要学进制转换、数据类型、运算和流程控制?2.1Arduino文件结构:从.ino到main()编写草图
xxx.inoIDE预处理
自动加#include编译为main.cpp
生成main()并调用main.cpp(IDE自动生成)#include<Arduino.h>intmain(void){init();setup();//用户函数:仅一次for(;;){loop();//用户函数:无限循环}}Arduino.h是核心头文件,定义了平台编程接口开发时不直接写main(),只需编写setup()与loop()点击"上传/校验"时IDE自动完成预处理与编译for(;;)是C语言中的无限循环2.1程序基本框架:setup与loop程序框架.inovoidsetup(){//只执行一次:初始化变量、//设置引脚模式、启用库}voidloop(){/*系统循环执行这里,每条语句以分号结束*/}核心函数setup():上电/复位后执行一次loop():反复循环执行的“主循环”pinMode(引脚,OUTPUT/INPUT):设置数字引脚模式digitalWrite(引脚,HIGH/LOW):输出5V/0Vdelay(毫秒):延时语法要点:分号“;”表示语句结束;花括号“{}”界定代码块;缩进提升可读性;注释用//或/**/,编译器会忽略。2.1示例:按钮控制LED图2-1按钮电路(R2=220Ω,R1=10kΩ)Button_LED.inoconstintbuttonPin=2;//按钮引脚constintledPin=13;//LED引脚intbuttonState=0;//按钮状态voidsetup(){pinMode(ledPin,OUTPUT);pinMode(buttonPin,INPUT);}voidloop(){buttonState=digitalRead(buttonPin);if(buttonState==HIGH){digitalWrite(ledPin,HIGH);}else{digitalWrite(ledPin,LOW);}}2.2进制转换基础:比特、字节与数制比特与字节比特(bit):表示0或1两种状态,是构成数字信息的最小单位。字节(byte):1字节=8比特,用大写B表示;主存储器的每个存储单元存放一个字节。数制的三个基本要素数码:表示基本数值的符号(十进制0~9)。基数:数码的个数(二进制基数为2)。位权:某一位上1所代表的数值(十进制123中,1的位权是100)。数制数码基数标志十进制0~910D二进制0、12B八进制0~78Q十六进制0~9、A~F16HK进制0到K-1K-表2-1不同数制的数码、基数、位权与标志2.2进制之间的转换方法任意进制→十进制方法:按位权展开并求和
十进制→其他进制整数部分:除基数取余、逆序排列
小数部分:乘基数取整、顺序排列29D=11101B0.6875D=0.1011B整数部分:除2取余逆序(图2-2)小数部分:乘2取整顺序(图2-2)1位八进制↔3位二进制1位十六进制↔4位二进制八、十六进制是二进制的"缩写"可用电脑"计算器→程序员模式"辅助转换2.2二进制运算与数的表示二进制的四则运算加法:0+0=0,0+1=1,1+1=0(进位1)减法:1-1=0,1-0=1,0-1=1(借位1)乘法:0×0=0,0×1=0,1×1=1逻辑运算真值表AB与·或+异或非000001101011-10011-11110-带符号数的表示:原码/反码/补码原码:最高位为符号位(0正1负),其余为数值。反码:正数同原码;负数符号位不变,其余取反。补码:正数同原码;负数为反码+1。计算机中的整数一律以补码存储和运算。图2-3带符号整数的位结构例:8位机器,-5的补码=11111011B(原码10000101→反码11111010→+1)。2.2标识符与关键字基本字符与标识符基本字符:大小写字母、数字、下划线,以及+-*/%<>=等运算符和分隔符。标识符:给变量、常量、函数等起的名字。规则:以字母或下划线开头后跟字母、数字、下划线区分大小写(LED与led不同)不能与关键字重名命名规范建议变量:小驼峰(buttonState)函数:动词开头(readSensor)常量:全大写加下划线(LED_PIN)名字要有意义,避免a、b、x关键字(保留字)具有特定含义、不能被用作标识符的单词,例如:数据类型:void、int、char、float、double、long、unsigned、byte、boolean流程控制:if、else、switch、case、default、for、while、do、break、continue、return其他:const、static、define、include提示:编程软件中的关键字会以高亮颜色显示,便于区分。命名时尽量避开它们。2.2转义字符转义字符以反斜杠\开头,用于在字符串中表示特殊含义的字符。在Arduino中常用\n换行与\t制表来美化串口输出。转义字符含义说明\n换行光标移到下一行行首\t水平制表跳到下一个制表位\r回车光标移到行首\\反斜杠输出一个\\"双引号字符串内输出"\0空字符字符串结束标志示例.inoSerial.println("A\tB");//输出:ABSerial.println("你好\n世界");//输出分两行显示Serial.println("\"引号\"");//输出:"引号"反斜杠在字符串中有特殊含义,需要输出反斜杠本身时写两个:\\。2.2基本数据类型数据类型字节数取值范围用途boolean1true/false逻辑判断结果char1-128~127单个字符或小整数byte10~255无符号小整数int2-32768~32767最常用的整数类型unsignedint20~65535无符号整数long4-2147483648~2147483647较大整数(如时间戳)unsignedlong40~4294967295millis()返回值类型float4约3.4E+38带小数点的实数double8约1.8E+308更高精度浮点数2.2常量与变量常量(const)定义后其值在程序运行中不再改变。常用于定义引脚号等固定参数。常量示例.inoconstintLED_PIN=13;constfloatPI=3.14;//LED_PIN=12;//错误!不能修改变量先声明类型再赋值,可在程序中改变其值。全局变量:定义在所有函数之外,所有函数都能访问,长期占用内存。局部变量:定义在函数内部,仅函数内可用,函数结束即释放。全局变量与局部变量变量作用域.inointcount=0;//全局变量voidsetup(){inttemp=0;//局部变量count=1;//可访问全局}voidloop(){//temp在这里不可见count++;//计数累积}注意:Uno内存仅2KB,滥用全局变量容易内存不足。能用局部变量就不用全局变量;全局变量在setup/loop外声明,才能跨函数共享并保持值。2.2串口调试:让数据"看得见"常用串口函数Serial.begin(波特率):初始化串口,如9600Serial.print(值):输出,不换行Serial.println(值):输出并换行Serial.available():接收缓冲区有数据返回非0Serial.read():读取一个字节数据打开串口监视器方法一:菜单"工具→串口监视器"方法二:快捷键Ctrl+Shift+M波特率需与Serial.begin一致(如9600)。串口输出.inovoidsetup(){Serial.begin(9600);}voidloop(){inta=10,b=20;Serial.print("a=");Serial.println(a);Serial.println(a+b);delay(1000);}2.2数组与字符串数组:同类型数据的集合声明并初始化,按下标访问,下标从0开始。数组.inointa[5]={10,20,30,40,50};intsum=a[0]+a[4];//a[0]=10,a[4]=50,sum=60数组越界访问不会报错,但会读到错误数据,务必注意下标范围。循环遍历数组用for循环配合下标,批量处理数组元素,是嵌入式编程的常见写法。字符串的两种形式字符数组:charstr[]="OK";以隐含的\0结尾,占用3字节。String类:Strings="OK";功能更丰富,但消耗更多内存。字符串.inoStringname="Arduino";Serial.println(name.length());Stringnum="123";intv=num.toInt();//v=123提示:Uno内存小,频繁创建String对象易造成内存碎片;简单场景优先用字符数组。2.2数组与字符串(二):字符串处理函数string.h库函数与String类方法string.h常用函数字符串整体操作优先使用string.h库:strcpy(dst,src):字符串赋值strcat(dst,src):字符串连接strcmp(s1,s2):按ASCII比较,左大1、相等0、右大-1strlen(s):返回有效字符长度(不含\0)string.h示例.inochars1[20],s2[10]="World";strcpy(s1,"Hello");//s1="Hello"strcat(s1,s2);//s1="HelloWorld"strcmp(s1,s2);//比较ASCII值strlen(s1);//10String类:Arduino还提供String类型(C++构造类型):length()、charAt()、indexOf()、substring()、toInt()、toFloat()等方法,功能更丰富但更耗内存。提示:字符数组用双引号定义会自动补\0;需要整体操作字符串时用string.h或String类。2.2数据类型转换自动类型转换(隐式)运算中不同数据类型相遇时,系统自动向"高"级别转换,不丢失数据。图2-5自动类型转换级别(低→高)注意:由高向低(如double赋给int)会丢失小数部分,需谨慎。强制类型转换(显式)语法:(目标类型)表达式。由用户明确指定转换,可能截断数据。常用于整数除法取整、浮点数取整等场景。强制转换.inointa=7,b=2;floatx=(float)a/b;//3.5inty=(int)3.99;//3(截断)charc=(char)65;//'A'floatz=a/b;//3(先整除)易错点:a/b两个整数相除结果为整数,先转换其中一个为float再除,才能得到小数结果。2.3数值运算:算术、赋值、关系与逻辑算术运算与赋值算术:+加、-减、*乘、/除、%取余注意:整数相除结果取整,如7/2=3;%求余数,如7%2=1。赋值:=把右侧值赋给左侧变量。自增自减与复合赋值++a先自增再用;a++先用后自增;--同理。复合赋值:a+=2等价a=a+2;还有-=、*=、/=、%=。例:inta=5;b=a++;→b=5,a=6;
intc=5;d=++c;→c=6,d=6。关系运算与逻辑运算关系运算:==、!=、>、<、>=、<=,结果为true/false。逻辑运算:&&逻辑与、||逻辑或、!逻辑非。关系式结果3<5true(3>5)&&(1<2)false!(3>5)true辨析:判断相等用两个等号==;单个=是赋值,写错会导致条件恒成立等难以排查的bug。2.3.1赋值运算将右侧的值或表达式结果存储到左侧变量赋值运算符=赋值运算符为"=",作用是把右侧的值或表达式结果存入左侧变量。单个"="与数学等号含义不同,是"存入"而非"相等"。两个等号"=="才表示相等判断(见关系运算)。赋值优先级很低,仅高于逗号运算。赋值.inointi=3;i=i+5;//i变为8//先取出i当前值3,//加5得8,再存回iSerial.println(i);//8要点:赋值=是把右侧值存入左侧变量;判断相等用==,勿混用。2.3.2基本算术运算加、减、乘、除与取余运算及运算优先级基本算术运算符五个基本运算符:+、-、*、/、%。整数相除结果取整:5/2=2(非2.5)。%为取余(求余数),不是百分比:5%2=1。不同类型运算按自动转换级别隐式转换:3.0/2=1.50。注意优先级:先乘除后加减,括号可改变顺序。算术运算.inointx=5,y=2,z;z=x+y;//7z=x-y;//3z=x*y;//10z=x/y;//2(整数除)z=x%y;//1(取余)z=x+x*y-y;//13z=(x+x)*y-y;//18易错点:两个整数相除结果为整数;需要小数结果时,先把其中一个转换为浮点型再运算。2.3.3自增自减运算前缀与后缀的区别、右结合规则与综合示例自增自减规则运算符++(自增1)与--(自减1)。前缀++x:先自增再使用;后缀x++:先使用再自增。自增自减遵循右结合规则。不建议在单一表达式中连续使用多个++/--,可读性差。不能同时出现在变量两侧,如++x++编译报错。自增自减.inointx=2;x++;//x=3++x;//x=4y=x++;//y=4,x=5y=++x;//x=6,y=6//复合示例(右结合)x=5;y=3;z=++x+y+++x++;//=(++x)+(y++)+(x++)//z=6+3+6=15建议:避免在单一表达式中使用多个自增/自减,以免影响可读性;++x++这类写法会编译报错。2.3.4复合运算算术/位运算与赋值结合的简化写法复合运算符复合运算是运算与赋值结合的简化写法。算术复合:+=、-=、*=、/=、%=位复合:&=、|=、^=、<<=、>>=a+=2等价于a=a+2。复合运算.inointa=10;a+=2;//a=12a-=3;//a=9a*=2;//a=18a/=4;//a=4(取整)a%=3;//a=1a<<=2;//a=4(左移2位)要点:复合赋值使代码更简洁,等价于先运算后赋值;复合位运算常用于标志位的置位/清零。2.3.5位运算按位与、或、异或、取反及移位运算位运算符:&|^~<<>>位运算直接对二进制位进行操作。&按位与:两位都是1结果为1|按位或:有一位是1结果为1^按位异或:两位不同结果为1~按位取反:0变1,1变0<<左移:整体左移,右侧补0(相当于乘2)>>右移:整体右移,左侧补0(相当于除2)位运算.inointa=0b1100;//12intb=0b1010;//10a&b//0b1000=8a|b//0b1110=14a^b//0b0110=61<<3//0b1000=88>>2//0b0010=2应用:用于寄存器/引脚位操作(bitSet/bitClear)、LED状态标志、数据打包解包。要点:位运算处理二进制位,配合bitSet/bitClear可精确控制寄存器或引脚的某一位。2.3.6关系运算比较大小关系,结果为true/false关系运算符关系运算用于比较大小,结果为true(1)或false(0)。==相等;!=不等;>大于;<小于;>=大于等于;<=小于等于。常用于if/while等条件判断中。关系运算.inointa=5,b=3;a>b//truea==b//falsea!=b//trueif(a>=3){Serial.println("OK");}辨析:判断相等必须用两个等号==;误用单个=赋值会导致条件恒成立等难以排查的问题。2.3.7逻辑运算逻辑与、或、非及短路求值逻辑运算符:&&||!逻辑运算操作布尔值,结果为true/false。&&逻辑与:两侧都为真结果为真||逻辑或:任一侧为真结果为真!逻辑非:取反短路求值:&&左侧为假不再算右侧;||左侧为真不再算右侧。逻辑运算.inoboolr;r=(3>5)&&(1<2);//false(3>5为假,短路)r=(3>5)||(1<2);//truer=!(3>5);//true(取反)优先级:逻辑非!最高,其次算术、关系,逻辑与&&高于逻辑或||。要点:逻辑运算返回true/false,常用短路特性优化判断,注意与位运算&、|区分。2.4程序流程控制三种基本结构顺序:从上到下依次执行;选择:按条件分支;循环:重复执行。选择结构if...else:二选一分支if...elseif...else:多选一switch...case:多分支选择,适合整型判断嵌套if:条件再套条件循环结构for:循环次数已知while:先判断后执行,可能一次都不执行do...while:先执行后判断,至少执行一次break/continue:跳出循环/跳过本次流程控制.ino//选择:if-elseif(x>10){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}//多分支:switchswitch(cmd){case1:Serial.println("A");break;case2:Serial.println("B");break;default:Serial.println("?");}//循环:forfor(inti=0;i<5;i++){Serial.println(i);}//循环:whilewhile(digitalRead(2)==HIGH){}2.5库函数与自定义函数库函数Arduino把常用操作封装成函数,直接用函数名加参数调用即可。数字I/O:pinMode、digitalWrite、digitalRead模拟/时间:analogRead、analogWrite、delay、millis数学:map、constrain、abs、pow、sqrt库函数示例.inointv=analogRead(A0);intp=map(v,0,1023,0,255);analogWrite(9,p);调用格式:函数名(实参)。库函数需在开头#include头文件引入(如LiquidCrystal.h)。自定义函数语法:返回类型函数名(形参列表){函数体;return返回值;}无返回值用void;有返回值用return返回。自定义函数.inointadd(inta,intb){returna+b;}voidblinkLED(intpin,intms){digitalWrite(pin,HIGH);delay(ms);digitalWrite(pin,LO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年伊吾县网格员招聘考试备考题库及答案解析
- 2026年遂昌县中小学幼儿园教师招聘考试备考试题及答案解析
- 绵阳市涪城区2026年面向社会公开选聘社区工作者的(21人)考试备考试题及答案详解
- 2026句容市下蜀镇临时性公益性岗位招聘1人笔试备考试题及答案详解
- 数智创新导论 3
- 2026年宿州市埇桥区大学生乡村医生专项计划招聘3名笔试备考题库及答案详解
- 2026江苏南京大学现代工程与应用科学学院博士后1人考试备考题库及答案详解
- 2026年古代文学与数学知识测试
- 2026年食品安全与卫生规范测试卷
- 2026年鸡东县中小学幼儿园教师招聘笔试参考题库及答案解析
- 教学课件:《结构力学》
- DB32T 4357-2022 建筑工程施工机械安装质量检验规程(修)
- 直接前方入路髋关节置换课件
- 建筑施工安全保函
- DZ∕T 0339-2020 矿床工业指标论证技术要求(正式版)
- 普通螺栓理论重量表
- 高压配电室安全管理制度
- 2017版银皮书(中英文完整版)FIDIC设计采购施工交钥匙项目合同条件
- 发展经济学 马工程课件 2.第二章 发展的概念与度量
- 交互设计1课件
- 初中音乐人音七年级下册第三单元天山之音腹式呼吸歌唱法PPT
评论
0/150
提交评论