文章目录
前言
本文以介绍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 -控制输出数据0、1; //改变寄存器引脚电平状态
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);
}