Ardunio程序设计基础 一

本文详细介绍了Arduino编程的基础,包括项目结构中的setup和loop函数的作用,数字输入输出的pinMode、digitalWrite和digitalRead函数的使用方法,以及模拟输入输出的analogRead和analogWrite函数的应用。通过实例程序,帮助初学者快速掌握Arduino编程技巧。

一.项目结构
1.setup()
Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。
通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。 
示例程序
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);     
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop() 
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}
2.loop()
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。
通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。 
示例程序
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);     
}
3.Arduino程序main函数结构解析
在进行Arduino开发时,没有像传统C/C++程序使用入口函数main。实际上main函数存在于Arduino核心库中,且仍然是程序的入口。
在Arduino核心库中可见main.cpp文件,其内容如下: 
#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    return 0;
}
通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。
loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。 

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop() 
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}
二.数字输入输出
1.pinMode(pin, mode)
在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。 
参数
参数pin为指定配置的引脚编号
参数mode为指定的配置模式
通常可用模式有三种:
INPUT 输入模式
OUTPUT 输出模式
INPUT_PULLUP 输入上拉模式 

示例程序
/*
  Blink
等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
*/

// 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);     
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop() 
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}
2.digitalWrite(pin, value)
之前我们在Blink程序中使用到了pinMode(13, OUTPUT),即是把13号引脚配置为输出模式。
配置成输出模式后,你还需要使用digitalWrite() 让其输出高电平或者是低电平。 
参数
参数pin为指定输出的引脚编号;
参数value为你要指定输出的电平
使用HIGH指定输出高电平,或是使用LOW指定输出低电平。 
示例程序
/*
  Blink
等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
*/

// 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);     
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop() 
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}
其他说明
Arduino中输出的低电平为0V,输出的高电平为当前Arduino的工作电压。
例如Arduino UNO的工作电压为5V,其高电平输出也是5V;Arduino Uno工作电压为3.3V,所以高电平输出也就是3.3V。 
3.digitalRead(pin)
在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。 
参数
参数pin为指定读取状态的引脚编号。 
返回值
返回值为获取到的信号状态,1为高电平,0为低电平。 
示例程序
/*
通过2号引脚连接的按键,控制13号引脚连接的LED
*/

// 设置各引脚别名
const int buttonPin = 2;     // 连接按键的引脚
const int ledPin =  13;      // 连接LED的引脚

// 变量定义
int buttonState = 0;         // 存储按键状态的变量

void setup() {
  // 初始化LED引脚为输出状态
  pinMode(ledPin, OUTPUT);      
  // 初始化按键引脚为输入状态
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // 读取按键状态并存储在变量中
  buttonState = digitalRead(buttonPin);

  // 检查按键是否被按下
  // 如果按键按下,那buttonState应该为高电平
  if (buttonState == HIGH) {     
    // 点亮LED
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    // 熄灭LED
    digitalWrite(ledPin, LOW); 
  }
}
三.模拟输入输出
1.analogRead(pin)
模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。
它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
模拟输入功能需要使用analogRead() 函数。 
参数
参数pin是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。
如analogRead(A0),即是读取A0引脚上的模拟值。 
返回值
Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。 

示例程序
/*
光敏电阻检测环境光
http://www.arduino.cn/
*/

void setup()
{
  // 初始化串口
  Serial.begin(9600);
}
void loop() 
{
// 读出当前光线强度,并输出到串口显示
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1000);
}
2.analogWrite(pin,value)
使用analogWrite() 函数实现PWM输出功能。
在Arduino Uno中,提供PWM功能的引脚为3、5、6、9、10、11。 
在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。 
参数
参数pin是指定要输出PWM波的引脚;
参数value指定是PWM的脉冲宽度,范围为0~255。 
示例程序
/*
Fading
通过analogWrite() 函数实现呼吸灯效果
*/

int ledPin = 9;    // LED连接在9号引脚上

void setup()  { 
  // Setup部分不进行任何处理

void loop()  { 
  // 从暗到亮,以每次加5的形式逐渐亮起来
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);         
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 

  // 从亮到暗,以每次减5的形式逐渐暗下来
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);         
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 
}

Arduino程序设计基础实验说明文档Arduino编程学习例程40个合集: 实验 Hello World.docx 实验七 自动补光实验.docx 实验三 按键控制LED.docx 实验三十 红外接收.docx 实验三十 遥控家电.docx 实验三十三 电位器控制舵机角度.docx 实验三十二 认识舵机.docx 实验三十五 自动降温.docx 实验三十四 可调速小风扇.docx 实验九 声控灯.docx 实验二 流水灯.docx 实验二十 学会使用MQ2烟雾传感器.docx 实验二十 烟雾报警.docx 实验二十七 距离检测.docx 实验二十三 温度报警.docx 实验二十九 红外发射.docx 实验二十二 闯入报警.docx 实验二十五 串口控制RGBled调光.docx 实验二十八 74HC595.docx 实验二十六 超声波测距.docx 实验二十四 认识RGBled.docx 实验五 电位器控制呼吸灯频率.docx 实验八 检测声音大小.docx 实验六 光敏电阻检测光亮度.docx 实验十 触摸传感器的使用.docx 实验十七 简易电子琴.docx 实验十三 人体感应灯.docx 实验十九 外部中断触发蜂鸣器报警.docx 实验十二 人体感应模块的应用.docx 实验十五 蜂鸣器的使用.docx 实验十八 红外避障传感器的应用.docx 实验十六 播放音乐.docx 实验十四 电子温度.docx 实验四 呼吸灯.docx 拓展实验 12864.docx 拓展实验 1602显示串口数据.docx 拓展实验 DHT11温湿度检测模块的使用.docx 拓展实验 使用数字电位器AD5206.docx 拓展实验 制作电子时钟.docx 拓展实验1602 LCD的使用.docx
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值