本篇内容在熟知51单片机与C语言基础上编写
一,开发板介绍和引脚图
USB接口用于下载程序,电源输入和烧录驱动等等。BOOT启动模式选择,按下为下载模式,放开为运行模式。ESP-32-WROOM-32模组集成了蓝牙,wifi等模块
共48个引脚。但并不是所有引脚都暴露在外面,有些引脚不能使用就没有暴露出来。这个单片机就只有30个引脚。ESP32芯片有34个可编程的GPIO引脚,每个引脚执行多个功能
二,开发方式
三,编程基础
在Arduino IDE中变量的声明必须放在文件开始。Arduino支持的变量类型有int float char bool string等
Arduino中的void setup()函数是在开发板通电或者复位后执行的初始化程序(比如配置IO口状态,初始化串口等等),只会执行一次。void loop(){}函数是一个死循环,里面的程序会不断执行
Arduino常见函数介绍:
四,Arduino控制ESP32GPIO口输入输出
ESP32上D开头的引脚就是GPIO引脚,只是输入和输出两种模式
1,输出模式
以下为LED闪烁实验代码
int led_pin = 12;
void setup()
{
pinMode(led_pin, OUTPUT);
}
void loop()
{
digitalWrite(led_pin, HIGH);
delay(1000); //1s
digitalWrite(led_pin, LOW);
delay(1000);
}
点亮流水灯
int pin_list[5] = {13, 12, 14, 27, 26};
int len = sizeof(pin_list) / sizeof(pin_list[0]); //数组长度
void setup()
{
for(int i=0;i<num;i++)
{
pinMode(pin_list[i], OUTPUT);
}
}
void loop()
{
for(int i=0;i<num;i++)
{
digitalWrite(pin_list[i], HIGH);
delay(50);
}
for(int i=0;i<num;i++)
{
digitalWrite(pin_list[i], LOW);
delay(50);
}
}
2,输入模式
设置引脚的输入模式pinMode(1, INPUT)
设置为上拉输入模式pinMode(1, INPUT_PULLUP)
设置为下拉输入模式pinMode(1, INPUT_PULLDOWN)
五,数码管
数码管按照显示位数分为1位,2位,3位,4位,5位,6位,7位等数码管。其基本单元仍然是LED
按发光二极管的连接方式可分为共阳极数码管和共阴极数码管。在数码管引脚图中,COM就是公共端,共阴数码管这个COM端接地,共阳数码管接电源正极,剩下的abcdefg被称为段选线,分别对应不同位置的LED。
1,一位数码管
接线
int pin_a = 4;
int pin_b = 5;
int pin_c = 19;
int pin_d = 21;
int pin_e = 22;
int pin_f = 2;
int pin_g = 15;
int pin_dp = 18;
//定义存放所有输出引脚的数组
int pin_array[8] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp}
//定义数字显示逻辑的二维数组
int number_array[][8] =
{//a,b,c,d,e,f,g,dp
{0, 0, 0, 0, 0, 0, 1, 1},//0
{1, 0, 0, 1, 1, 1, 1, 1},//1
{0, 0, 1, 0, 0, 1, 0, 1}//2
//以及3 4 5 6 7 8 9几个数字,这里就不一一列举了
};
//定义显示数字的函数
void display_number(int num)
{
for(int i=0;i<8;i++)
{
digitalWrite(pin_array[i], number_array[num][i]);
}
}
void setup()
{
for(int i=0;i<8;i++)
{
pinMode(pin_array[i], OUTPUT);
digitalWrite(pin_array[i], LOW);//初始化所有引脚为高电平,即默认不亮
}
}
void loop()
{
display_number(2);//显示数字2
}
2,四位数码管
(1)原理
1位数码管有两个相同的公共(COM)端,而4位数码管没有公共端,但是有四个控制不同位置显示的选通端。如下图,SEG1 SEG2 SEG3 SEG4就是四个独立的选通端(也可以看作公共端),SEG1就是控制第一个数码管亮灭,SEG2控制第二个。选通端是相互独立的,而负责显示数字的段选线是接到一起的。 一位数码管10个引脚,四位数码管12个引脚
下图所示的D0 D1 D2 D3就是选通端(位选线),也就是四位数码管的公共端,相互独立。上面的八根段选线全都是接到一起的。独立的公共端决定哪一个数码管点亮,连在一起的段选线控制点亮的数码管亮什么数字
接线图
(2)静态显示
// 定义位选线引脚
int seg_1 = 5;
int seg_2 = 18;
int seg_3 = 19;
int seg_4 = 21;
// 定义位选线数组;
int seg_array[4] = {seg_1, seg_2, seg_3, seg_4};
// 定义段选线引脚
int a = 32;
int b = 25;
int c = 27;
int d = 12;
int e = 13;
int f = 33;
int g = 26;
int dp = 14;
// 定义段选线数组
int led_array[8] = {a, b, c, d, e, f, g, dp};
// 定义共阴极数码管不同数字对应逻辑电平的二维数组
int logic_array[10][8] = {
//a, b, c, d, e, f, g, dp
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0}, // 9
};
void setup() {
// 设置所有的位选线引脚为输出模式,初始化所有的位选线引脚为高电平
for (int i=0;i<4;i++) {
pinMode(seg_array[i], OUTPUT);
digitalWrite(seg_array[i], HIGH);
}
// 设置所有的段选线引脚为输出模式,初始化所有的段选线引脚为低电平
for (int i=0;i<8;i++){
pinMode(led_array[i], OUTPUT);
digitalWrite(led_array[i], LOW);
}
}
void loop() {
// display_number(2, 4);
// delay(1000);
// 按顺序让所有位置显示0-9
for (int i=0;i<4;i++) {
for (int j=0;j<10;j++) {
display_number(i, j);
delay(200);
}
}
}
void display_number(int order, int number) {
// 清屏
clear();
// 设置对应的位选线引脚为低电平
digitalWrite(seg_array[order], LOW);
// 给对应的段选线引脚设置对应的电平
for (int i=0;i<8;i++) {
digitalWrite(led_array[i], logic_array[number][i]);
}
}
void clear(){
// 设置所有的位选线引脚为输出模式,初始化所有的位选线引脚为高电平
for (int i=0;i<4;i++) {
pinMode(seg_array[i], OUTPUT);
digitalWrite(seg_array[i], HIGH);
}
// 设置所有的段选线引脚为输出模式,初始化所有的段选线引脚为低电平
for (int i=0;i<8;i++){
pinMode(led_array[i], OUTPUT);
digitalWrite(led_array[i], LOW);
}
}
(3)动态显示
动态扫描是对位选线进行扫描,通过刷新位选线来实现显示多个数字的效果
// 定义位选线引脚
int seg_1 = 5;
int seg_2 = 18;
int seg_3 = 19;
int seg_4 = 21;
// 定义位选线数组;
int seg_array[4] = {seg_1, seg_2, seg_3, seg_4};
// 定义段选线引脚
int a = 32;
int b = 25;
int c = 27;
int d = 12;
int e = 13;
int f = 33;
int g = 26;
int dp = 14;
// 定义段选线数组
int led_array[8] = {a, b, c, d, e, f, g, dp};
// 定义共阴极数码管不同数字对应逻辑电平的二维数组
int logic_array[10][8] = {
//a, b, c, d, e, f, g, dp
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1,