【雕爷学编程】Arduino 手册之算术运算符赋值 =与取余 %

在这里插入图片描述
在这里插入图片描述
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。

如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。

Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣

在这里插入图片描述

维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。

Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。

Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。

在这里插入图片描述

Arduino 系列电路板的设计大多使用 Atmel AVR 单片机。这些电路板配有一组数字和模拟I/O引脚,可以连接各种扩展板或面包板(Shields 扩展版)和其他电路。这些电路板具有串行端口,包括某些型号上的通用串行总线(USB),也用于从个人电脑加载程序。

软件编程方面,通常使用C/C++程序语言,官方提供了一个Arduino IDE用开发。除了使用传统的编译工具链之外,Arduino 项目还提供了一个基于 Processing 语言项目的集成开发环境。另外,一些少儿编程教育软件提供了对 Arduino 的可视化编程。

在这里插入图片描述

四、Arduino算术运算符

Arduino 算术运算符是一种用于进行数学计算的符号,它可以对两个或多个数值或表达式进行加、减、乘、除等操作。Arduino语言中的算术运算符有以下几种:

  • 加法运算符,用于将两个操作数相加,例如3 + 5等于8。
  • 减法运算符,用于将第一个操作数减去第二个操作数,例如10 - 7等于3。
  • 乘法运算符,用于将两个操作数相乘,例如4 * 6等于24。
    / 除法运算符,用于将第一个操作数除以第二个操作数,例如12 / 4等于3。
    % 取余运算符,用于求第一个操作数除以第二个操作数的余数,例如7 % 3等于1。
    = 赋值运算符,用于将等号右边的值或表达式存储到等号左边的变量中,例如x = 10表示将10赋值给变量x。

算术运算符的应用场景有以下几种:
在程序中进行一些基本的数学计算,例如求和、求差、求积、求商、求余等。
在程序中进行一些复杂的数学计算,例如求平方、开方、三角函数、对数函数等。

2、赋值=

Arduino算术运算符赋值=是一种将等号右边的值或表达式存储到等号左边的变量中的操作,它可以用来初始化或修改变量的值。例如:

int x = 10; // 使用=赋值运算符将10存储到变量x中
x = x + 5; // 使用=赋值运算符将x+5的结果存储到变量x中,相当于x += 5

Arduino算术运算符赋值=的应用场景有以下几种:
1)在程序开头使用=赋值运算符给一些常量或变量赋初值,例如:

#define LED_PIN 13 // 使用=赋值运算符给LED_PIN常量赋值为13
int counter = 0; // 使用=赋值运算符给counter变量赋初值为0

2)在程序中使用=赋值运算符给一些变量赋新值,例如:

int sensorValue = analogRead(A0); // 使用=赋值运算符将A0引脚的模拟读数赋值给sensorValue变量
float voltage = sensorValue * 5.0 / 1023.0; // 使用=赋值运算符将sensorValue转换为电压值并赋值给voltage变量

3)在程序中使用=赋值运算符与其他算术运算符结合,实现一些复杂的计算或操作,例如:

int x = 10; // 使用=赋值运算符给x变量赋初值为10
x = x * 2; // 使用=和*运算符将x变量乘以2并重新赋值给x,相当于x *= 2
x = x / 4; // 使用=和/运算符将x变量除以4并重新赋值给x,相当于x /= 4
x = x % 3; // 使用=和%运算符将x变量对3取余并重新赋值给x,相当于x %= 3

Arduino算术运算符赋值=的注意事项有以下几点:
1)=赋值运算符的优先级很低,所以在使用时要注意加上括号,避免出现错误或歧义。例如:

int x = 10;
int y = 20;
int z = x + y = 30; // 这样写是错误的,因为+运算符的优先级高于=运算符,所以会先计算x+y的结果,然后试图将30赋值给50,这是不合法的。
int z = (x + y) = 30; // 这样写也是错误的,因为括号内的表达式不是一个左值,不能作为被赋值对象。
int z = (x + y) == 30; // 这样写才是正确的,因为==是关系运算符,用来判断两个表达式是否相等,其结果是一个布尔值,可以赋值给z。

2)=赋值运算符与==关系运算符不要混淆,前者用来给变量赋值,后者用来判断两个表达式是否相等。例如:

int x = 10;
if (x == 10) { // 这里使用==关系运算符判断x是否等于10,如果是,则执行花括号内的语句
  Serial.println("x is equal to 10");
}
if (x = 20) { // 这里使用=赋值运算符将20赋值给x,并且返回20作为条件判断的结果,因为20是非零数,所以被视为真,所以总是执行花括号内的语句
  Serial.println("This statement is always true");
}

3)在程序中进行一些逻辑判断或控制流程,例如使用if语句、for循环、while循环等。这些语句通常需要使用比较运算符或布尔运算符来判断条件是否成立,并且可能需要使用赋值运算符或复合赋值运算符来修改变量的值,例如:

int x = 10; // 定义一个整型变量x,并赋值为10
int y = 20; // 定义一个整型变量y,并赋值为20

void setup() {
  Serial.begin(9600); // 初始化串口通信波特率为9600
}

void loop() {
  if (x > y) { // 使用比较运算符>判断x是否大于y
    Serial.println("x is greater than y"); // 如果是,则在串口打印这句话
  } else { // 否则
    Serial.println("x is not greater than y"); // 在串口打印这句话
  }
  
  for (int i = 0; i < 5; i++) { // 使用for循环重复执行以下代码5次,每次将i加1
    Serial.print("i = "); // 在串口打印这句话
    Serial.println(i); // 在串口打印i的值
    x += i; // 使用复合赋值运算符+=将x加上i并重新赋值给x
    Serial.print("x = "); // 在串口打印这句话
    Serial.println(x); // 在串口打印x的值
  }
}

3、取余 %

Arduino算术运算符取余%是一种用于求两个整数相除后的余数的符号,它可以用来判断一个数是否能被另一个数整除,或者获取一个数的某一位或某几位。例如:

int x = 10; // 定义一个整型变量x,并赋值为10
int y = 3; // 定义一个整型变量y,并赋值为3
int z = x % y; // 使用%运算符求x除以y的余数,并赋值给变量z,z的值为1

Arduino算术运算符取余%的应用场景有以下几种:
1)在程序中判断一个数是否是另一个数的倍数,例如判断一个年份是否是闰年。闰年的条件是能被4整除但不能被100整除,或者能被400整除。例如:

// 定义一个函数,判断一个年份是否是闰年,返回布尔值
bool isLeapYear(int year) {
  // 如果年份能被4整除但不能被100整除,或者能被400整除,则是闰年
  if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
    return true; // 返回真
  } else {
    return false; // 返回假
  }
}

void setup() {
  Serial.begin(9600); // 初始化串口通信波特率为9600
}

void loop() {
  int year = 2023; // 定义一个整型变量year,并赋值为2023
  bool result = isLeapYear(year); // 调用isLeapYear函数,判断year是否是闰年,并赋值给result
  Serial.print("The year "); // 在串口打印这句话
  Serial.print(year); // 在串口打印year的值
  Serial.print(" is "); // 在串口打印这句话
  if (result) { // 如果result为真
    Serial.println("a leap year."); // 在串口打印这句话,并换行
  } else { // 否则
    Serial.println("not a leap year."); // 在串口打印这句话,并换行
  }
}

2)在程序中获取一个数的某一位或某几位,例如获取一个十进制数的个位、十位、百位等。这可以用来处理一些涉及数字分解或组合的问题,如数码管显示、密码锁等。例如:

// 定义一个函数,获取一个十进制数的个位,并返回整型值
int getOnes(int num) {
  // 使用%运算符求num除以10的余数,即个位
  int ones = num % 10;
  return ones; // 返回个位
}

// 定义一个函数,获取一个十进制数的十位,并返回整型值
int getTens(int num) {
  // 使用/运算符求num除以10的商,即去掉个位后的数
  int temp = num / 10;
  // 使用%运算符求temp除以10的余数,即十位
  int tens = temp % 10;
  return tens; // 返回十位
}

// 定义一个函数,获取一个十进制数的百位,并返回整型值
int getHundreds(int num) {
  // 使用/运算符求num除以100的商,即去掉个位和十位后的数
  int temp = num / 100;
  // 使用%运算符求temp除以10的余数,即百位
  int hundreds = temp % 10;
  return hundreds; // 返回百位
}

void setup() {
  Serial.begin(9600); // 初始化串口通信波特率为9600
}

void loop() {
  int num = 123; // 定义一个整型变量num,并赋值为123
  int ones = getOnes(num); // 调用getOnes函数,获取num的个位,并赋值给ones
  int tens = getTens(num); // 调用getTens函数,获取num的十位,并赋值给tens
  int hundreds = getHundreds(num); // 调用getHundreds函数,获取num的百位,并赋值给hundreds
  Serial.print("The ones of "); // 在串口打印这句话
  Serial.print(num); // 在串口打印num的值
  Serial.print(" is "); // 在串口打印这句话
  Serial.println(ones); // 在串口打印ones的值,并换行
  Serial.print("The tens of "); // 在串口打印这句话
  Serial.print(num); // 在串口打印num的值
  Serial.print(" is "); // 在串口打印这句话
  Serial.println(tens); // 在串口打印tens的值,并换行
  Serial.print("The hundreds of "); // 在串口打印这句话
  Serial.print(num); // 在串口打印num的值
  Serial.print(" is "); // 在串口打印这句话
  Serial.println(hundreds); // 在串口打印hundreds的值,并换行
}

3)在程序中实现一些循环或周期性的效果,例如闪烁LED灯、播放音乐等。这可以用来利用取余运算的周期性特点,使一个数在一定范围内循环变化。例如:

// 定义LED灯连接的引脚为13号
#define LED_PIN 13

void setup() {
  pinMode(LED_PIN, OUTPUT); // 设置LED_PIN为输出模式
}

void loop() {
  // 使用millis函数获取当前时间(单位为毫秒),并赋值给变量time
  unsigned long time = millis();
  // 使用%运算符求time除以1000的余数,即当前时间的秒数,并赋值给变量second
  int second = time % 1000;
  // 如果second小于500,即当前时间在每一秒的前半部分
  if (second < 500) {
    digitalWrite(LED_PIN, HIGH); // 向LED_PIN写入高电平,点亮LED灯
  } else { // 否则,即当前时间在每一秒的后半部分
    digitalWrite(LED_PIN, LOW); // 向LED_PIN写入低电平,熄灭LED灯
  }
}

Arduino算术运算符取余%的注意事项有以下几点:

1)%运算符只能用于整数之间的运算,不能用于浮点数之间的运算。如果两个操作数中有一个是浮点数,则会发生编译错误。例如:

int x = 10;
float y = 3.14;
int z = x % y; // 这里会发生编译错误,因为y是浮点数,不能用于%运算符

2)%运算符的优先级和结合性与乘、除、取余运算符相同,高于加、减运算符,低于赋值运算符。同一优先级的运算符通常从左到右结合。为了避免歧义或错误,建议在复杂的表达式中使用括号来明确运算顺序。例如:

int x = 10;
int y = 3;
int z = x + y % 2; // 这里会先计算y % 2,然后再加上x,所以z的值为11
int z = (x + y) % 2; // 这里会先计算x + y,然后再求余数,所以z的值为1

3)%运算符的操作数和结果的类型取决于参与运算的变量或常量的类型。如果两个操作数的类型不同,会发生隐式类型转换,通常是将较低精度的类型转换为较高精度的类型,例如字符型转换为整型。如果结果的类型与被赋值的变量的类型不同,也会发生隐式类型转换,通常是将较高精度的类型转换为较低精度的类型,例如整型转换为字符型。这些隐式类型转换可能会导致精度损失或溢出,所以要注意避免或处理这些情况。例如:

char x = 'A'; // 定义一个字符型变量x,并赋值为'A'
int y = 5; // 定义一个整型变量y,并赋值为5
int z = x % y; // 这里会将x转换为整型,即65('A'的ASCII码),然后与y求余数,并赋值给z,z的值为0
char w = x % y; // 这里会将x转换为整型,即65('A'的ASCII码),然后与y求余数,结果是0,然后将0转换为字符型,并赋值给w,w的值为'\0'(空字符)

4)%运算符在进行除法或取余运算时要注意被除数不能为0,否则会导致程序出错或异常。例如:

int x = 10;
int y = 0;
int z = x / y; // 这里会试图将x除以0,这是不合法的操作,会导致程序出错
int w = x % y; // 这里会试图将x对0取余,这也是不合法的操作,会导致程序出错

提示:
取模运算符不能用于浮点型数。

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雕爷学编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷学编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷学编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值