目录
一.前言
此博客为付费专栏中帮助格院同学们处理解决9个lab的部分,博主大概会分成2-3次博文帮助大家快速高效的做完9个lab。每一个lab,博主都会详细介绍原因并且基于博主的项目经验进行细节强调,同时会给出每次lab的代码和详细注释。
二.mbed开发板基本介绍
我们先不着急直接进入exercise实验,博主经过很多次把板子烧掉的惨痛教训,决定先给你们讲一讲mbed板子的基本构造和如何正确使用mbed板子(避免烧毁板子【淘宝售价100:挺贵的】)
上图显示的信息包含了百分之九十mbed对应引脚的功能。我们可以看到上图每一个引脚对应的小方块都不尽相同,也就表明每个引脚所包含的功能不尽相同。当我们在使用mbed开发板去使用某些功能时,我们第一步就是通过看这幅图查看引脚的功能定义是否能够满足我们想要实现的功能。例如:我们想使用DigitalOut/DigitalIn,那么D1-D13(D7,D8不能用),A0-A7都能用来作为输入输出口。如果我们想使用UART协议,那么我们看到D0/D1是一组UART口【UART/SPI/I2C这些基本的通信协议我会在后期专栏博文中详细介绍,这里只需要理解每一个引脚都有相应的功能,当我们要实现某些外围设备的功能一定要先确定引脚】
我们同样可以发现处理D/A系列的口以外,我们还有一些其他命名的引脚,但是我们只需要掌握以下引脚的意义和功能:
1. 3.3V : 只要给mbed上电(数据线接入接口就是上电了),3.3V的引脚就会输出大概3.3V左右的电压(不需要写代码控制)
2. 5V:同理,5V的引脚就会输出5V左右的电压(基本会略低于5V)
3. GND:这是一个接地的参考标准引脚,所有的传感器的负极一定要接地,目的是与mbed单片机形成回路
4. Vin: Vin引脚你们在lab中是不会用到的,但是这是一个非常有用的引脚。我们会发现我们现在是通过数据线连接电脑给mbed供电,那要是我们的项目是一个离线项目呢?当我们想把项目做小,就不可能一直拖着一个数据线去供电吧。那么这个时候我们就可以通过电池的正极连接到mbed的Vin口,电池的负极连接mbed板子的GND,同样也就给可以给mbed上电了,效果跟数据线是一样的。
5. 注意!!!!:3.3V和5V的引脚一定不要接到GND,可能会导致mbed的内存瞬间烧坏,外给电压的时候同样要注意不要把高电压加到GND引脚上面。一定一定要切记!!!!!
注:编译平台的使用可以查看我的专栏里面stm32入门教程,我们接下来直接进入lab
三.exercise 1
流程:
1.准备一个红色的LED和一个绿色的LED
2.定义两个DIgitalOut(输出引脚) D5--->红LED D6---->绿LED,注意:每个LED的长的一边为正极与输出引脚端相连,每个LED的短边为负极与GND引脚端相连,按此步骤在面包板上准备好。
3.现在我们需要让红色LED亮的同时绿色LED灭,红色LED灭的同时绿色LED亮,并且每个过程以1s为间隔进行交替
代码:
/*
this is the exercise1
in this task we should lighting
the red led and the green led at the same time
*/
#include"mbed.h"//this is a heading of the programm
// Blinking rate in milliseconds
#define BLINKING_RATE 1000
//define the D5 to output to light red_led
DigitalOut red_led(D5);
//define the D6 to output to light green_led
DigitalOut green_led(D6);
//the next is main function
int main( ){
//while loop
red_led=0;
green_led=1;
while(true){
//let red_led be 0/1
red_led=!red_led;
//let green_led be 0/1
green_led=!green_led;
//wait for the time that BLINKING_RATE
thread_sleep_for(BLINKING_RATE);
}
}
分析:red_led/green_led 是我们分别给D5/D6引脚取的变量名,red_led=0代表D5输出低电平,green_led=1代表D6引脚输出高电平,相反同理
red_led=!red_led这个语句代表的逻辑为非,即相反的意思,例如:我们知道一开始我们定义red_led=0 ,进入循环后,经过thread_sleep_for(1000) [这是一个延时函数,等于看程序在这段期间啥也不做,保持之前的指令进行等待,此函数里面的参数为int型整数,单位为ms],!red_
led=1 ,然后再复制给red_led。
.将以上代码烧录到mbed板子里(将生成的文件拉入mbed的内存),我们就能实现3中所描述的效果。
4.LED本质上是发光二极管,单向导电性,所以题目中叫你把阴极接输出引脚,肯定是会一直不亮的
5.接下来让你把LED的阴极接入D9引脚。那么这里的意义是什么呢? 我们知道我们刚刚的实验是吧阴极都接入GND,我们说GND其实是一个低电位的参考电压,那么当我们把D9作为一个输出引脚,将原本两个LED负极与GND相连改为与D9相连。
情况1:D9输出设为0(低电平):当红灯D5输出为1时,红灯仍然是亮的,当红灯输出为0时,由于两边没有电势差,红灯灭。其实这里当D9输出为0可以认为时GND的效果等效。(绿灯同理)
情况2:D9输出设为1(高电平):当红灯D5输出为1时,两边都是高电平,观察到的结果因为没有电势差所以不亮,当红灯D5输出0时,由于D9虽然为1,但是LED的阴极接D9,单向导电性,即使有电势差也不会亮。
注:题目中还叫你们拿电压表测一测,自己也动手测一测
代码:
/*
this is the exercise1
in this task we should lighting
the red led and the green led at the same time
*/
#include"mbed.h"//this is a heading of the programm
// Blinking rate in milliseconds
#define BLINKING_RATE 1000
//define the D5 to output to light red_led
DigitalOut red_led(D5);
//define the D6 to output to light green_led
DigitalOut green_led(D6);
//define the D9 to output
DigitalOut cathnode(D9);
//the next is main function
int main( ){
//while loop
cathnode=0; //let cathnode be 0/1
red_led=0;
green_led=1;
while(true){
//let red_led be 0/1
red_led=!red_led;
//let green_led be 0/1
green_led=!green_led;
//wait for the time that BLINKING_RATE
thread_sleep_for(BLINKING_RATE);
}
}
由于分两种情况,这里代码cathnode为0,之后把这个值再变成1观察一下现象就ok了。
四.总结
exercise1到这里就结束了,内容不难,但是mbed的基本介绍要理解注意一下。我们通过exercise1知道了如何使用输出,去定义一个程序控制我们想要的引脚输出高电压,并且掌握如何使用延时函数。马上我就会出后面exercise的详细解析。如果存在什么问题一定要第一时间联系博主,订阅了此专栏的同学可以私信博主加博主的联系方式,方便交流学习。