注:内容产出来自我的电子实习,一小部分内容来自我的队友,老师的PPT,在此致谢。这个内容大体上已经结束了,等我闲下来整理一下慢慢更新。后面保不准自己也会学着做单片机hh
DAY1
1. 新的开始:
了解前置知识和注意事项,组建草台班子(不是),准备进行小组作业。
使用的单片机 Arduino MEGA/UNO
2. Hello Arduino:
下载专用IDE,学习基本语法——包含初始化设置 setup() 和主循环 loop() 两个核心函数,并掌握了串口通信和数字引脚控制的基本用法:
- setup()函数:
- 这是初始化设置部分,只运行一次。
- 使用 Serial.begin(9600); 设置串口波特率为 9600,这样设备可以以此速率与其他设备通信。
- loop()函数:
- 这是主程序控制部分,反复执行的代码在这里写入,程序会在 loop 中从头到尾执行并循环。
- 串口通信:
- 使用 Serial.print() 输出信息到串口。比如,输出学号和姓名 "2023303822 丁中惠"。
- 如果需要自动换行,可以使用 Serial.println(),类似于 Java 中的 System.out.println()。
- Serial.read():读取串口数据。
- Serial.available():判断串口是否接收到数据,返回接收的数据量(以整数表示)。
- pinMode(pin, mode);:设置指定引脚的模式,pin 为引脚号,mode 为输入或输出模式。
- digitalWrite(pin, value);:设置指定引脚的电平状态,value 可以为 HIGH(高电平)或 LOW(低电平)。
- delay(ms); 和 delayMicroseconds(us);:延时函数,分别以毫秒和微秒为单位暂停程序。
- 与 C/C++ 的 main 函数对比:
- loop() 类似于 C 语言中的 main 函数,但 loop() 中无法直接使用 printf() 输出,而是使用 Serial.print() 进行串口输出。
预习作业:
了解analogWrite()函数的使用。
DAY 2
作业代码:
输入:无
输出:实现用两个变量输出队伍和队员名称。
const char* members[4][3] = {
{"A", "B", "C"}, // TA
{"D", "E", "F"}, // TB
{"G", "H", "I"}, // TC
{"J", "K", "L"} // TD
};
const char* team_id[4] = {"TA" , "TB" , "TC" , "TD"};
int teamId = 0;
int memberId = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (teamId >= 0 && teamId < 4 && memberId >= 0 && memberId < 3) {
Serial.print(team_id[teamId]);
Serial.print(" 成员 ");
Serial.print(memberId + 1);
Serial.print(": ");
Serial.println(members[teamId][memberId]);
}
delay(1000);
memberId++;
if (memberId >= 3) {
memberId = 0;
teamId++;
if (teamId >= 4) {
return 0;
}
}
}
应该可以加入一个手动输入,来实现输入队名来选择对应的输出。
lab1:了解analogWrite()
函数及占空比:
PWM是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。
PWM 信号的平均电压 与占空比
和输入电压
的关系为:
lab2:认识元器件:
- 发光二极管,长正短负,小正大负。一定要注意发光二极管的极性。
- 最上边最下边是电源区,中间是器件区。电源区横向导通,器件区纵向导通。中间的槽隔开了上下区域,是不导通的。
- 公线母线的区别。
- 注意发光二极管极性:
- 了解面包板的结构。
- 了解杜邦线:
仿真时遇到的问题:
仿真软件太难用了接线混乱,会莫名其妙不行。
不能碰到其他洞洞,不然就会把那个支路短路掉。
lab3:一束光:
学习在Wiki上进行仿真。正极接输入,负极接地。
点亮了一个小灯:
代码实现如下:
int ledPin = 10;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
lab4.流水灯制作:
接下来是流水灯:
已经很努力接线了但是这个我真的用不明白,他就会莫名其妙短路。
上单片机成功点亮(我不会传视频):
代码如下:
const int ledPins[] = {8, 9, 10, 11};
const int numLeds = 4;
const int delayTime = 200; // 延迟时间,单位为毫秒
void setup() {
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
// 从左到右依次点亮
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
// 从右到左依次点亮
for (int i = numLeds - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
digitalWrite(ledPins, HIGH);
}
预习作业:
1)蜂鸣器
-
本质和原理
蜂鸣器是一种能发出声音的电声器件,有两种主要类型:
-
有源蜂鸣器:只需要通电即可发出固定频率的声音。
-
无源蜂鸣器:必须通过外部信号驱动才能发出声音,控制器需要产生特定频率的方波。
蜂鸣器的发声原理是基于电磁或压电效应。通电后,电磁振动或晶体变形,产生振动,发出声音。控制电流的频率可以调节声音的高低。
-
相关函数
有源蜂鸣器只需通过 digitalWrite()
控制电平即可。高电平时发出蜂鸣声,低电平时蜂鸣声停止。
int buzzerPin = 9; // 定义蜂鸣器连接的引脚
void setup() {
pinMode(buzzerPin, OUTPUT); // 设置蜂鸣器引脚为输出模式
}
void loop() {
digitalWrite(buzzerPin, HIGH); // 打开蜂鸣器
delay(1000); // 持续1秒
digitalWrite(buzzerPin, LOW); // 关闭蜂鸣器
delay(1000); // 等待1秒
}
在 Arduino 中,可以通过 tone()
函数驱动无源蜂鸣器,控制其发出不同频率的声音。
这是中央C音阶(C4)上的音符频率值,可以作为控制音调的参考。
-
tone(pin, frequency)
:在指定引脚pin
上产生指定frequency
的方波,用于控制无源蜂鸣器的频率。例如:
tone(8, 1000); // 在引脚 8 上输出 1000 Hz 的声音
-
tone(pin, frequency, duration)
:在指定pin
上产生特定频率,持续duration
毫秒。例如:
tone(8, 1000, 500); // 发出 1000 Hz 的声音,持续 500 毫秒
-
noTone(pin)
:停止在指定pin
上的声音。例如:
noTone(8); // 停止引脚 8 上的声音
2)电子数码管
-
本质和原理
数码管是一种由多个 LED 段(7 段或更多)组成的显示器件,通过控制各个段的点亮与熄灭,可以显示数字或字母。
-
共阴极数码管:所有 LED 的阴极连接在一起,需要给每个段施加高电平才能点亮。
-
共阳极数码管:所有 LED 的阳极连接在一起,需要给每个段施加低电平才能点亮。
数码管的每个段对应一个特定的引脚,通过控制这些引脚电平,可以控制不同的段点亮,显示不同的字符或数字。
控制方法:
为了显示数字,需要使用编码方式控制不同段的亮灭组合。例如,显示数字 8
时需要点亮所有段,显示数字 1
时只需要点亮两个垂直的段。每个数字的显示通常使用二进制编码来简化控制。
相关函数(以 Arduino 为例):
在 Arduino 中,数码管通常需要与多个数字引脚连接,或使用移位寄存器等芯片减少引脚消耗。可以手动编写每个数字的编码函数,也可以使用 display()
函数。