写在正文前的话
今天在书上看到Arduino语言的相关资料时,书本用两行代码表示了在传统AVR单片机开发中,将一个I/O口设置为输出高电平状态下需要以下操作:
DDRB |= (1<<5);
PORTB |= (1<<5);
其中PORTB和DDRB都是AVR单片机中的寄存器。
我在上半学期上嵌入式的课的时候,还有好多同学不知道这些逻辑运算符到底表示什么意思,就在这解释一下。(以后的文章碰到有关C语言或者硬件的知识点,我也会写在文中或下一次的正文前)
常见的三种基本运算:
运算符 | 中文意思 |
---|---|
&= | 与运算 |
^= | 异或运算 |
1 = | 或运算 |
P.S. 这里的或运算符打不出来,论坛的编辑器会自动转成表格,一次用1代替。
&=
x=0x02;//0x02
x&=0x01;//0x01
//0x00按位与后的结果
这里的x &= 0x01 可以看成 x= x & 0x01, 与运算可以看为是按位进行乘法。
|=
x=0x02;//0x02
x&=0x01;//0x01
//0x03 按位或运算的结果
这里的x |= 0x01 可以看成 x= x | 0x01, 与运算可以看为是按位进行加法。
^=
x=0x02;//0x02
x&=0x01;//0x01
//0x03 按位异或运算的结果
这里的x ^= 0x01 可以看成 x= x ^ 0x01
口诀:相同取0,相异取1。
正文
数字I/O口的使用
1、数字信号
数字信号是以0,1表示的不连续信号。也就是以二进制形式表示的信号,在Arduino中数字信号用高低电平来表示。高电平为数字信号1,低电平为数字信号2。包括写有“A”编号的模拟输入引脚。使用这些引脚可以完成输入或输出数字信号的功能。在使用输入或输出功能前,需要先通过pinMode()函数配置引脚的模式为输入模式或输出模式。
pinMode(pin,mode);
其中pin表示指定配置的引脚编号,mode为指定配置的模式
可使用的三种模式如下表所示:
模式名称 | 说明 |
---|---|
INPUT | 输入模式 |
OUTPUT | 输出模式 |
INPUT_PULLUP | 输入上拉模式 |
配置为输出模式之后,还需要用digitaiWrite()函数使该引脚输出高电平或低电平。其调用形式为;
digitalWrite(pin,value);
value为要指定的输出电平,使用HIGH指定输出高电平,使用LOW指定输出低电平。
数字引脚除了用于输出信号外。还可用digitalRead()函数读取外部输入的信号。其调用形式为:
digitalRead(pin);
当Arduino以5V供电时,会将范围为-0.5~1.5V的输入电压作为低电平识别。而将范围在3-3.5V的输入电压作为高电平。所以即使输入电压不太准确,Arduino也可以正常识别。
P.S. 过高的输入电压会损坏Arduino
现在写文章的时间是2021年1月11日19:14:21,打算做第一个实验,流水灯闪烁,就以上面说的三种函数为范围来写。
首先,学过51和32的都知道,第一步是要配置I/O口,我们会用到这条:
pinMode(i, OUTPUT);
又因为要做的是流水灯,所以肯定得有一个for循环来轮流配置。有一说一,一行一次定义一个I/O口在我看来着实挺蠢的。那么在配置端口的前面套一个循环,如下:
{
for (int i = 2; i < 8; i++)
pinMode(i, OUTPUT);
}
第二步
要让流水灯逐个亮再逐个灭,除了要给循环之外,还需要给发光二极管高低电平。这时候就需要digitalWrite()
来给电平。那么先亮再灭,所以先给高,再给低:
digitalWrite(i, HIGH);
delay(1000);
digitalWrite(i, LOW);
我们来看一下板子
先从2-7的依次亮灭,再是7-2的依次亮灭,因此我们需要的是两个不同条件的for循环:
for (int i = 2; i < 7; i++)
for (int i = 7; i > 2; i--)
所以最后程序应该是:
void setup()
{
for (int i = 2; i < 8; i++)
pinMode(i, OUTPUT);
}
void loop()
{
for (int i = 2; i < 7; i++)
{
digitalWrite(i, HIGH);
delay(1000);
digitalWrite(i, LOW);
}
for (int i = 7; i > 2; i--)
{
digitalWrite(i, HIGH);
delay(1000);
digitalWrite(i, LOW);
}
}
P.S.注释我不写了,不会真有人看不懂吧,都1202了
那么我自己是还需要把实物做出来,买的套件里面有面包板杜邦线什么的。
需要5个220R的电阻,11条杜邦线,5个发光二极管,一个面包板,开发板+数据线。接线示意及成果如下:
Arduino Uno LED流水灯
视频看不了的话,网址如下:https://www.bilibili.com/video/BV1Ah41127Uo