【Arduino学习】一、IO口操作


前言

本文以介绍Arduino为开端,主要介绍Arduino开发中IO口操作的基础内容,包括IO口的基本认识,操作函数和寄存器操作等内容。


所需材料:

1.Arduino开发环境:Arduino IDE 1.8.10
2.仿真软件:Proteus 8.13
3.开发板:Arduino UNO

一、Arduino概述

1.什么是Arduino

Arduino 是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。Arduino能通过各种各样的传感器来感知环境,并通过其他的装置来反馈、影响环境。
Arduino开发板子上的微控制器可以通过Arduino的编程语言来编写程序,Arduino的编程是利用 Arduino编程语言和Arduino开发环境来实现的,将编写的程序编译成二进制文件,烧录进微控制器。基于Arduino的开发,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件或者其他类型的开发平台,他们之间进行通信来实现。

2.Arduino UNO

Arduino UNO的开发板如下图所示,Arduino UNO开发板以ATMEGA328P为主控芯片,以外部晶振(图中未标出)产生16MHz的时钟信号供Arduino UNO工作使用。
在这里插入图片描述

二、I/O口介绍

1.I/O口

I/O口即 Input Output,即计算机中的输入输出端口,用于 CPU 与外界进行信息交互。信息在 I/O 系统上传输有并行或并行,所谓串行就是数据在一条线上传输,并行就是数据在多条线上传输,即并行一次传输多个bit,串行每次传输一个bit。

2.GPIO口

GPIO,英文全称为General-Purpose IO ports,意思为通用输入/输出端口。
这些端口可以通过它们输出高低电平或者通过它们读入引脚的状态——是高电平或是低电平。用户可以通过它们实现外来设备之间的通信,控制其他外来设备工作,读取外来设备的工作状态等。
在微控制器芯片上一般都会提供“通用可编程I/O接口”。接口至少有两个寄存器,即“控制方向寄存器”与“数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对数据寄存器中每一位的作用,即每一位的信号流通方向是输入还是输出,则能够通过控制寄存器中相应位独立的加以设置。这样,有无 IO 接口也就成为微控制器差别于微处理器的一个特征。(不同的单片机,寄存器配置不一样)
对单片机的控制,其实就是对I/O口的控制,无论单片机对外界进行何种控制,或接受外部的控制,都是通过 I/O 口进行的。掌握了 I/O 口,差不多相当于掌握了操作硬件的能力。

三、I/O 操作函数

1.设置I/O口的工作状态

代码如下:

pinMode(pin,mode);
  /*描述:设置IO口(pin)的工作模式(mode)
   *参数:pin为端口号,可以设置为0-19,0-13为数字IO口,14-19为模拟IO口,分别对应
   *     A0-A5,也可以直接设置A0-A5。
   *     mode为模式,有三种:
   *           OUTPUT:输出模式,默认输出低电平,最大电流40mA
   *           INPUT :输入模式,悬空时逻辑电平不确定
   *           INPUT_PULLUP:上拉输入模式,悬空时逻辑电平确定为高
   */

2.设置I/O端口输出

代码如下:

digitalWrite(pin,mode);
  /*描述:设置IO口(pin)的输出模式(mode)
   *参数:pin为端口号,可以设置为0-19,0-13为数字IO口,14-19为模拟IO口,分别对应
   *     A0-A5,也可以直接设置A0-A5。
   *     mode是要设置的模式,可设置为
   *           HIGH:输出高电平,或写作1
   *           LOW:输出低电平,或写作0   
   */

3.设置I/O端口读取

state = digitalRead(pin);
   /*描述:读取IO口(pin)的电平值
    *参数:pin为端口号,可以设置为0-19,0-13为数字IO口,14-19为模拟IO口,分别对应
    *     A0-A5,也可以直接设置A0-A5。
    *     state为返回值,结果为1(高电平)或0(低电平)。
    *注意:不管设置为输入模式,还是输出模式的端口都可以使用该函数读取IO口的电平状态,
    *     但是IO口的工作模式在输入模式时为高阻态,为输出模式时为低阻态,高阻态情况下,
    *     微弱电流信号也可以检测到,低阻态则不可以,故对于传感器的电平检测应设置输入
    *     模式。(电流一定时,电阻越大,电压变化越大。)
    */

四、I/O 口的寄存器操作

1.I/O口端口寄存器

在Arduino UNO中,D0–D7是PD寄存器,D8–D13是PB寄存器,A0–A5+RESET是PC寄存器,每一个寄存器共8位,编号分别为0-7。

2.寄存器操作

DDRx ---------控制输出方向; //设定寄存器引脚输入输出模式(0:输入;1:输出)
PORTx -控制输出数据01//改变寄存器引脚电平状态
PINx —控制(读取)输入数据; //读取寄存器引脚的电平状态
//指令中的x表示的要使用的寄存器

比如要使用PD的中的D7号引脚和D4号引脚,我们就用到了PD寄存器,将D7设置为输出模式,D4号引脚设置为输入模式并且使D7号引脚输出高电平,那么就是

DDRD = 0x80
PORTD = 0x80
state = PIND

示例

电路图如图所示,尝试实现第一次按下按键BUTTON时,板上的LED灯点亮,再次按下时,LED灯熄灭,如此往复。
在这里插入图片描述

int state;
int a = 0;//记录灯的状态
int b = 0;//记录按键次数
void setup() 
{
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
  pinMode(12,INPUT_PULLUP);
  digitalWrite(13,0);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  state = digitalRead(12);  //读取状态
  if((state == 1)&&(b == 0)&&(a == 0))//没按下
  {
    a = 0;
  }
  if((state == 0)&&(b == 0)&&(a == 0))//按下一次
  {
    delay(10);
    b = 1;
  }
  if((state == 1)&&(b == 1)&&(a == 0))//按下一次后改变状态
  {
    a = 1;
  }
  if((state == 0)&&(b == 1)&&(a == 1))//按下两次
  {
    delay(10);
    b = 2;
  }
  if((state == 1)&&(b == 2)&&(a == 1))//按下两次后改变状态
  {
    a = 0;
    b = 0;
  }
  digitalWrite(13,a);
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会帮您修改代码以适应您的硬件连接。以下是修改后的Arduino代码: ```cpp #include <Stepper.h> #include <Adafruit_TCS34725.h> // 定义步进电机驱动模块的引脚 #define IN1 8 #define IN2 9 #define IN3 10 #define IN4 11 // 定义步进电机的步数和转速 const int stepsPerRevolution = 200; const int motorSpeed = 60; // 创建一个 Stepper 对象 Stepper stepper(stepsPerRevolution, IN1, IN3, IN2, IN4); // 创建一个 Adafruit_TCS34725 对象 Adafruit_TCS34725 colorSensor = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); void setup() { // 初始化步进电机 stepper.setSpeed(motorSpeed); // 启动颜色传感器 colorSensor.begin(); // 将颜色传感器的引脚设置为输入模式 pinMode(A4, INPUT); pinMode(A5, INPUT); } void loop() { // 读取颜色传感器的值 uint16_t r, g, b, c; colorSensor.getRawData(&r, &g, &b, &c); // 如果检测到红色 if (r > g && r > b) { // 向左旋转步进电机90° stepper.step(-90); delay(1000); // 停顿1秒 } // 如果检测到蓝色 else if (b > r && b > g) { // 向左旋转步进电机90° stepper.step(90); delay(1000); // 停顿1秒 } } ``` 这段代码假设您使用的是Adafruit TCS34725颜色传感器和ULN2003步进电机驱动模块。请确保已经将Adafruit TCS34725库安装到您的Arduino开发环境中。 此代码将颜色传感器连接到Arduino的I2C总线,其中SCL引脚连接到A5,SDA引脚连接到A4。步进电机驱动模块的引脚连接与之前一样。 代码会读取颜色传感器检测到的红色和蓝色分量,并根据分量的大小来控制步进电机的旋转方向。如果检测到红色,步进电机将向左旋转90°;如果检测到蓝色,步进电机将向左旋转90°。 请注意,使用I2C总线时,无需显式设置引脚模式。 希望这次能满足您的需求!如果您还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值