这学期选修了电子工程训练作为劳育课, 虽是全新领域但看着还是蛮好玩的, 希望可以坚持到底, 学到新的知识与技能~

实验一 电子元器件识别

知识汇总

讲义 & 网络资料整理汇总, 实验报告主要也是 markdown 写的, 同步到网站也是很方便的

电子元件及特点

电子元件通常指电阻器, 电容器, 电位器, 电感器, 变压器等无源元件。

电阻器

电子器是电子电路中应用最多的元件之一

主要用途

稳定和调节电路中的电流和电压, 其次还可以作为分流器, 分压器和消耗电能的负载等;

分类

  • 按结构形式可分为:普通电阻器, 片形电阻器, 线绕电阻器, 可变电阻器 (电位器)。

  • 按材料可分为:合金型, 薄膜型和合成型。

  • 按用途可分为:普通型, 精密型, 高频型, 高压型, 敏感型,

主要技术参数

  • 标称阻值:为了便于生产与实际需要, 国家规定了一系列阻值作为产品标准, 称为电阻的标称值RRR_R

  • 允许误差(精度):受生产工序影响, 电阻器与标称值无法完全一致, 存在一定离散性, 对此给出允许误差表示电阻器的阻值精度, 通常采用 E 系列;

  • 额定功率:电阻器常温下所允许承受的最大功率, 实际使用不允许超过次功率, 避免升温被烧毁;

  • 最高工作电压:电阻器能承受的最高电压;

  • 温度:电阻值随温度的变化而变化, 电阻器的温度系数与电阻材料及基体材料的温度特性有关;

  • 噪声:指产生于电阻中的一种不规则的电压起伏, 包括电流噪声与热噪声;

标注

  • 直标法:文字直接标注型号, 功率, 阻值和误差;

  • 色环标注法:四色环或五色环表示阻值和误差的大小;

  • 数字倍乘法:a,b,c=ab×10ca,b,c=ab \times 10^c

电位器

是阻值可调的电阻用 RP 表示;

主要参数

  • 标称值:同上

  • 额定功率:同上

  • 阻值变化规律:滑动端与一固定端间的阻值随触点位置变化的规律, 有直线式, 指数式及对数式;

  • 滑动噪声:滑动端与固定端的电压出现无规则的起伏现象;

  • 分辨率;对输出量可实现的最精细的调节能力;

电容器

储存电荷的容器。

分类

  • 气体介质电容器: 主要有空气电容器, 真空电容器等。

  • 液体介质电容器: 主要有油浸电容器。

  • 无机固体介质电容器: 云母电容器, 陶瓷电容器, 玻璃釉电容器。

  • 有机固体介质电容器: 有纸质电容器, 涤纶电容器, 聚酯电容器等。

  • 电解电容器: 按电解质的形态, 又分为液式和干式两种, 按阳极材料可分为铝电解, 钽电解, 铌电解等。电解电容的电极有 +,- 之分。

主要参数

  • 标称容量

  • 额定电压:耐压值, 电容长期工作的最高电压;

  • 绝缘耐压

  • 电容器的损耗

  • 绝缘电阻

  • 电容温度系数

标注

  • 直接标注法

  • 传统标注法:数值大于 1 的以 pF 为单位, 小于 1 是µF 为单位;

  • 数码标注法:有效数字及倍率

常用功能

  • 滤波:滤除直流电中的交流成分;

  • 耦合:阻断直流, 仅让交流信号通过;

  • 旁路:使支路交流短路, 或该节点交流对地短路;

  • 中和:抑制三极管间造成的自然振荡;

  • 退耦:防止由电源内阻形成的正反馈而引起的寄生振荡;

  • 调谐:选择振荡频率的作用;

  • 定时:时间常数电路中与电阻共同决定放电时间;

电感器

在绝缘骨架上绕制单层或多层导线构成, 又叫电感线圈;

分类

  • 一类是应用自感作用的线圈

  • 另一类是应用互感作用的变压器

作用

  • 作为线圈: 主要作用是滤波, 聚焦, 偏转, 延迟, 补偿, 与电容配合用于调谐, 陷波, 选频, 震荡

  • 作为变压器: 主要用于耦合信号, 变压, 阻抗匹配等

主要性能指标

  • 电感量:指电感器通过变化电流时产生感应电动势的能力;

  • 品质因数(Q 值):反应传输能量的本领;

  • 额定电流:线圈中允许通过的最大电流;

  • 固有电容:线圈的匝与匝间, 线圈与底板间, 线圈与屏蔽罩间, 多层绕组的层与层间等存在着分布电容, 称为固有电容;

常用电感器

色环电感, 扼流线圈, 贴片电感, 共模电感, 磁珠电感;

电子器件及特点

电子器件通常指半导体二极管, 三极管, 各类集成电路, 各类电子管等有源器件。

晶体二极管

本质上就是一个 PN 结, 最主要特性是单向导电性: 加正偏电压, 导通, 加反偏电压, 截止。

此外, 由于二极管的结电容随反偏电压大小而变化, 可用于电调谐; 反向击穿电压几乎恒定不变, 可用于稳压。

主要参数

  • 最大整流电流 IoM:指允许通过的最大平均电流, 由制造材料和 PN 结面积决定

  • 最大反向 (峰值) 工作电压 VRM:允许承受的最大反偏电压, 由半导体材料和掺杂浓度决定。

  • 反向漏电流 I:反映二极管的单向导电性能, 受温度的影响较大。

  • 最高工作频率:由于 PN 结存在结电容, 当信号频率高于某一值后, 信号通过结电容直通, 不再具有单向导电性。

  • 结电容:二极管的极间电容, 包括势垒电容和扩散电容。

分类

  • 按材料不同可分为: 锗二极管, 硅二极管, 砷化镓二极管等;

  • 按结构特点不同可分为: 点接触型, 面接触型, 平面型等;

  • 按用途不同可分为: 整流二极管, 检波二极管, 稳压二极管, 变容二极管, 开关二极管, 隧道二极管, 发光二极管等。

晶体三极管

晶体三极管又称双极型晶体管或半导体三极管。在模拟电子电路中三极管主要作为放大元件来使用, 而在数字电路中三极管主要作为开关元件来应用。

三极管工作状态:截止, 放大, 饱和;

分类

  • 三极管按结构分为点接触型和面接触型;

  • 按材料分为硅管和锗管; 按工作频率分为低频管, 高频管等;

  • 按功率分为小功率, 中功率, 大功率 3 类;

  • 按功能和用途分为放大管, 开关管, 高反压管, 低噪声管等;

  • 按内部极性结构分为 PNP 型和 NPN 型 2 类。

主要参数

  • 电流放大系数:包括直流电和交流电放大系数;

  • 特征频率:三极管共发射极电流下降到 1 时的频率值;

  • 极间反向电流

  • 极限参数

集成电路

在一个芯片上制作了很多个电子元器件, 并连接成一个具有一定功能的电子电路。

按处理信号形式分为模拟 IC , 数字 IC 和混合 IC 。

按功能可分为多类: 如运算放大器, 计数器, 译码器, 等等。

集成电路的有多种封装形式: 单列直插式 (SIP), 双列直插式(DIP), 贴片封装等。

电阻色环标注方法及各色环的含义

小功率碳膜和金属膜电阻, 一般都用四色环或五色环表示其阻值和精度(误差);单位:欧Ω

  • 四色环:电阻上共有 4 条色环, 前 2 条表示阻值的有效数字, 第 3 条表示倍率, 最后 1 条表示误差大小;

有效数字 a, b 倍率 c 及误差 d, 阻值为:

ab×10c±d  persentab \times 10^c \pm d \ \ persent

  • 五色环:前 3 条表示阻值的有效数字, 第 4 条表示倍率, 最后 1 条表示误差大小。

有效数字 a, b, c 倍率 d 及误差 e, 阻值为:

abc×10d±e  persentabc \times 10^d \pm e \ \ persent

不同颜色代表不同的数字, 通常使用金色或棕色代表精度(误差)

img

电容数字标注方法

通常采用三位数码表示, 前两位表示有效数字, 第三位数表示有效数字乘以 10 的幂次, 单位为 pF, 如 201 表示 200pF。容量有小数的电容一般用字母表示小数点, 如 lp5 表示 1.5pF。

数码表示法有一种特例, 就是第三位若是 9, 则电容量是前两位有效数字乘以10110^{-1}, 如 229 表示22×10122 \times 10^{-1}

器件识别

指出下列元件为何种元件, 参数如何

(1)

image-20230303202431262

瓷片电容, 容量300pF300pF

(2)

image-20230303203229304

瓷片电容, 容量220pF220pF

(3)

image-20230303203240227

瓷片电容, 容量68×103pF68 \times 10^3pF

(4)

image-20230303203252855

瓷片电容, 容量22×102pF22 \times 10^2pF

(5)

image-20230303203302279

瓷片电容, 容量15×102pF15 \times 10^2pF

(6)

image-20230303203312080

瓷片电容, 容量105pF10^5pF

(7)

image-20230303203323054

瓷片电容, 容量56×102pF56 \times 10^2pF

(8)

image-20230303203336160

瓷片电容, 容量104pF10^4pF

(9)

image-20230303203355195

云母电容, 容量0.47μF0.47 \mu F, 只能在交直流63V63V 下使用(工作电压)

(10)

image-20230303203406572

电解电容, 容量22μF22 \mu F, 工作电压16V16V

(11)

image-20230303203417414

电解电容, 容量2.2μF2.2 \mu F, 工作电压50V50V

(12)

image-20230303203426266

电解电容, 容量33μF33 \mu F, 工作电压25V25V

读出电阻的阻值及误差

persent 为百分号, 代表精度

(1)

image-20230303204611003

阻值:330×100=330±1 persent Ω330 \times 10^0=330 \pm 1 \ persent \ \Omega

(2)

image-20230303204912622

阻值:560×100=560±1  persent Ω560 \times 10^0=560 \pm 1 \ \ persent\ \Omega

(3)

image-20230303205212525

阻值:300×102=3±1  persent Ω300 \times 10^{-2}=3 \pm 1 \ \ persent\ \Omega

(4)

image-20230303205359087

阻值:430×103=430±1  persent KΩ430 \times 10^3=430 \pm 1 \ \ persent\ K\Omega

(5)

image-20230303205408787

阻值:620×101=62±1  persent Ω620 \times 10^{-1}=62 \pm 1 \ \ persent\ \Omega

(6)

image-20230303205418508

阻值:510×102=51±1  persent KΩ510 \times 10^2=51 \pm 1 \ \ persent\ K\Omega

(7)

image-20230303205429108

阻值:910×100=910±1  persent Ω910 \times 10^0=910 \pm 1 \ \ persent\ \Omega

(8)

image-20230303205438241

阻值:221×10=2210±1  persent Ω221 \times 10=2210 \pm 1 \ \ persent\ \Omega

(9)

image-20230303205448756

阻值:680×102=68±1  persent KΩ680 \times 10^2=68 \pm 1 \ \ persent\ K\Omega

(10)

image-20230303205502814

阻值:240×103=240±1  persent KΩ240 \times 10^3=240 \pm 1 \ \ persent \ K\Omega

(11)

image-20230303205510546

阻值:820×103=820±1  persent KΩ820 \times 10^3=820 \pm 1 \ \ persent \ K\Omega

(12)

image-20230303205518040

阻值:270×100=270±1  persent Ω270 \times 10^0 = 270 \pm 1 \ \ persent \ \Omega

实验二 电路板焊接(直插器件)

学习使用焊接工具, 焊接材料, 在焊盘焊接元器件引脚。

幸运转盘焊接

原始器件

image-20230311000419159

成品

拿着焊枪和锡线焊接的时候手会抖, 锡脚最终有点大小不一, 不是很美观, 不过好在功能正常。

成品效果大概就是按开关后, 随机亮一盏 LED 灯, 随后会旋转依次闪烁, 最后随机在一个 LED 灯处停下。

实验三 常用电子仪器的使用

电源 | 信号源 | 示波器 | 万用表这四个电子仪器的学习使用略花费了些时间(同组的人也是外专业的都不太会用), 在老师和周边大佬的指导下, 超时 1h 完成操作练习。🤣

电源 | 信号源 | 示波器 | 万用表

简述直流电源, 信号源, 示波器的使用方法。

直流电源

直流电源是一种将交流电转换为稳定直流电的设备, 其具体使用方法如下:

  • 确定需要的电压和电流:根据所需的电路和设备的电压和电流需求, 选择合适的直流电源。

  • 连接电源:将直流电源的输入端连接到交流电源, 通常使用插头或电源线进行连接。需要注意的是, 要确保电源的输入电压和频率符合要求。

  • 调整输出电压和电流:根据需要的电压和电流, 调整直流电源的输出电压和电流限制。通常可以使用旋钮或按钮来进行调节。

  • 连接电路:将待供电的电路或设备连接到直流电源的输出端, 通常使用插头或电源线进行连接。

  • 开启电源:启动直流电源并等待其稳定输出稳定的电压和电流。需要注意的是, 一些电源可能需要一段时间来达到稳定状态。

  • 监测电源输出:使用万用表或示波器等测量设备, 监测直流电源的输出电压和电流, 确保其符合要求。

  • 对于双路可调电源独立, 串联或并联使用, 需要调节电源的状态控制开关。

信号源

信号源是一种用于产生电信号的设备, 其具体使用方法如下:

  • 确定所需的信号类型和参数:根据需要的实验或应用, 确定所需的信号类型和参数, 例如正弦波, 方波, 三角波等, 并确定其频率, 幅度, 相位等参数。

  • 连接信号源:将信号源的输出端连接到待测试的电路或设备, 通常使用 BNC 接口或电源线进行连接。需要注意的是, 要确保信号源的输出符合待测试设备的要求。

  • 调整信号参数:使用信号源的控制器或旋钮, 调整信号的频率, 幅度, 相位等参数, 以获得所需的信号形式和特性。

  • 开始测试:启动待测试的电路或设备, 并监测信号源的输出, 观察信号的波形, 频率, 幅度等特性, 并进行相关的实验或测试。

  • 分析结果:根据测试结果, 分析信号的特性和性能, 并进行相关的数据处理和分析。

示波器

示波器是一种用来观察电信号的仪器, 它可以显示电信号的波形, 频率, 幅度等信息。下面是示波器的具体使用方法:

  • 连接电路:将待测电路的信号端连接到示波器的输入通道, 通常使用 BNC 接口连接, 需要选择合适的探头以获得正确的测量结果。

  • 调整示波器的垂直和水平控制:示波器的垂直控制可以调整显示信号的幅度或电压, 而水平控制可以调整显示信号的时间或频率。这些控制通常由旋钮或按钮来进行调节。

  • 调整触发控制:示波器的触发控制可以帮助稳定显示的信号, 通常可以选择不同的触发模式和触发电平。

  • 开始测量:启动电路并开始测量信号, 观察信号的波形, 频率, 幅度等信息, 可以进行调整以获取更准确的测量结果。

  • 分析结果:根据测量结果, 可以进行信号分析和处理, 例如计算信号的频率, 幅度等参数, 或者比较不同信号的差异和相似性。

说明使用数字万用表的注意事项。

  • 测试前先明确所要进行测量的项目, 将功能(量程)开关旋置于正确档位。
  • 根据将进行的测试项目, 把测试表笔插入相应的测试插孔中。
  • 如果事先不知被测电量的大概范围, 则应将量程开关置于最大量程档, 并根据测量值逐渐下降量程
  • 当仪表处于电流测量档位时, 严禁将测试表笔跨接于存在电压差的电路两端, 否则将造成短路而损坏仪表和被测电路。
  • 在使用数字万用表时, 如果显示器上显示 1, 说明被测值超过该档量程最大值, 应将量程开关置于更高量程
  • 万用表交流档的使用频率是 40-400Hz。

阐述用示波器测量交流信号时如何在屏幕上稳定地显示出信号波形(各信号的选择, 各功能开关的操作与选择等)。

  • 选择合适的探头:根据信号的频率和幅度选择合适的探头, 通常示波器会配备不同类型的探头。

  • 选择合适的信号输入方式:示波器可以通过不同的输入方式(如 AC/DC 耦合)来适应不同的信号类型。

  • 调整垂直和水平控制:通过垂直和水平控制来调整信号的放大倍数和位置, 以使信号在屏幕上完整且合适的显示。

  • 选择合适的触发方式:通过选择合适的触发方式, 如自动触发或外部触发, 以确保信号在屏幕上稳定显示。

  • 调整触发电平和触发边沿:通过调整触发电平和触发边沿来确保信号在正确的位置和时间被捕捉并在屏幕上稳定显示。

在进行电子电路测量时, 各仪器的信号连接线应该如何连接到电路上。

  • 示波器探头:示波器探头应该连接到电路中需要观察的信号点。通常, 示波器探头的接地端应该连接到电路的一个地点, 例如电路板上的 GND 接线端子。

  • 万用表探头:多用表探头可以用于测量电路中的电压, 电流等参数。在测量电压时, 一个探头应该连接到电路中的测量点, 另一个探头应该连接到电路的一个地点。在测量电流时, 可以将探头插入电路中的电流传感器或测量点, 然后连接到多用表的电流测量端口。

  • 信号发生器输出线:信号发生器的输出线应该连接到电路中需要输入信号的位置。例如, 在测试滤波器时, 可以将信号发生器的输出线连接到滤波器的输入端。

  • 电源连接线:电源连接线应该连接到电路中需要供电的位置。例如, 在测试放大器时, 应该将电源连接线连接到放大器的电源输入端。

  • 在连接信号线时, 需要注意保持信号线的干净和整洁, 避免线路短路或其他损坏。确保连接线与电路中的连接端紧密接触, 避免信号失真或干扰。确保线路连接正确, 避免在测量过程中对电路造成损坏。

  • 仪器间的相互连接

    • 如果被测量或被观察的信号幅度较小(如毫伏数量级), 为了防止干扰, 一般需要采用屏蔽线连接。

    • 在电子测量中, 各仪器的保护接地端(通常为仪器的外壳, 常使用黑色接线柱)必须连在一起, 而且屏蔽线的外屏敲层应接在保护接地端上。

如何设置, 连接直流电源以获得 + 5V—OV——9V 的电压输出。

  • 选择一台符合要求的直流电源。通常, 直流电源可以通过旋钮或开关来选择输出电压, 也可以通过调节变压器或电阻来调整电压。

  • 将直流电源的正极连接到 +5V 输出端, 将负极连接到 0V 输出端。这将提供一个 +5V-0V 的电压输出。

  • 如果需要 +9V 的电压输出, 可以连接一个降压稳压器。连接稳压器时, 将稳压器的输入端连接到 +5V 输出端, 将输出端连接到 0V 输出端, 同时将稳压器的地端连接到电源输出端的地端。

  • 根据稳压器的规格, 调整其电阻或其他参数, 以获得 +9V 的输出电压。

  • 检查连接是否正确, 启动电源并进行测试, 确保电路工作正常。

讲义 P 28~29, 使用操作练习。

填空:

(1)当显示示波器自身的“校准信号(1kHz 方波, Vp-p=0.5V)”时, 若要求在荧光屏上得到一个周期且幅度占据约 2div 的稳定波形, 应怎样选择下列开关的位置?注:示波器屏幕水平共 10div, 垂直共 8div。
A. Y 轴电压灵敏度开关置于 0.1 V/div 档位置。

​ B. 扫描速度开关置于 0.1ms/div 档位置。

​ C. 触发信号选择开关置于 CH1 位置。

ed97a081a28fed490f3ab42fc3fb955

(2)万用表测量交流信号的适用频率范围是 40-400 Hz, 能否用来测量音频信号的大小?

  • 音频信号的频率范围大致 20HZ-20kHZ
  • 其可用于测量 低频 (40-150Hz) 及中低频 (150-400Hz)

用万用表测试常用电子元件电阻, 电容的参数, 并记录所测数据。

表 2.5.1 电子元件参数测量数据
电阻标称值实际测量值电容标称值实际测量值
41±1%KΩ41\pm1\%K\Omega43.4KΩ43.4K\Omega3.3μF3.3\mu F3.12μF3.12\mu F
0.56±1%KΩ0.56\pm1\%K\Omega0.54KΩ0.54K\Omega27×102pF27\times10^2pF29×102pF29\times10^2pF
0.36±1%MΩ0.36\pm1\%M\Omega0.34MΩ0.34M\Omega22×104pF22\times 10^4pF20×104pF20\times10^4 pF
27±1%Ω27\pm1\%\Omega27Ω27\Omega0.47μF0.47\mu F0.51μF0.51\mu F

image-20230317203903301

86f20ca1b468d5095bef400cb6898e8

用万用表测量二极管和三极管的参数, 并判断出各引脚的名称。

  • 二极管正向导通电压为 0.587V
  • 三极管的放大倍数为 282

13834aab056006fb7a672b06181d8a3

175180833ae16dec49d19959e519477

用示波器的“校准信号”对示波器进行自检, 测量下列参数并记入表 2.5.2 中。

(1)测量校准信号的幅度。

(2)测量校准信号的频率。
(3)测量校准信号的上升时间和下降时间。

表 2.5.2 “校准信号”的幅度, 频率, 边沿时间测量
测量项目标称值原始读数原始读数计算所得实测值
幅度2.5 div0.2 V/div0.496 V
频率5.0 div0.2 ms/div993.4 Hz
上升时间————0.04 div100μs/div\mu s/div4.0μs\mu s
下降时间————0.08 div50μs/div\mu s/div4.0μs\mu s

注:标称值是指仪器说明书中给出的技术指标, 一般标示于信号输出端旁。原始读数是指从仪器刻度上直接读取且未加任何处理的数据。实测值是指根据原始读数计算得到的测量值。

用示波器测量信号发生器输出信号 (正弦) 的频率和幅度, 并将数据记入表 2.5.3 中。

表 2.5.3 测量信号发生器输出的频率和幅度值
刻度值周期原始读数周期原始读数测量值幅度原始读数幅度原始读数峰值测量值有效值
100Hz,2V5 div2 ms/div100.0 Hz4.6 div1 V/div2.32 V1.64V
1kHz,1V5 div0.2 ms/div1 kHz5 div0.5 V/div1.27V0.89V
10kHz,1V5 div20μs/div\mu s/div10 kHz5 div0.5 V/div1.27V0.89V
100kHz,1V5 div2μs/div\mu s/div100 kHz5 div0.5 V/div1.27V0.89V

如何设置电源的工作状态?

把电源分别连接成 2 路独立的 +5V,+12V 输出;串联的 $\pm$12V 输出;并联的 +15V 输出, 用万用表测量其实际输出电压值, 测量结果记录于表 2.5.4。

表 2.5.4 电源电压测量数据右按键状态
左按键状态右按键状态电源 1 显示值实际测量值 1电源 2 显示值实际测量值 2
2 路独立5.04.9612.012.0
串联 $\pm$12V12.011.9412.011.94
并联 +15V15.014.9515.014.95

实验四 放大电路焊接与测试

焊接比较简单, 电路测试需要理解 + 老师指导才逐渐上手🥲
老师甚至讲了 P-P(peak)及增益的含义🤣(又是特菜的一次)

放大电路

实验目的:

  • 巩固元件参数读取, 焊接技术和常用仪器使用方法, 对电路进行测试

实验内容:

  • 放大电路焊接, 并测试焊接:
  • 单电源运放放大电路。
  • 测试静态工作点, 测量并计算电压增益等

实验原理

原理

Av1=VOUT1VIN=R4R3=100kΩ10kΩ=10V/VA_{v1}=\frac{V_ {OUT1} } {V_{IN} }=-\frac{R_4}{R_3}=-\frac{100k\Omega} {10k\Omega}=-10V/V

Av1=VOUTVOUT1=R6R5=10kΩ2kΩ=5V/VA_{v1}=\frac{V_ {OUT} } {V_{OUT1} }=-\frac{R_6}{R_5}=-\frac{10k\Omega} {2k\Omega}=-5V/V

Av1=VOUTVIN=Av1×Av2=(10)×(5)=+50V/VA_{v1}=\frac{V_ {OUT} } {V_{IN} }=A_{v1}\times A_{v2}=(-10)\times(-5)=+50V/V

实验步骤

参数读取与焊接

材料
  • 瓷片电容:103,104103, 104
  • 电解电容:4.7uF×2,10uF,100uF4.7uF \times 2, 10uF , 100uF
  • 电阻:1k,2k×2,5.1k×3,10k×2,100k1k, 2k \times 2, 5.1k \times 3, 10k \times 2,100k
  • 运放 LM 358 及 IC 座
  • 芯插座及排针:

零件

焊接方法
  • 五步焊接法
  • 由低到高的顺序
  • 将电阻, 电容和芯片底座由从矮到高的顺序焊入电路板的的相应位置。
  • 将排针焊入 IN,OUT,OUT1, 处作为输入端, 输出端, 做后将排针焊入 GND 处, 焊接完成, 得到以下电路。
成品

成品

静态测试

步骤
  • 调节电源电压为 9V 接入电路的电源输入端(暂时不加交流输入信号)

  • 用万用表直流电压档, 测量并记录运放LM358LM 358 两电源端的对地电压:V4,V8V4,V8

  • 用万用表直流电压档, 测量并记录运放U1AU 1A 两输入端和一输出端的对地电压:V2,V3V2,V3V1V1

  • 用万用表直流电压档, 测量并记录运放U1BU 1B 两输入端和一输出端的对地电压:V5,V6V5,V6V7V7

方法

静态测试

数据
引脚对地电压 (V)引脚对地电压 (V)
V40.00V14.47
V88.96V54.46
V24.46V64.46
V34.46V74.46

动态测试

  • 调节电源电压为9V9V 接入电路的电源输入端, 并调节信号源, 使信号源输出2.5kHz,20mV2.5kHz,20mV 的正弦波, 接入电路的ININ 信号输入端, 开始测试。

25kHz & 20mv

测试内容
  • 测量输入信号的波形和大小, 并用示波器的另一通道测量 OUT1 的输出波形和电压值, 比较两信号的波形和相位, 计算第一级数放大倍数。

  • 同时测量输入和 OUT 的输出波形与电压值。比较输入和输出两信号的波形和相位, 计算总的放大倍数。

  • 同时测量 OUT1 与 OUT 的输出波形与电压值。比较量信号的波形和相位, 计算第二级放大倍数。

  • 测量输入信号和输出信号, 并将输入信号缓慢升至 0.2V, 观测并记录输出信号的变化。

步骤与结果
  • 将示波器的金属钩子钩住输入端 IN 和输出端 OUT1, 调节示波器得到稳定图像, 调节电压灵敏度

    测量得:

​ IN 输入端信号Vipp=46.4mvVip-p=46.4mv

​ 输出端 OUT1 电压为Vo1pp=0.464VVo1p-p=0.464V

​ 两信号的相位相差半个周期。

AV=Vo1ppVipp=10A_V=\frac{Vo1p-p}{Vip-p}=-10, 第一级放大倍数约为 10 倍,

in & out1

-10 倍

  • 将示波器的金属钩子钩住输入端 IN 和输出端 OUT 调节示波器得到稳定图像, 调节电压灵敏度

    测量得:

IN 输入端信号电压为Vipp=46.4mvVip-p=46.4mv

输出端 OUT 电压为Vopp=2.32VVop-p=2.32V

两信号相位相同

AV=50A_V=-50, 放大倍数约为 50 倍

in & out

-50 倍

  • ③将示波器的金属钩子钩住输出端 OUT1 和输出端 OUT 调节示波器得到稳定图像, 调节电压灵敏度

    测量得:

OUT1 输出端信号电压为Out1=0.46VOut_1=0.46V

OUT 输出端信号电压为Out=2.3VOut=2.3V

两信号相位相差半个周期, 第二级放大倍数约为 5 倍

out & out1

  • 将示波器的金属钩子钩住输入端 IN 和输出端 OUT 调节示波器得到稳定图像, 逐渐增大信号源输出信号的电压值, 观察图像发现波形幅度逐渐增大, 当电压达到 0.14V 左右时, 正弦波波峰波谷处产生类似于方波的图像, 即削波现象, 原因是信号电平过强, 超过电路允许范围, 导致信号无法顺利通过。

25kHz & 0.2V

方波

实验五 贴片器件焊接(呼吸灯焊接)

呼吸灯

零件

成品

先在焊盘上点锡, 之后需要用镊子将细小的零件贴上去, 成品还有点小 bug🥲, 使用万用表测了短路, 又加焊了一下锡脚, 但还是有点问题, 需要用示波器再看看了。

实验六 Arduino 入门

Arduino

简介

Arduino: 一块基于开放源代码的 USB 接口单片机开发板, 包括 20 多个模拟, 数字,PWM 等的输入输出通道, 具有类似 C 语言的 IDE 集成开发环境。
Arduino 可以使用的电子元件: Switch ,Sensors , 其他控制器, LED , 步进马达或其他输出装置, 等。
这个开源硬件项目, 诞生于意大利的一所设计学校。Arduino 的核心开发团队成员包括:Massimo Banzi, , David Cuartielles , David Mellis 等 6 人。

主要器件

套件

Arduino UNO 开发板

数字 I/O 口
  • 可以输入和输出数字信号
  • 数字信号两种形态:高电平, 低电平
  • 数字接口:DIGITAL (PWM~ )0~13 既可用作输入, 也可用作输出
  • 输出高电平时, 可提供 40mA 的 5V 电压;这足够点亮普通 LED , 不足以驱动电机
  • 0 ,1 复用:RX ,TX
  • 3 ,5 ,6 ,9 ,10 ,11 复用:PWM~(模拟输出)
模拟 I/O 口
  • 模拟输入:A0~A5 默认为模拟输入, 可测量电压供程序使用;
  • 不能输出模拟信号, 只能用 PWM;
  • 也可用作数字输入, 输出:14~19;
电源输出接口 POWER
  • IOREF
  • RESET
  • 3.3V 和 5V
  • 两个 GND
  • Vin
  • Reset 与 与 重置按钮相连, 将其瞬间接至 0V , 能重启单片机, 使程序从头开始运行
  • GND 地线, 即 0V , 是板上其他电压的参考点

Arduino

官网下载安装, windows10/11 不用另外装驱动, 在界面选择开发板及端口即可;

Tool-board/port

Hello World 实验

编写程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int val;
int ledpin=13;

void setup()
{
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
}
void loop()
{
val=Serial.read();
if(val=='R')
{
digitalWrite(ledpin,HIGH);
delay(500);
digitalWrite(ledpin,LOW);
delay(500);
Serial.println("Hello World!");
}
}

连接开发板

上传 & 运行

串口监视器输入 R 返回 Hello World

LED 闪烁实验

1
2
3
4
5
6
7
8
9
10
11
12
13
int ledPin=10;
void setup()
{
pinMode(ledPin,OUTPUT);
}

void loop()
{
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}

开发板连接

交通灯设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int redled= 10;
int yellowled=7;
int greenled=4;

void setup()
{
pinMode(redled,OUTPUT);
pinMode(yellowled,OUTPUT);
pinMode(greenled,OUTPUT);
}

void loop()
{
digitalWrite(redled,HIGH);
delay(1000);
digitalWrite(redled,LOW);
digitalWrite(yellowled,HIGH);
delay(200);
digitalWrite(yellowled,LOW);
digitalWrite(greenled,HIGH);
delay(1000);
digitalWrite(greenled,LOW);
}

开发板

广告灯效果实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int BASE= 2;   // 第一颗 LED 接的 I/O 脚
int NUM =6; //LED 的总数
int i=0;

void setup()
{
for(int i= BASE;i<BASE + NUM;i++)
{
pinMode(i,OUTPUT); // 设定数字 I/0 脚为输出
}
}

void loop()
{
for(i= BASE;i<BASE+NUM;i++)
{
digitalWrite(i,LOW); // 设定数字 1/0 脚出为“低“, 即顺序熄灭
delay(200); // 延时
}
for(i= BASE;i<BASE+ NUM;i++)
{
digitalWrite(i,HIGH); // 设定数字 I/0 脚输出为“低“, 即顺序点亮
delay(200); // 延时
}
}

开发板

按键控制 LED 实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int ledpin = 11;  // 定义数字 11 接口
int inpin = 7; // 定义数字 7 接口
int val; // 定义变量 val

void setup()
{
pinMode(ledpin,OUTPUT); // 定义小灯接口为输出接口
pinMode(inpin,INPUT); // 定义按键接口为输入接口
}

void loop()
{
val = digitalRead(inpin); // 读取数字 7 口电平值赋给 val
if(val == LOW) // 检测按键是否按下, 按键按下时小灯亮起
digitalWrite(ledpin,LOW);
else
digitalWrite(ledpin,HIGH);
}

开发板

记得接地线

抢答器设计实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int redled=10;    //set IO 10 to red LED 
int yellowled=9; //set IO 8 to yellow LED
int greenled=8; //set IO 8 to green LED
int redpin=7; //red key pin IO7
int yellowpin=6; //yellow key pin IO6
int greenpin=5; //green key pin IO5
int red; // 变量声明
int yellow; // 变量声明
int green; // 变量声明

void setup()
{
pinMode(redled,OUTPUT);//set as output
pinMode(yellowled,OUTPUT);//set as output
pinMode(greenled,OUTPUT);//set as output
pinMode(redpin,INPUT);
pinMode(yellowpin,INPUT);//set as input
pinMode(greenpin,INPUT);//set as input
}

void loop()
{
red = digitalRead(redpin); // 读取按键状态
if (red == LOW) // 按键状态为低
digitalWrite(redled,LOW); //LED 熄灭
else // 按键状态为高
digitalWrite(redled,HIGH); //LED 点亮

yellow= digitalRead(yellowpin);
if(yellow == LOW)
digitalWrite(yellowled,LOW);
else
digitalWrite(yellowled,HIGH);
green = digitalRead(greenpin);
if(green == LOW)
digitalWrite(greenled,LOW);
else
digitalWrite(greenled,HIGH);
}

开发板

模拟值实验

任务: 使用外部模拟量传感器, 通过编写程序实现模拟量数据的读取和处理。 要求:设计合适的电路连接图, 编写程序实现模拟量数据的读取和处理, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

7

需要正确连接 5V 电源及接地线;

调节电位器时, LED 灯的亮度及 IED 的串口监视器数值会同时发生变化;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int potpin = 0; // 指定模拟端口 A0
int ledpin = 13; // 指定 LED 端口 13
int val= 0; // 声明临时变量

void setup()
{
pinMode(ledpin,OUTPUT);// 设置端口 13 为输出模式
Serial.begin(9600); // 设置串口波特率为 9600
}

void loop()
{
digitalWrite(ledpin,HIGH); // 拉高端口 13, LED 点亮
delay(50); // 延时 0.05 秒
digitalWrite(ledpin,LOW); // 拉低端口 13, 关闭 LED
delay(50);// 延时 0.05 秒
val = analogRead(potpin); // 读取 AO 口的电压值并赋值到 val
Serial.println(val);// 串口发送 val 值
}

7-2

PWM 调控灯光亮度实验

任务: 使用 PWM 技术, 通过编写程序实现 LED 灯的亮度调节。 要求:设计合适的电路连接图, 编写程序实现 PWM 调控 LED 灯的亮度, 记录测试数据并进行分析。

PWM (Pulse Width Modulation) 通常所说的脉冲宽度调制, 简称脉宽调制。脉宽调制是一种对模拟信号电平进行数字编码的方法。Arduino 不能直接产生模拟电压, 只能输出 0V 或 5V 高低电平。PWM 就是一种利用数字方法得到模拟输出电压的技术。

连接 UNO 板与电脑,UNO 板与拓展板, 及示波器连接使用

8

可以使用跳线连接拓展版与示波器信号接入端, 示波器信号输入端的黑色小夹子通过条线, 与拓展板接地端口连接;

调节示波器, 使波形趋于平稳;

PWM 的三个基本参数:

  • 脉冲宽度
  • 脉冲周期(脉冲频率的倒数)
  • 电压高度(例如:0V-5V
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int potpin=0;  // 定义模拟接口 O
int ledpin=11; // 定义数字接口 11(PWM 输出)
int val=0; // 暂存来自传感器的变量数值。

void setup()
{
pinMode(ledpin,OUTPUT); // 定义数字接口 11 为输出
Serial.begin(9600); // 设置波特率为 9600
// 注意:模拟接口自动设置为输入
}

void loop()
{
val=analogRead(potpin); // 读取传感器的模拟值并赋值给 val
Serial.println(val); // 显示 val 变量 —
analogWrite(ledpin,val/4); // 打开 LED 并设置亮度(PWM 输出最大值 255)
delay(10); // 延时 10ms
}

温度传感器实验

任务: 使用外部温度传感器, 通过编写程序实现温度数据的读取和显示。 要求:设计合适的电路连接图, 编写程序实现温度数据的读取和显示, 记录测试数据并进行分析。

需要使用到温度传感器

温度传感器

连接 UNO 板与电脑,UNO 板与面包板

9

IDE 的串口监视器会显示温度传感器测得的温度数据;

9-2

1
2
3
4
5
6
7
8
9
10
11
12
//Program 8:用温度传感器测量您周边的温度
void setup()
{
Serial.begin(9600); // 使用 9600 速率进行串口通讯
}
void loop()
{
int n=analogRead(A0); // 读取 AO 口的电压值
float vol=n*(5.0/1023.0*100); // 将传感器得到的电压数值换算成温度
Serial.println(vol); // 串口输出温度数据
delay(2000); // 等待 2 秒, 控制刷新速度
}

蜂鸣器实验

任务: 使用外部蜂鸣器, 通过编写程序实现蜂鸣器的控制。 要求:设计合适的电路连接图, 编写程序实现蜂鸣器的控制, 记录测试数据并进行分析。

最常见发声元件是蜂鸣器和喇叭, 两者比较蜂鸣器更简单易用, 本实验采用蜂鸣器。有源蜂鸣器与无源蜂鸣器的区别:是否带震荡源。有源蜂鸣器内部带震荡源 , 加上合适的直。 流电源就会鸣叫。其控制方法与 与 LED 类 类 似, 相应数字接口输出高低电平。 即可控制其鸣停。无源蜂鸣器内部不带震荡源, 只加直 流电源无法令其鸣叫。须用音频信号驱动才能鸣叫。注意:有源蜂鸣器有正负极之分, 长脚正, 短脚负。还有驱动电压之分, 5V ,12V 等。

连接 UNO 板与电脑,UNO 板与拓展板

10

一首乐曲有若干音符组成, 一个音符对应一个频率。让 arduino 输 输 出相应频 率信号到 无源蜂 鸣器 , 蜂鸣器就会发出相应声音。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int buzzer = 8;   // 设置控制蜂鸣器的数字脚 
int i=0;

void setup()
{
pinMode(buzzer,OUTPUT); // 设置数字 1O 脚模式, OUTPUT 为输出
}

void loop()
{
for(i= 0;i<80;i++) // 输出一个频率的声音
{
digitalWrite(buzzer,HIGH); // 发声音
delay(1); // 延时 1ms
digitalWrite(buzzer,LOW); // 不发声音
delay(1); // 延时 1ms
}
for(i= 0;i<100;i++) // 输出另一个频率的声音
{
digitalWrite(buzzer,HIGH); // 发声音
delay(2); // 延时 2ms
digitalWrite(buzzer,LOW);// 不发声音
delay(2); // 延时 2ms
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#define NOTE_D0 -1         // 把每个音符和频率值对应起来, 其实不用打这么多。
#define NOTE_D1 294 // 但是都打上了, 后面可以随意编写 D 调的各种歌。
#define NOTE_D2 330 // 我这里用 NOTE_D+ 数字表示音符,
#define NOTE_D3 350 //NOTE_DH+ 数字表示上面有点的那种音符,
#define NOTE_D4 393 //NOTE_DL+ 数字表示下面有点的那种音符。
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556
#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278
#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112

#define WHOLE 1 // 这部分是用英文对应了拍子, 这样后面也比较好看
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625

int tune[] = // 这部分就是整首曲子的音符部分, 用了一个序列定义为 tune, 整数
{
NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0,
NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D6,
NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_D6,
NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0,
NOTE_D1, NOTE_D1, NOTE_D3,
NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D0,
NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
NOTE_DH1, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
NOTE_D7, NOTE_D7, NOTE_D5, NOTE_D3,
NOTE_D5,
NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
NOTE_D3, NOTE_D3, NOTE_D1, NOTE_DL6,
NOTE_D1,
NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
NOTE_DH1, NOTE_D0, NOTE_D7, NOTE_D5,
NOTE_D6,
};

float duration[] = // 这部分是整首曲子的节拍部分, 也定义个序列 duration, 浮点
{ //(数组的个数和前面音符的个数是一样的, 一一对应么)
1, 1, 0.5, 0.5, 1,
0.5, 0.5, 0.5, 0.5, 1, 0.5, 0.5,
0.5, 1, 0.5, 1, 0.5, 0.5,
0.5, 0.5, 0.5, 0.5, 1, 1,
1, 1, 1 + 1,
0.5, 1, 1 + 0.5, 1,
1, 1, 0.5, 0.5, 1,
0.5, 1, 1 + 0.5, 1,
0.5, 0.5, 0.5, 0.5, 1 + 1,
0.5, 1, 1 + 0.5, 1,
1 + 1, 0.5, 0.5, 1,
1 + 1 + 1 + 1,
0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
0.5, 1, 0.5, 1, 1,
0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
0.5, 1, 0.5, 1, 1,
1 + 1, 0.5, 0.5, 1,
1 + 1 + 1 + 1,
0.5, 1, 0.5, 1 + 1,
0.5, 1, 0.5, 1 + 1,
1 + 1, 0.5, 0.5, 1,
1 + 1 + 1 + 1
};

int length;// 这里定义一个变量, 后面用来表示共有多少个音符
int tonePin = 5; // 蜂鸣器的 pin

void setup()
{
pinMode(tonePin, OUTPUT); // 设置蜂鸣器的 pin 为输出模式
length = sizeof(tune) / sizeof(tune[0]); // 这里用了一个 sizeof 函数, 可以查出 tone 序列里有多少个音符
}

void loop()
{
for (int x = 0; x < length; x++) // 循环音符的次数
{
tone(tonePin, tune[x]); // 此函数依次播放 tune 序列里的数组, 即每个音符
delay(400 * duration[x]); // 音符持续时间, 400 是调整时间, 越大曲子速度越慢, 越小曲子速度越快
noTone(tonePin);// 停止当前音符, 进入下一音符
}
delay(5000);// 等待 5 秒后, 循环重新开始
}

光控声音实验

任务: 使用外部光敏传感器和声音传感器, 通过编写程序实现光控声音的控制。 要求:设计合适的电路连接图, 编写程序实现光控声音的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

11

本实验可以借鉴 PWM 调控 LED 实验, 将电位器换成光敏电阻实现光强对 LED 亮度的控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int potpin=0;  // 定义模拟口 0 接光敏电阻 
int ledpin=11; // 定义数字口 11 调节 LED 亮度
int val=0; // 定义变量 val

void setup()
{
pinMode(ledpin,OUTPUT); // 定义数字接口 11 为输出
Serial.begin(9600); // 设置波特率为 9600
}
void loop()
{
val=analogRead(potpin); // 读取模拟值并赋值给 val
Serial.println(val); // 显示 val 变量数值
analogWrite(ledpin,val/4);// 打开 LED 并设置亮度
delay(10); // 延时 0.01 秒
}

火焰报警实验

任务: 使用外部火焰传感器, 通过编写程序实现火焰报警功能。 要求:设计合适的电路连接图, 编写程序实现火焰报警功能, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

12

火焰传感器, 通常是红外光敏二极管或红外光敏三极管, 是机器人专门用来搜寻火源的传感器。该传感器利用火焰发出的光中含有一定量的红外光而得以实现。火焰传感器通过对火焰中红外线强度的检测, 把火焰的亮度转化为高低变化的电平信号, 输入到 Arduino , Arduino 根据信号的变化做出相应的程序处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int flame = A5;
int Beep = 8;
int val = 0;
void setup() {
// put your setup code here, to run once:
pinMode(Beep,OUTPUT);
pinMode(flame,INPUT);
Serial.begin(9600);
val = analogRead(flame);
}

void loop() {
// put your main code here, to run repeatedly:
Serial.println(analogRead(flame));
if((analogRead(flame)-val)>=600)
digitalWrite(Beep,HIGH);
else
digitalWrite(Beep,LOW);
}

感热灯实验

任务: 使用外部感热传感器, 通过编写程序实现感热灯的控制。 要求:设计合适的电路连接图, 编写程序实现感热灯的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

13

热敏电阻特点是对温度敏感, 不同温度下表现出不同的电阻值。

按照温度系数不同, 热敏电阻分为正温度系数热敏电阻(PTC) 和负温度系数热敏电阻(NTC )。

正温度系数热敏电阻(PTC ):温度越高电阻值越大;

负温度系数热敏电阻(NTC):温度越高电阻值越小。

13-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int potpin= 0;   // 设置模拟端口 AO
int ledpin = 11; // 设置数字端口 11, 后面用作 PWM 输出
int val= 0; // 声明变量 val

void setup()
{
pinMode(ledpin,OUTPUT); // 设置数字 11 为输出模式
Serial.begin(9600); // 设定波特率为 9600
}

void loop()
{
val=analogRead(potpin); // 读取 AO 的模拟电压值, 并赋值到 val
val= 245 - val/2;
if(val<0)
val=0;
Serial.println(val);
analogWrite(ledpin,val); //PWM 输出驱动 LED
delay(1000); // 延时 100ms
}

倾斜开关实验

任务: 使用外部倾斜开关, 通过编写程序实现倾斜开关的控制。 要求:设计合适的电路连接图, 编写程序实现倾斜开关的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

14

本实验用倾斜开关控制 LED 灯的亮灭, 并在串口监视器显示。

倾斜开关也叫滚珠开关。 垂直悬挂的倾斜开关探头在受到外力作用偏离垂直位置 17 度以上时, 倾斜开关内部的金属球触点动作, 常闭触点断开。当外力撤消后, 倾斜开关回复到垂直状态, 金属球触点又闭合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int switchpin = 5;
int ledpin = 8;
int val=0;

void setup()
{
pinMode(ledpin,OUTPUT); // 数字 I08 输出模式
Serial.begin(9600); // 设置串口波特率为 9600
}

void loop()
{
val = analogRead(switchpin);
if(val>512) // 模拟电压值 512 正好电压是 2.5V
digitalWrite(ledpin,HIGH); // 大于 2.5V, 拉高
else // 小于等于
digitalWrite(ledpin,LOW); // 拉低
Serial.println(val);
}

74HC595 实验

任务: 使用 74HC595 芯片, 通过编写程序实现多个 LED 灯的控制。 要求:设计合适的电路连接图, 编写程序实现多个 LED 灯的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

15—3 个端口控制 8 个输出

74595 含有一个 8 位移位寄存器和一个 8 位存储器, 具有三态输出功能。 本实验用它来扩充 I/O 口控制 8 个 LED 。

用 Arduino 直接控制 8 个 LED 要占用 8 个 I/O 口。但 UNO 总共只有 20 个 I/O 口(包含模拟口 A0 ~ A5 ), 8 个 LED 占用太多资源, 用 74595 后只需 3 个 I/O 口就可以控制 8 个 LED。

连接跳线时, 需要将存储寄存器端口对应连接正确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int latchPin=5;   //to 595 pin12 
int clockPin=4; //to 595 pin 11
int dataPin=2; //to 595 pin14

void setup()
{
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);// 让三个脚都是输出状态 }
}
void loop()
{
for(int a=0;a<256;a++) // 让 a 这个变量 + 1 一直加到到 256, 每次循环都进行下面的活动。
{
digitalWrite(latchPin,LOW);// 将 ST_CP 口上面加低电平让芯片准备好接收数据
shiftOut(dataPin,clockPin,MSBFIRST,a);
/* dataPin:数据输出引脚, 数据每一位逐次输出。引脚模式需要设置成输出。
clockPin:时钟输出引脚, 为数据输出提供时钟, 引脚模式需要设置成输出。
bitOrder:数据位移顺序选择位, 为 byte 类型。
两种类型可选, 高位先入 MSBFIRST, 低位先入 LSBFIRST。
a:所要输出的数据值。*/
digitalWrite(latchPin,HIGH);// 将 ST_CP 这个针脚恢复到高电平。
delay(1000);// 暂停 1 秒钟让你看到效果
}
}

8 乘 8 点阵实验

任务: 使用 8 乘 8 点阵, 通过编写程序实现图案的显示。 要求:设计合适的电路连接图, 编写程序实现图案的显示, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

16_88 点阵

8*8 点阵由 64 个 LED 组成, 每个 LED 位于行, 列交叉点上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const int row1 = 2;//UNO Pin 2 接点阵 9 脚(行 1)
const int row2 = 3;//UNO Pin 3 接点阵 14 脚(行 2)
const int row3 = 4;//UNO Pin 4 接点阵 8 脚(行 3)
const int row4 = 5;//UNO Pin 5 接点阵 12 脚(行 4)
const int row5 = 17;// UNO Pin 17 接点阵 1 脚(行 5) (A3)
const int row6 = 16;//UNO Pin 16 接点阵 7 脚(行 6) (A2)
const int row7 = 15;// UNO Pin 15 接点阵 2 脚(行 7) (A1)
const int row8 = 14;//UNO Pin 14 接点阵 5 脚(行 8) (A0)
const int col1 = 6;//UNO Pin 6 接点阵 13 脚(列 1)
const int col2 = 7;//UNO Pin 7 接点阵 3 脚(列 2)
const int col3 = 8;//UNO Pin 8 接点阵 4 脚(列 3)
const int col4 = 9;// UNO Pin 9 接点阵 10 脚(列 4)
const int col5 = 10;//UNO Pin 10 接点阵 6 脚(列 5)
const int col6 = 11;//UNO Pin 11 接点阵 11 脚(列 6)
const int col7 = 12;//UNO Pin 12 接点阵 15 脚(列 7)
const int col8 = 13;//UNO Pin 13 接点阵 16 脚(列 8)

void setup()
{
int i= 0;
for(i = 2;i<18;i++)
pinMode(i,OUTPUT);// 设置为输出
for(i = 2;i<18;i++)
digitalWrite(i,LOW);// 拉低, 全灭
}

void loop()
{
int i;
//the first LED turns on
digitalWrite(row1,HIGH);
digitalWrite(row2,LOW);
digitalWrite(row3,LOW);
digitalWrite(row4,LOW);
digitalWrite(row5,LOW);
digitalWrite(row6,LOW);
digitalWrite(row7,LOW);
digitalWrite(row8,LOW);
digitalWrite(col1,LOW);
digitalWrite(col2,HIGH);
digitalWrite(col3,HIGH);
digitalWrite(col4,HIGH);
digitalWrite(col5,HIGH);
digitalWrite(col6,HIGH);
digitalWrite(col7,HIGH);
digitalWrite(col8,HIGH);
delay(1000);
//turn off all
for(i = 2;i<18;i++)
digitalWrite(i,LOW);
delay(1000);
}

数码管实验

任务: 使用数码管, 通过编写程序实现数字的显示。 要求:设计合适的电路连接图, 编写程序实现数字的显示, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

17

本实验要求数码管循环显示 1 ~ 9 , 每隔 1 秒显示一个数字, 用共阴数码管。

数码管显示数字时, 只要将相应笔段点亮即可。每个数字对应一个子程序。在主程序中每隔 1 秒调用相应子程序, 让数码管循环显示 1 ~9 数字, 每一个数字显示的时间由延时时间来决定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
int x = 0;
int y = 0;
int z = 0;

int a = 7; // 数字 IO 口 7 连接数码管 a 段
int b = 6; // 数字 IO 口 6 连接数码管 b 段
int c = 5; // 数字 IO 口 5 连接数码管 c 段
int d = 11; // 数字 IO 口 11 连接数码管 d 段
int e = 10; // 数字 IO 口 10 连接数码管 e 段
int f = 8; // 数字 IO 口 8 连接数码管 f 段
int g = 9; // 数字 IO 口 9 连接数码管 g 段
int dp = 4; // 数字 IO 口 4 连接数码管小数点段
void digital_1(void) // 显示数字 1
{
unsigned char j;
digitalWrite(c, HIGH); // 点亮 c 段
digitalWrite(b, HIGH); // 点亮 b 段
for (j = 7; j <= 11; j++) //7~11 口相应段拉低:a,f,g,e,d
digitalWrite(j, LOW);
digitalWrite(dp, LOW); // 小数点不点亮
}
void digital_2(void) // 显示数字 2
{
unsigned char j;
digitalWrite(b, HIGH);
digitalWrite(a, HIGH);
for (j = 9; j <= 11; j++)
digitalWrite(j, HIGH);
digitalWrite(dp, LOW);
digitalWrite(c, LOW);
digitalWrite(f, LOW);
}
void digital_3(void) // 显示数字 3
{
unsigned char j;
digitalWrite(g, HIGH);
digitalWrite(d, HIGH);
for (j = 5; j <= 7; j++)
digitalWrite(j, HIGH);
digitalWrite(dp, LOW);
digitalWrite(f, LOW);
digitalWrite(e, LOW);
}
void digital_4(void) // 显示数字 4
{
digitalWrite(c, HIGH);
digitalWrite(b, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
digitalWrite(a, LOW);
digitalWrite(e, LOW);
digitalWrite(d, LOW);
}
void digital_5(void) // 显示数字 5
{
unsigned char j;
for (j = 7; j <= 9; j++)
digitalWrite(j, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(dp, LOW);
digitalWrite(b, LOW);
digitalWrite(e, LOW);
}
void digital_6(void) // 显示数字 6
{
unsigned char j;
for (j = 7; j <= 11; j++)
digitalWrite(j, HIGH);
digitalWrite(c, HIGH);
digitalWrite(dp, LOW);
digitalWrite(b, LOW);
}
void digital_7(void) // 显示数字 7
{
unsigned char j;
for (j = 5; j <= 7; j++)
digitalWrite(j, HIGH);
digitalWrite(dp, LOW);
for (j = 8; j <= 11; j++)
digitalWrite(j, LOW);
}
void digital_8(void) // 显示数字 8
{
unsigned char j;
for (j = 5; j <= 11; j++)
digitalWrite(j, HIGH);
digitalWrite(dp, LOW);
}
void digital_9(void) // 显示数字 9
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, HIGH);
}
void setup()
{
int i; // 变量声明
for (i = 4; i <= 11; i++)
pinMode(i, OUTPUT); // 设置 4-11 为输出口
}
void loop()
{
while (1)
{
digital_1(); // 显示数字 1
delay(1000); // 延时 1s
digital_2(); // 显示数字 2
delay(1000); // 延时 1s
digital_3(); // 显示数字 3
delay(1000); // 延时 1s
digital_4(); // 显示数字 4
delay(1000); // 延时 1s
digital_5(); // 显示数字 5
delay(1000); // 延时 1s
digital_6(); // 显示数字 6
delay(1000); // 延时 1s
digital_7(); // 显示数字 7
delay(1000); // 延时 1s
digital_8(); // 显示数字 8
delay(1000); // 延时 1s
digital_9(); // 显示数字 9
delay(1000); // 延时 1s
}
}

四位数码管实验

任务: 使用四位数码管, 通过编写程序实现数字的显示。 要求:设计合适的电路连接图, 编写程序实现数字的显示, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

18-5467 学号

本实验用 UNO 驱动一块四位共阴数码管。使第一位显示 5 , 第二位显示 4, 第三位显示 6, 第四位显示 7, 每次只显示一位, 显示间隔 0.5 秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#define SEG_A 2  					//Arduino Pin2--->SegLed Pin11
#define SEG_B 3 //Arduino Pin3--->SegLed Pin7
#define SEG_C 4 //Arduino Pin4--->SegLed Pin4
#define SEG_D 5 //Arduino Pin5--->SegLed Pin2
#define SEG_E 6 //Arduino Pin6--->SegLed Pin1
#define SEG_F 7 //Arduino Pin7--->SegLed Pin10
#define SEG_G 8 //Arduino Pin8--->SegLed Pin5
#define SEG_H 9 //Arduino Pin9--->SegLed Pin3
#define COM1 10 //Arduino Pin10--->SegLed Pin12
#define COM2 11 //Arduino Pin11--->SegLed Pin9
#define COM3 12 //Arduino Pin12--->SegLed Pin8
#define COM4 13 //Arduino Pin13--->SegLed Pin6
unsigned char table[10][8] =
{
{0, 0, 1, 1, 1, 1, 1, 1}, //0
{0, 0, 0, 0, 0, 1, 1, 0}, //1
{0, 1, 0, 1, 1, 0, 1, 1}, //2
{0, 1, 0, 0, 1, 1, 1, 1}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{0, 1, 1, 0, 1, 1, 0, 1}, //5
{0, 1, 1, 1, 1, 1, 0, 1}, //6
{0, 0, 0, 0, 0, 1, 1, 1}, //7
{0, 1, 1, 1, 1, 1, 1, 1}, //8
{0, 1, 1, 0, 1, 1, 1, 1} //9
};
void setup()
{
pinMode(SEG_A, OUTPUT); // 设置为输出引脚
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(SEG_H, OUTPUT);
pinMode(COM1, OUTPUT);
pinMode(COM2, OUTPUT);
pinMode(COM3, OUTPUT);
pinMode(COM4, OUTPUT);
}
void loop()
{
Display(1, 5); // 第 1 位显示 1
delay(500);
Display(2, 4); // 第 2 位显示 2
delay(500);
Display(3, 6); // 第 3 位显示 3
delay(500);
Display(4, 3); // 第 4 位显示 4
delay(500);
}
void Display(unsigned char com, unsigned char num)
{
digitalWrite(SEG_A, LOW); // 去除余晖
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_H, LOW);
switch (com) // 选通位选
{
case 1:
digitalWrite(COM1, LOW); // 选择位 1
digitalWrite(COM2, HIGH);
digitalWrite(COM3, HIGH);
digitalWrite(COM4, HIGH);
break;
case 2:
digitalWrite(COM1, HIGH);
digitalWrite(COM2, LOW); // 选择位 2
digitalWrite(COM3, HIGH);
digitalWrite(COM4, HIGH);
break;
case 3:
digitalWrite(COM1, HIGH);
digitalWrite(COM2, HIGH);
digitalWrite(COM3, LOW); // 选择位 3
digitalWrite(COM4, HIGH);
break;
case 4:
digitalWrite(COM1, HIGH);
digitalWrite(COM2, HIGH);
digitalWrite(COM3, HIGH);
digitalWrite(COM4, LOW); // 选择位 4
break;
default: break;
}
digitalWrite(SEG_A, table[num][7]); //a 查询码值表
digitalWrite(SEG_B, table[num][6]);
digitalWrite(SEG_C, table[num][5]);
digitalWrite(SEG_D, table[num][4]);
digitalWrite(SEG_E, table[num][3]);
digitalWrite(SEG_F, table[num][2]);
digitalWrite(SEG_G, table[num][1]);
digitalWrite(SEG_H, table[num][0]);
}

1602 液晶实验

任务: 使用 1602 液晶显示屏, 通过编写程序实现文字和图案的显示。 要求:设计合适的电路连接图, 编写程序实现文字和图案的显示, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

19

LCD 1602 是一款简易通用液晶, 可以显示 ASCII 码的英文字母 , 数。 字和标点符号(不能显示中文)。总共可以显示 2 行, 每行 16 个字符, 本实验使用 Arduino 直接驱动 1602 液晶显示文字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <LiquidCrystal.h> // 申明 1602 液晶的函数库
// 申明 1602 液晶的引脚所连接的 Arduino 数字端口, 8 线或 4 线数据模式, 任选其一
LiquidCrystal lcd(12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2); //8 数据口模式连线声明
//LiquidCrystal lcd(12,11,10,5,4,3,2); //4 数据口模式连线声明
int i;

void setup()
{
lcd.begin(16, 2); // 初始化 1602 液晶工作 模式
// 定义 1602 液晶显示范围为 2 行 16 列字符
while (1)
{
lcd.home(); // 把光标移回左上角, 即从头开始输出
lcd.print("Hello World"); // 显示
lcd.setCursor(0, 1); // 把光标定位在第 1 行, 第 0 列
lcd.print("Welcome to BST-Arduino"); // 显示
delay(500);
for (i = 0; i < 3; i++)
{
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
}
for (i = 0; i < 24; i++)
{
lcd.scrollDisplayLeft();
delay(500);
}
lcd.clear();
lcd.setCursor(0, 0); // 把光标移回左上角, 即从头开始输出
lcd.print("Hi,"); // 显示
lcd.setCursor(0, 1); // 把光标定位在第 1 行, 第 0 列
lcd.print("Arduino is fun"); // 显示
delay(2000);
}
}

void loop()
{}// 初始化已完成显示, 主循环无动作

舵机控制实验

任务: 使用外部舵机, 通过编写程序实现舵机的控制。 要求:设计合适的电路连接图, 编写程序实现舵机的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

20

舵机也叫伺服电机, 伺服马达(Servo )。早期在机器人模型上使用最多, 用于控制模型的舵面。舵机接受一个控制指令后可以自动转动到一个比较精确的角度, 非常适合在关节型机器人产品使用。

20-2

在串口监视器输入数字后, 可控制舵机实现转动;

Arduino 控制舵机有两种方法:

  • 通过普通数字口产生不同占空比的方波, 模拟 PWM 信号进行舵机定位。
  • 利用 Arduino 自带 Servo 函数控制。优点:编程简单;缺点:UNO 只能利用数字 9 口和 10 口控制 2 路舵机。
  • UNO 驱动能力有限, 控制 2 个及以上舵机时需外接电源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//UART send 1~9==>20~180 degree
int servopin = 9; // 设置舵机驱动脚到数字口 9
int myangle;// 定义角度变量
int pulsewidth;// 定义脉宽变量
int val;

void servopulse(int servopin, int myangle) /* 定义一个脉冲函数, 用来模拟方式产生 PWM 值 */
{
pulsewidth = (myangle * 11) + 500; // 将角度转化为 500-2480 的脉宽值
digitalWrite(servopin, HIGH); // 将舵机接口电平置高
delayMicroseconds(pulsewidth);// 延时脉宽值的微秒数
digitalWrite(servopin, LOW); // 将舵机接口电平置低
delay(20 - pulsewidth / 1000); // 延时周期内剩余时间
}

void setup()
{
pinMode(servopin, OUTPUT); // 设定舵机接口为输出接口
Serial.begin(9600);// 设置波特率为 9600
Serial.println("servo=o_seral_simple ready" ) ;
}

void loop()
{
val = Serial.read(); // 读取串口收到的数据
if (val > '0' && val <= '9') // 判断收到数据值是否符合范围
{
val = val - '0'; // 将 ASCII 码转换成数值, 例 '9'-'0'=0x39-0x30=9
val = val * (180 / 9); // 将数字转化为角度, 例 9*(180/9)=180
Serial.print("moving servo to ");
Serial.print(val, DEC);
Serial.println();
for (int i = 0; i <= 50; i++) // 产生 PWM 个数, 等效延时以保证能转到响应角度
{
servopulse(servopin, val); // 模拟产生 PWM
}
}
}

步进电机实验

任务: 使用外部步进电机, 通过编写程序实现步进电机的控制。 要求:设计合适的电路连接图, 编写程序实现步进电机的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

21

21-2

步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号, 它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。可以通过控制脉冲个数来控制角位移量, 从而达到准确定位目的 ;也可以通过控制脉冲频率来控制电机转动的速度和加速度, 从而达到调速目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<Stepper.h>
#define steps 100
Stepper Stepper(steps, 8, 9, 10, 11);
void setup()
{
Stepper.setSpeed(90);
Serial.begin(9600);
}
void loop()
{
Serial.println("clockwise");
Stepper.step(2048);
delay(500);
Serial.println("counterclockwise");
Stepper.step(-1024);
delay(500);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<Stepper.h>
const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
const int aInPin = A0;
int val;

void setup() {
myStepper.setSpeed(200);
Serial.begin(9600);
}

void loop() {
val = analogRead(aInPin);
val = map(val, 0, 1023, 0, 99);
Serial.println(val);
if (val > 50) {
Serial.println("clockwise");
myStepper.step(stepsPerRevolution / 2);
delay(500);
}
else {
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution / 2);
delay(500);
}
}

红外遥控实验

任务: 使用红外遥控器, 通过编写程序实现红外遥控的功能。 要求:设计合适的电路连接图, 编写程序实现红外遥控的功能, 记录测试数据并进行分析。

红外遥控系统由调制, 发射, 接收和解调等部分组成。

连接 UNO 板与电脑,UNO 板与拓展板

22

一体化红外接收头(1838), 内部集成了红外接收电路, 包括红外检测二极管, 放大器, 限幅器, 带通滤波电容, 积分电路, 比较器等。能够将接收到的调制波进行解调, 还原为遥控器发射出的原始编码。红外检测二极管将红外光信号转换为微弱的电信号。本实验利用红外遥控器发出的红外载波信号, 经一体化红外接收头接收并解调, 来控制相应 LED 通断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <IRremote.h>				// 包含红外库 
int RECV_PIN = 11; // 端口声明
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1 = 0x00FF6897; // 编码示例, 与发送匹配用
long off1 = 0x00ff30CF;
long on2 = 0x00FF9867;
long off2 = 0x00FF18E7;
long on3 = 0x00FFB04F;
long off3 = 0x00FF7A85;
long on4 = 0x00FF10EF;
long off4 = 0x00FF42BD;
long on5 = 0x00FF38C7;
long off5 = 0x00FF4AB5;
long on6 = 0x00FF5AA5;
long off6 = 0x00FF52AD;
IRrecv irrecv(RECV_PIN);
decode_results results; // 结构声明
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results)
{
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
Serial.println("Could not decode message");
}
else
{
if (results->decode_type == NEC)
{
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY)
{
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5)
{
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6)
{
Serial.print("Decoded RC6: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1)
{
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void setup()
{
pinMode(RECV_PIN, INPUT); // 端口模式, 输入
pinMode(LED1, OUTPUT); // 端口模式, 输出
pinMode(LED2, OUTPUT); // 端口模式, 输出
pinMode(LED3, OUTPUT); // 端口模式, 输出
pinMode(LED4, OUTPUT); // 端口模式, 输出
pinMode(LED5, OUTPUT); // 端口模式, 输出
pinMode(LED6, OUTPUT); // 端口模式, 输出
pinMode(13, OUTPUT); // 端口模式, 输出
Serial.begin(9600); // 波特率 9600
irrecv.enableIRIn(); // Start the receiver
}
int on = 0;
unsigned long last = millis();
void loop()
{
if (irrecv.decode(&results)) // 调用库函数:解码
{
// If it's been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
dump(&results);
}
if (results.value == on1 )
digitalWrite(LED1, HIGH);
if (results.value == off1 )
digitalWrite(LED1, LOW);
if (results.value == on2 )
digitalWrite(LED2, HIGH);
if (results.value == off2 )
digitalWrite(LED2, LOW);
if (results.value == on3 )
digitalWrite(LED3, HIGH);
if (results.value == off3 )
digitalWrite(LED3, LOW);
if (results.value == on4 )
digitalWrite(LED4, HIGH);
if (results.value == off4 )
digitalWrite(LED4, LOW);
if (results.value == on5 )
digitalWrite(LED5, HIGH);
if (results.value == off5 )
digitalWrite(LED5, LOW);
if (results.value == on6 )
digitalWrite(LED6, HIGH);
if (results.value == off6 )
digitalWrite(LED6, LOW);
last = millis();
irrecv.resume(); // Receive the next value
}
}

超声波测距实验

任务: 使用超声波传感器, 通过编写程序实现距离的测量。 要求:设计合适的电路连接图, 编写程序实现距离的测量, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

23

HC-SR04 超 超 声波测距模块可提供 2cm-400cm 的非接触式距离感测 , 测距精度达 3mm, 模块包括超声波发射器, 接收器与控制电路。

23-2

本实验利用超声波测得的距离从串口中显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const int TrigPin = 2; 
const int EchoPin = 3;
float cm;

void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
digitalWrite(TrigPin, LOW); // 低高低电平发一个短时间脉冲去 TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; // 将回波时间换算成 cm
cm = (int(cm * 100.0)) / 100.0; // 保留两位小数
Serial.print(cm); Serial.print("cm");
Serial.println();
delay(1000);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 4, 7, 8, 11, 12, 13); //4 数据口模式
int Echo = A5, Trig = A4, Distance = 0;

void setup() {
Serial.begin(9600);
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
lcd.begin(16, 2); // 初始化 1602 工作模式为 2 行 16 列
}

void Distance_test() {
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒)
Fdistance = Fdistance / 58; //Y 米 =(X 秒 *344)/2, X 秒 =( 2*Y 米)/344
//==》X 秒 =0.0058*Y 米 ==》厘米 = 微秒 /58
Serial.print("Distance:");
Serial.println(Fdistance); // 回车后显示距离
Distance = Fdistance;
}

void loop() {
Distance_test();
if ((2 < Distance) & (Distance < 400)) // 超声波测距范围 2cm 到 400cm
{
lcd.home(); // 把光标移回左上角, 即从头开始输出
lcd.print(" Distance: "); // 显示
lcd.setCursor(6, 2); // 把光标定位在第 2 行, 第 6 列
lcd.print(Distance); // 显示距离
lcd.print("cm"); // 显示
}
else
{
lcd.home(); // 把光标移回左上角, 即从头开始输出
lcd.print("!!! Out of range"); // 显示超出距离
}
delay(250);
lcd.clear();
}

继电器实验

任务: 使用外部继电器, 通过编写程序实现继电器的控制。 要求:设计合适的电路连接图, 编写程序实现继电器的控制, 记录测试数据并进行分析。

连接 UNO 板与电脑,UNO 板与拓展板

24

Arduino I/O 口 输出电流能力有限(< 40 mA ), 当想要驱动大电流负载或高电压负载(如灯泡, 马达或大风扇)时,
会需要一个中继电路, 最简单的办法是使用继电器。

24-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const int buttonPin = 2; // 按鈕(pushbutton)
const int relayPin = 13; // 繼電器(Relay)
int relayState = 0; // 繼電器狀態
void setup() {
Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT
pinMode(relayPin, OUTPUT); // 把 relayPin 設置成 OUTPUT
}
void switchRelay() {
if (relayState == 0)
relayState = 1; // 把繼電器狀態改為 ON
else
relayState = 0; // 把繼電器狀態改為 OFF
digitalWrite(relayPin, relayState); // 讓繼電器作動, 切換開關
Serial.print("Relay status: "); // 把繼電器的狀態印到 Serial Port
Serial.println(relayState);
}
void loop() {
int buttonState; // 讀取按鈕狀態
buttonState = digitalRead(buttonPin); // 檢查按鈕是否被按下(pressed)
if (buttonState == HIGH) {
switchRelay(); // 切換繼電器開關
delay(500); // 稍候 0.5 秒, 以免風扇切換太頻繁
}
}