网站如果不备案,网络推广引流最快方法,加强图书馆网站建设,诸城网站建设报价了解了一下位选线和段选线的知识#xff1a; 位选线#xff1a; 作用#xff1a;用于选择数码管的某一位#xff0c;例如4位数码管的第1位#xff0c;第2位#xff09; 通过控制位选线的电平#xff08;高低电平#xff09;#xff0c;决定当前哪一位数码管处于激活状…了解了一下位选线和段选线的知识 位选线 作用用于选择数码管的某一位例如4位数码管的第1位第2位 通过控制位选线的电平高低电平决定当前哪一位数码管处于激活状态。 示例 假设有4位数码管位选线分别位D1,D2,D3,D4. 如果要显示第2位设置D2 LOW或D2 HIGH其他位选线设置位相反电平。
段选线 作用用于控制数码管上某一位显示的具体数字或字符。 数码管的每一段如a,b,c,d,e,f,g,dp)对应一个段选线。 对于共阴极数码管 将某一段的段选线设置为高电平HIHG,该段点亮设置位LOW熄灭 对于共阳则相反。 示例要显示数字7需要点亮段a,b,c. 对于共阴极数码管设置a HIGHbHIGH.c HIGH其他位LOW。
意思就是位选线是切换数码管的位段就是一位数码管的那一小段。
为什么分阴阳极
1.电路设计灵活不同的电路设计可能需要不同的电平逻辑。
2.电源和接地方便性在某些电路中可能更容易提供高电平或低电平。
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 number_array[10][8] {{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 clear() {// 关闭所有位选线for (int i 0; i 4; i) {digitalWrite(seg_array[i], HIGH);}// 关闭所有段选线for (int i 0; i 8; i) {digitalWrite(led_array[i], LOW);}
}// 显示数字的函数
void display_number(int order, int number) {// 清屏clear();// 将对应位选线的电平拉低digitalWrite(seg_array[order], LOW);// 显示数字for (int i 0; i 8; i) {digitalWrite(led_array[i], number_array[number][i]);}
}// 4位数码管显示函数
void display_4_number(int number) {// 确保数字在 0 到 9999 之间if (number 0 number 10000) {// 获取每一位对应的数字int digits[4];for (int i 3; i 0; i--) {digits[i] number % 10;number / 10;}// 显示4位数for (int i 0; i 4; i) {display_number(i, digits[i]);delay(5); // 短暂延时避免闪烁}}
}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() {// 显示数字 34display_4_number(34);
}
按键实验
//定义开关引脚
int led_pin 2;
int button_pin 14;
//记录led状态是否更改过的值
bool status false;
int led_logic 0; // LED 的当前状态
void setup(){//配置引脚模式pinMode(led_pin,OUTPUT);pinMode(button_pin,INPUT_PULLDOWN);
}void loop(){//按键消抖//如果当前按钮与上次不同,说明按钮发生了变化if(digitalRead(button_pin)){//睡眠10ms如果依然是高电平说明是按下并非抖动delay(500);if(digitalRead(button_pin) !status){led_logic !led_logic;digitalWrite(led_pin,led_logic);//修改statusstatus !status;}else if(digitalRead(button_pin)){status false;}}}INPUT_PULLDOWN表示启用内部下拉电阻。
status用于记录按钮是否已经触发过状态切换避免按钮按下时多次出发LED状态的切换。
按钮消抖逻辑状态切换status作用时确保每次按钮按下只触发一次状态切换。切换LED状态后将status设置位true,避免重复触发。
宏定义与变量定义的区别 PWM呼吸灯
占空比一个周期内高电平出现时间占总的比例
频率1秒内信号从高电平到低电平再回到高电平的次数一秒钟PWM的周期次数
PWM主要通过输出不同频率占空比的方波实现固定频率或平均电压输出频率固定改变占空比可改变输出电压。
analogWrite函数在指定的引脚上输出一个PWM信号通过改变PWM信号的占空比控制输出电平的平均值从而实现对LED亮度、电机速度等的调整。
函数实现呼吸灯
#define LED_PIN 12void setup(){//配置GPIO输出pinMode(LED_PIN,OUTPUT);}
void loop(){//实现渐亮效果for(int i0;i256;i){analogWrite(LED_PIN,i);delay(10);}//实现渐灭效果for(int i255;i0;i--){analogWrite(LED_PIN,i);delay(10);}
}普通实现
#define FREQ 2000 // PWM 频率
#define CHANNEL 0 // PWM 通道
#define RESOLUTION 8 // PWM 分辨率8 位 0~255
#define LED 12 // LED 引脚void setup() {// 配置 LEDC 通道ledcSetup(CHANNEL, FREQ, RESOLUTION);// 将 LEDC 通道绑定到指定引脚ledcAttachPin(LED, CHANNEL);
}void loop() {// 实现渐亮效果for (int i 0; i (1 RESOLUTION); i) {ledcWrite(CHANNEL, i); // 设置 PWM 占空比delay(10); // 延迟 10ms}// 实现渐灭效果for (int i (1 RESOLUTION) - 1; i 0; i--) {ledcWrite(CHANNEL, i); // 设置 PWM 占空比delay(10); // 延迟 10ms}
}
ADC模数转换器
串口监视器是 Arduino IDE 提供的一个工具用于通过串口通信与开发板如 Arduino、ESP32 等进行数据交互。它的主要作用是1调试和监控程序运行2.发送数据到开发板3.实时查看传感器数据。4.交互式控制
#define POT 26 // 定义电位计连接的引脚int pot_value; // 用于存储电位计的模拟输入值void setup() {// 设置串口通信波特率Serial.begin(9600);// 设置引脚为输入模式可选pinMode(POT, INPUT);
}void loop() {// 读取电位计的模拟输入值pot_value analogRead(POT);// 打印模拟输入值到串口监视器Serial.println(pot_value);// 延迟 50 毫秒delay(50);
}