word板文档下载:Arduino c语言基本知识
485236424e8043040433f47349285cd8.png

Arduino c语言基本知识1

1.程序结构:

基本结构
void setup() {这里写只运行一次的代码}
void loop() {这里写反复运行的程序}

程序注释
使用//开头或者包含在/ /里面

2.程序示例

//13号灯闪烁程序
void setup() {
pinMode(13, OUTPUT);    // 13号灯所在引脚设置为输出模式
}
void loop() {
  digitalWrite(13, HIGH);   // 13号引脚设置为高电平(5V)
  delay(1000);           // 等待1000毫秒
  digitalWrite(13, LOW);   // 13号引脚设置为低电平(0V)
  delay(1000); 
}

3.给引脚取个名字

这里的13可以给它取个名字

#define deng 13

用deng代替上面的数字13 可以让程序更容易读懂

4.串口打印

在void setup() {}里加入Serial.begin(9600); 在需要打印的地方加入Serial.println("灯开了");
示例:

#define deng 13
void setup() {
  pinMode(deng, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(deng, HIGH);
  Serial.println("灯开了");
  delay(1000);
  digitalWrite(deng, LOW);
  Serial.println("灯关了");
  delay(1000);
}

5.练习:编写一个红绿灯程序,有AB两个路口,每个路口都有红黄绿三盏灯红绿灯亮5秒,黄灯亮1秒。打印灯的状态。

Arduino c语言基本知识2

1.变量与条件判断

上一页用#define deng 13这句话可以实现用deng代替13,这里的deng就永远是13不能在程序中改变它的值,如果要变则需要使用定义变量的方法,如整数用int,小数用float,真假用bool。
用 if(条件){满足条件执行的语句} 或者 if(条件){满足条件执行的语句}else{不满足条件执行的语句} 可以实现条件判断。

2.引脚控制包括数字输出输入,模拟输出输入

所有引脚都可以数字输出与输入,数字输出使用digitalWrite(引脚,HIGH或LOW);数字输入使用digitalRead(引脚);它的结果为0或1.
模拟输出引脚只有6个3 5 6 9 10 11,板上常标注有~,模拟输出使用analogWrite();它的数值范围为0-255。模拟输入引脚为A0-A5使用analogRead();它返回0到1023之间的数字,表示0到5伏之间的电压。所以如果analogRead()要输出到analogWrite()要除以4或者用map函数映射.使用方法:map(值,0,1023,0,255)

数字输出输入示例:

int anniu = 2;  // 按钮连接到引脚2     用int代替#define
int deng = 13;    // LED连接到引脚13
void setup() {
  pinMode(anniu, INPUT);   // 设置按钮引脚为输入
  pinMode(deng, OUTPUT);     // 设置LED引脚为输出
}
void loop() {
  if (digitalRead(anniu) == HIGH) {
    digitalWrite(deng, HIGH);  // 如果按钮被按下,点亮LED
  } 
else {
    digitalWrite(deng, LOW);   // 如果按钮没有被按下,关闭LED
  }
}

模拟输入输出示例:

int dianweiqi = A0; // 电位器连接到模拟引脚A0
int deng = 9; // LED连接到引脚9,只有3 5 6 9 10 11可用
void setup() {
  pinMode(dianweiqi, INPUT);   // 设置电位器引脚为输入
pinMode(deng, OUTPUT); // 设置LED引脚为输出
}
void loop() {
  analogWrite(deng, map(analogRead(dianweiqi), 0, 1023, 0, 255));  // 映射0-1023为0-255
  delay(10); // 小延迟,避免读取过于频繁
}

3.练习:按住按钮灯的亮度可调,松开按钮灯的亮度不可调

Arduino c语言基本知识3

1.函数,局部变量与全局变量

除了setup与loop外还可以有别的函数
例如:程序运行后1秒后开灯可以这么写

void setup () {
pinMode(13,OUTPUT);
}
void turnonled(){
digitalWrite(13,High);
}
void loop(){
delay(1000);
turnonled();
}
    void setup () {
pinMode(A0, INPUT);
pinMode(11,OUTPUT);
}
int getXbeiA0(float x){        //形式参数
return x*analogRead(A0);
}
void loop(){
delay(1000);
analogWrite(11,getXbeiA0(0.25));//实参
}

在函数或代码块内部,称为局部变量。在所有函数之外,称为全局变量。

void setup () {
}
void loop () {
   int x=0 , y=0 ; //局部变量只能内部中使用
}    int x=0 , y=0 ; //全局变量可以到处使用
void setup () {
}
void loop () {
}

2.算术运算符、比较运算符、布尔运算符、复合运算符

运算符名称 简写 例子
赋值运算符 = A = B
加号 + A + B将得出30
减号 - A - B将得出-10
乘号 A B将得出200
除号 / B / A将得出2
模数 % B % A将得出0

运算符名称    运算符简写    例子

等于 == (A == B)不为真
不等于 != (A != B)为真
小于 < (A < B)为真
大于 > (A > B)不为真
小于或等于 <= (A <= B)为真
大于或等于 >= (A >= B)不为真

运算符名称 简写 例子
and(与) && (A && B)为真
or(或) || (A || B)为真
not(非) ! !(A && B)为假

运算符名称    运算符简写    例子

自增 ++ A++ 将得出11
自减 -- A-- 将得出9
复合加 += B += A 等效于 B = B + A

3.作业:

编写一个由电位器控制的正方形周长计算器,通过串口打印出边长及计算结果,通过按压一个按钮进行暂存,在按钮按下后打印出暂存的累加结果。例:
第1次:边长为10;周长为40,累加结果为40。

Arduino c语言基本知识4

1.条件控制(选择语句)与循环语句

If 语句
If … else 语句
If … else if … else 语句
switch case 语句 while循环
do…while循环
for循环
嵌套循环与无限循环
例子

int A = 5 ;
int B = 9 ;
Void setup () {
}
Void loop () {
   If ( ( A < B ) && ( B != 0 )) { 
      A += B;
      B--;
   }
   if (A > B)  {
      A++;
   }else {
      B -= A;
   }
}

例子

switch (dengji) {
   case 0: di(); break;
   case 1: zhong(); break;
   case 2: gao(); break;
   default: xiaoxi("cuole!");
}
while(条件) {

条件为真执行的语句
}

do {
条件为真执行的语句
}
while (条件);

for( i = 2; i <= 9; i++) {
每次循环都会把第一个语句中的变量i的值与中间语句对比,如果为真则执行第三个语句
}

for(counter = 0;counter <= 9;counter++) {
   for(i = 0;i <= 99;i++) {
   }
}//共执行了10*100=1000次

无限循环语句语法
使用for循环for (;;) {语句}
使用while循环while(1) {语句}
使用do ... while循环
do {语句} while(1);

2.时间函数

delay() 函数以毫秒为单位。delayMicroseconds() 函数微秒。
millis() 函数返回Arduino板开始运行当前程序时的毫秒数。
micros() 函数micros()函数返回微秒数。该数字在大约70分钟后溢出,即回到零。

3.数组:声明数组并使用循环来初始化数组的元素;使用初始化器列表在声明中初始化数组

int n[ 10 ] ; 
void setup () {
    Serial.begin(9600); //串口初始化 
}
void loop () {
   for ( int i = 0; i < 10; ++i ){ 
    n[ i ] = 0; 
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ){  
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}    int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;
void setup () {
    Serial.begin(9600); //串口初始化 
}
void loop () {
   for ( int i = 0; i < 10; ++i ){ 
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ){ 
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}

Arduino c语言基本知识5

1.练习平台

编程小伙伴测评网:http://www.cierobot.com
账号:吴禹锡nbsz008,王明善nbsz009,刘奇彦nbsz010

2.突破平台复制限制

点edge浏览器上的扩展,获取Microsoft edge扩展,搜索copy,安装第一个Supreme Copy,然后在所在网页上打开这个扩展的Enable extension on this website按钮即可复制。

3.小练习:

交通灯A位于主路,交通灯B位于支路,正常情况下,两个交通灯的黄灯时间为2秒,绿灯时间为12秒,其中当绿灯时间还剩下2秒时,绿灯以200毫秒的频率闪烁,提示车辆即将变灯。在早晚高峰拥堵时段,主路的绿灯时间根据拥堵情况在12~20秒之间可调。
(1)装置启动后,交通灯A和交通灯B按照正常的规则,交替工作。交通灯的亮灯顺序为绿灯、黄灯、红灯;
(2)旋转电位器,实现主路交通灯A的绿灯时长在12~20秒之间可调;

4.红外遥控,红外遥控这种复杂程序一般都是在参考资料下修改的。注意这里用的IRremote库是2.6.0版本的,太新的库程序不同,无法使用。

参考资料:

#include <IRremote.h>    //导入红外控制库,在arduino软件的工具-管理库-搜索IRremote
const int RECV_PIN = 12;  //const int 定义整数常量
IRrecv irrecv(RECV_PIN);  //创建名为IRrecv的红外接收对象
decode_results results;   //创建名为decode_results对象,用于存储解码后的结果
void setup(){
    Serial.begin(9600);
    irrecv.enableIRIn();   //启动红外接收
}
void loop() {
if (irrecv.decode(&results)) {  // 如果接收到红外信号并解码成功
        Serial.println(results.value, HEX);// 以十六进制格式打印接收到的信号
        irrecv.resume();// 准备接收下一个信号
    }
    delay(100);
}

5.小练习:

通过多次点击红外遥控器的按键1,实现LED灯不同状态的循环显示,具体说明如下:
(1)初始状态:LED_A和LED_B均处于熄灭状态;
(2)第1次按下按键1后,LED_A点亮,LED_B熄灭;
(3)第2次按下按键1后,LED_A熄灭,LED_B点亮;
(4)第3次按下按键1后,LED_A和LED_B均点亮;
(5)第4次按下按键1后,LED_A和LED_B持续闪烁;
(6)第5次按下按键1后,LED_A和LED_B均回归到熄灭状态,依此反复;

Arduino c语言基本知识6

1.Led按照不同频率亮灯同时闪烁或交替闪烁问题

void setup() {
  pinMode(11, OUTPUT);
}
int ledDelay = 1000;  //改变它就能改频率
long timeold = 0;

void loop() {
  if (millis() - timeold > ledDelay) {
digitalWrite(11, !digitalRead(11));
digitalWrite(13, !digitalRead(13));
    timeold = millis();
  }
}    void setup() {
  pinMode(11, OUTPUT);
}
int ledDelay = 1000;  //改变它就能改频率
long timeold = 0;

void loop() {
  if (millis() - timeold > ledDelay) {
digitalWrite(11, !digitalRead(11));
digitalWrite(13, !digitalRead(11));
    timeold = millis();
  }
}

2.基本知识5最后一题的另一种答案

#include <IRremote.h>
const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();  //启动红外接收
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
}

int zuangtai = 0;
int ledDelay = 500;  //改变它就能改频率
long timeold = 0;
int kaishishan = 0;

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 0xFF41BE) {
      zuangtai++;
      switch (zuangtai) {
        case 1:
          digitalWrite(11, HIGH);
          digitalWrite(13, LOW);
          break;
        case 2:
          digitalWrite(11, LOW);
          digitalWrite(13, HIGH);
          break;
        case 3:
          digitalWrite(11, HIGH);
          digitalWrite(13, HIGH);
          break;
            
case 4:
          kaishishan = 1;
          break;
        case 5:
          digitalWrite(11, LOW);
          digitalWrite(13, LOW);
          zuangtai = 0;
          kaishishan = 0;
          break;
      }
    }
    Serial.println(results.value, HEX);
    irrecv.resume();  // 准备接收下一个信号
  }

  if (kaishishan == 1) {
    if (millis() - timeold > ledDelay) {
      digitalWrite(11, !digitalRead(11));
      digitalWrite(13, !digitalRead(13));
      timeold = millis();
    }
  }
}

Arduino c语言基本知识5(简易答案)

上一页最后一题的答案

int zhuhong = 13, zhuhuang = 12, zhulv = 11;
int zhihong = 10, zhihuang = 9, zhilv = 8;

void setup() {
  for (int i = 8; i <= 13; i++) {
    pinMode(i, OUTPUT);
  }
  pinMode(A0, INPUT);
}

void loop() {
  digitalWrite(zhuhuang, LOW);//上一状态关
  digitalWrite(zhihuang, LOW);
  digitalWrite(zhuhong, HIGH);//主红亮
  digitalWrite(zhilv, HIGH);//支绿亮
  delay(10000);
  for (int i = 0; i < 5; i++) {//绿灯闪烁
    digitalWrite(zhilv, LOW);
    delay(200);
    digitalWrite(zhilv, HIGH);
    delay(200);
  }
  digitalWrite(zhuhong, LOW);//主红灭
  digitalWrite(zhilv, LOW);//支红灭
  digitalWrite(zhuhuang, HIGH);//黄亮
  digitalWrite(zhihuang, HIGH);
  delay(2000);
  digitalWrite(zhuhuang, LOW);
  digitalWrite(zhihuang, LOW);
  digitalWrite(zhihong, HIGH);
  digitalWrite(zhulv, HIGH);//主绿亮
  delay(10000);
  delay(map(digitalRead(A0),0,1023,0,8000));//
  for (int i = 0; i < 5; i++) {
    digitalWrite(zhulv, LOW);
    delay(200);
    digitalWrite(zhulv, HIGH);
    delay(200);
  }
  digitalWrite(zhihong, LOW);
  digitalWrite(zhulv, LOW);
  digitalWrite(zhihuang, HIGH);
  digitalWrite(zhuhuang, HIGH);
  delay(2000);
}
    #include <IRremote.h>
const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();  //启动红外接收
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
}

int zuangtai = 0;
int kaishishan = 0;
void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 0xFF41BE) {
      zuangtai++;
      if(zuangtai == 1) {
          digitalWrite(11, HIGH);
          digitalWrite(13, LOW);
      }
      if(zuangtai == 2) {
          digitalWrite(11, LOW);
          digitalWrite(13, HIGH);
      }
      if(zuangtai == 3 ) {
          digitalWrite(11, HIGH);
          digitalWrite(13, HIGH);
      }
      if(zuangtai == 4) {
          kaishishan = 1;
      }
      if(zuangtai == 5 ) {
          digitalWrite(11, LOW);
          digitalWrite(13, LOW);
          zuangtai = 0;
          kaishishan = 0;
      }
    }
    Serial.println(results.value, HEX);
    irrecv.resume();  // 准备接收下一信号
  }

  if (kaishishan == 1) {
    digitalWrite(11,HIGH);
    digitalWrite(13,HIGH);
    delay(100);
    digitalWrite(11,LOW);
    digitalWrite(13,LOW);
    delay(100);
  }
}

Arduino c语言基本知识7

1.超声波测距原理

用数字引脚给超声波的Trig引脚10μs的高电平信号,可触发超声波模块测距功能。如有信号返回, Echo 引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。使用pulseIn()函数获取高电平持续的us时间,声速约340m/s=0.034cm/us,由于信号往返,所以
距离≈时间×0.034÷2≈时间÷58 cm

2.超声波测距代码:

int fasongT =12,jieshouE=13;

void setup() {
Serial.begin(9600);
pinMode(fasongT, OUTPUT);
pinMode(jieshouE, INPUT);
}

void loop() {
digitalWrite(fasongT, HIGH);
delayMicroseconds(10);
digitalWrite(fasongT, LOW);
Serial.print(pulseIn(jieshouE, HIGH)/58);
Serial.println("cm");
}

3.舵机控制原理

舵机使用pwm脉冲信号控制,通过改变占空比实现,虽然analogWrite()也能产生pwm脉冲信号,但是由于频率不同,使用analogWrite()控制舵机不可行。
题目会给舵机类库的参考资料:
头文件: Servo.h
类库对象:Servo
成员函数:attach(Pin) //指定引脚的关联引脚

      write(angle) //功能是让舵机转动到指定的角度

4.舵机控制代码:

#include <Servo.h>
Servo myServo;  // 创建一个Servo对象
void setup() {
  myServo.attach(9);  // 将舵机连接到数字引脚9
}
void loop() {
  myServo.write(90);  // 将舵机移动到90度位置
  delay(1000);        // 等待1秒
  myServo.write(0);   // 将舵机移动到0度位置
  delay(1000);        // 等待1秒
}

Arduino c语言基本知识8

1.基于状态机的编程,使用按键时的注意事项示例

#include <Servo.h>//导入舵机控制库
Servo servo;      //创建名为servo的舵机对象
int zhuangtai = 0;//初始化状态机的值

void setup() {
  servo.attach(12);//舵机servo对象的attach连接口属性
  pinMode(8,INPUT);
  pinMode(13, OUTPUT);
}                     // 注意不要把12再设置成OUTPUT,否则不转了

void loop() {
  if (digitalRead(8) == HIGH) {  
    zhuangtai++;      //按下后状态更新
    if (zhuangtai == 3) {
      zhuangtai = 0;  //状态不能超过2,等到3则回归
    }
    while (digitalRead(8) == HIGH) {}  //等松开
  }
//开始判断状态
  if (zhuangtai == 0) {  //状态0,灯闪烁
    digitalWrite(13, !digitalRead(13));
    delay(100);
  }
  if (zhuangtai == 1) {  //状态1,快摆
    servo.write(30);
    delay(300);
    servo.write(90);
    delay(300);
  }
  if (zhuangtai == 2) {//状态2,慢摆
    servo.write(30);
    delay(600);
    servo.write(90);
    delay(600);
  }
}    /////注意,这个程序要一直按足够长时间才会生效

2.电机控制

三线控制 二线控制第一种 二线控制第二种
一条pwm调速,另两条10正转,01反转,11刹车 不用调速则所有io口都可用,需要正反向调速则INA和INB两条线至少1条支持模拟输出(3 5 6 9 10 11)。
比如INA接3,INB接4,
以50%的功率正转:
analogWrite(3,128); digitalWrite(4,LOW);
以50%的功率反转:
analogWrite(3,128); digitalWrite(4,HIGH), 不用调速则所有io口都可用,需要正反向调速则INA和INB两条线都要支持模拟输出(3 5 6 9 10 11)。
比如INA接3,INB接5,
以50%的功率正转:
analogWrite(3,128); analoglWrite(5,0);
以50%的功率反转:
analogWrite(3,0); analogWrite(4,128),

3.电机控制参考程序

二线控制第一种:至少1条支持模拟输出

const int inA = 5;  // PWM引脚
const int inB = 4;  // 数字引脚

void setup() {
  pinMode(inA, OUTPUT);
  pinMode(inB, OUTPUT);
}

void loop() {
  // 电机正转且速度为50%
  digitalWrite(inB, LOW);         // 保持INB为低电平
  analogWrite(inA, 128);          // 在INA上应用50%的PWM信号

  delay(2000); // 保持电机正转2秒

  // 停止电机
  digitalWrite(inA, LOW);
  digitalWrite(inB, LOW);

  delay(1000); // 停止1秒

  // 电机反转且速度为75%
  digitalWrite(inB, HIGH);        // INB为高电平
  analogWrite(inA, 192);          // 在INA上应用75%的PWM信号

  delay(2000); // 保持电机反转2秒

  // 停止电机
  digitalWrite(inA, LOW);
  digitalWrite(inB, LOW);

  delay(1000); // 停止1秒
}

二线控制第二种:两条线都要支持模拟输出

const int inA = 10;  // PWM引脚
const int inB = 9; // PWM引脚

void setup() {
  pinMode(inA, OUTPUT);
  pinMode(inB, OUTPUT);
}

void loop() {
  // 电机正转且速度为50%
  analogWrite(inA, 128);           // INA为50%的PWM信号
  analogWrite(inB, 0);             // INB为0(低电平)

  delay(2000); // 保持电机正转2秒

  // 停止电机
  analogWrite(inA, 0);
  analogWrite(inB, 0);

  delay(1000); // 停止1秒

  // 电机反转且速度为75%
  analogWrite(inA, 0);         // INA为0(低电平)
  analogWrite(inB, 192);           // INB为75%的PWM信号

  delay(2000); // 保持电机反转2秒

  // 停止电机
  analogWrite(inA, 0);
  analogWrite(inB, 0);

  delay(1000); // 停止1秒
}

发表评论