简 介: 本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的关于单片机端口软件用例部分内容。
关键词
: 输入输出,MicroPython,Pin,MM32F3277
- 本书稿内容隶属于 MicroPython内核开发笔记:书内嵌入实验任务 中的内容。
软件用例: PIN模块提供的基本端口输入输出功能。
这部分书稿内容包括有:
- 输出实验:
- 输入实验:
- 书稿内位置:
§01 书稿内容
利用模块 Pin 可以将单片机的 IO 端口配置成输入、输出、附加功能等模式。基本使用语法为:
led = Pin('PB2', mode=Pin.OUT_PUSHPULL)
上面语句将单片机 PB2 管脚配置成推挽输出管脚,并定义为变量 led 。其中 Pin 的第一个参数为单片机管脚命名字符串,第二个参数为管脚模式。可以使用的管脚输出模式包括:
序号 | 模式名称 | 功能描述 |
---|---|---|
1 | IN_ANALOG | 作为 AD 模拟量输入端口 |
2 | IN_FLOATING | 高阻输入端口 |
3 | IN_PULLDOWN | 带有下拉电阻输入端口 |
4 | IN_PULLUP | 带有上拉电阻输入端口 |
5 | OUT_OPENDRAIN | 漏极开路输出端口 |
6 | OUT_PUSHPULL | 推挽输出端口 |
7 | AF_OPENDRAIN | 漏极开路附加功能端口 |
8 | AF_PUSHPULL | 推挽输出附加功能端口 |
设置输出管脚高低电平有以下几种方法,以 led 端口为例。
- 设置高电平:led(1),led.on(),led.value(1)
- 设置低电平:led(0),led.off(),led.value(1)
读取端口逻辑电平的方法有以下几种,以 led 端口为例。
key = Pin("PC1", Pin.IN_PULLUP)
print(key.value())
print(key())
一、PIN输出实验
1、LED闪烁实验
单片机的 IO 端口驱动外部 LED 有两种模式:
- 输出电流驱动模式;
- 输入电流驱动模式;
在下面实验中使用的是输出电流驱动模式完成对外部LED驱动。
▲ 图1.1.1 单片机驱动LED两种模式
左:输出电流驱动模式;右:输入电流驱动模式
利用 Pin 控制单片机管脚高低电平,驱动外部 LED 闪烁。实验硬件平台是简易实验板,其中 PB2 连接外部 LED。 高电平点亮,低电平熄灭。
实验软件代码如下:
from machine import Pin
def delay(loop=10000):
for _ in range(loop):
pass
led = Pin('PB2', mode=Pin.OUT_PUSHPULL)
print('Test LED.')
while True:
led(1)
delay(50000)
led(0)
delay(50000)
软件中,首先将 PB2 定义成 输出管脚,模式为推挽输出。当它为高电平时,可以输出电流点亮LED。 管脚输出包括两种模式:
- OUT_PUSHPULL:推挽模式;
- OUT_OPENDRAIN:漏极开路模式;
采用输出电流驱动LED,只能选择 PUSHPULL模式;采用输入电流驱动LED,则上述两种模式都是可以使用的。
请注意,在这个软件例子中,编写了 delay 实现软件延时。在本书后面,将会介绍内部定时器模块 time,将来 delay 子程序可以使用 time 模块中的 sleep 相关函数替代。
▲ 图1.1.2 LED闪烁运行情况
2、单个管脚控制两个LED
这个实验的目的是展示单片机输出管脚配置成两种不同的输出模式(推挽模式和漏极开路模式)的区别。单片机输出管脚为低电平时,两种模式都可以从外部吸收电流;单片机输出管脚为高电平是,推挽模式可以输出电流,但漏极开路模式则相当于高阻状态。
在特殊情况下,需要单片机 一个 IO 口可以同时独立控制两个 LED 的状态。下面实验就是利用 LED 的单向导电特性以及导通电压阈值特性来实现单个 IO 口独立控制两个 LED 状态。实验电路原理图如下:
▲ 图1.1.3 单个IO口控制两个LED实验电路
电路中采用的两个 LED 是白色或者蓝色LED,它们点亮电压都超过2.5V,所以单片机电压 VCC=3.3V 不足以直接驱动两个串联的 LED 。当单片机输出为高阻时,两个 LED db 熄灭;当单片机管脚输出为低电平时,LED1点亮;当单片机管脚输出为高电平是,LED2点亮;当单片机管脚以较高频率交替输出高、低电平时,LED1、LED2 将会同时被点亮。
from machine import Pin
import time
led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
led(1)
ledstatus = 0
def ledout(status):
global led
if status == 0:
led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
led(1)
else:
led = Pin("PC0", mode=Pin.OUT_PUSHPULL)
if status == 1:
led(1)
elif status == 2:
led(0)
else:
led(1-led())
print("Test two LEDs.")
count = 0
while True:
ledout(ledstatus)
count += 1
if count >= 200:
count = 0
ledstatus += 1
if ledstatus >= 4: ledstatus = 0
time.sleep_ms(5)
在上述程序中,主循环程序使用了 time.sleep_ms 函数进行延迟,每隔 5ms 通过函数 ledout 改动 LED 控制端口 led 的设置和状态。 在 ledout 函数中, 根据输入 status 取值 0,1,2,3, 分别设置 led 为 高阻输出、高电平、低电平以及状态切换。
主循环内,每隔 1 秒钟对 led 状态在 0、1、2、3 之间进行切换,对于外部的两个 LED 则分别处在 全灭、LED1 亮、LED2 亮、全点亮。
▲ 图1.1.4 单个IO口控制两个LED分别点亮
二、PIN输入实验
1、按钮控制LED
选取单片机 PC1 设置为按键输入端口,使用其状态控制 LED 的点亮。
▲ 图1.2.1 利用输入端口控制LED状态
实验代码如下:
from machine import Pin
led = Pin("PC0", Pin.OUT_PUSHPULL)
key = Pin("PC1", Pin.IN_PULLUP)
while True:
led(key())
直接使用输入端口 key() 获得输入端口状态, 将其取值改变 led 输出的电平。由于输入端口通过按键接地线,所以在初始化 key 的时候,使用的是带有上拉电阻的输入模式。
▲ 图1.2.2 通过按键改变LED的状态
2、输入端口的电压特性
单片机 MM32F3277 管脚作为 IO 输入端口,输入特性相当于一个比较器,比较器阈值为工作电压的一半(3.3/2 = 1.65V)。当输入电压大于阈值时,输入逻辑电平为1,当输入电压小于阈值时,输入逻辑为 0 。
使用可编程数字直流电压施加在单片机输入端口 PC1, 仍旧运行上面按键程序,将 PC1 输入逻辑电平通过 PC0 输出。测量输入端口电压特性电路图如下图所示。
▲ 图1.2.3 测试输入端口电压特性
使用万用表测量输入电压与输出电平之间的关系,如下图所示。 可以看到当输入端口电压大于1.65V时,输出为高电平;小于1.65V时,输出为低电平。
▲ 图1.2.4 输入电压IN与输出电压
在本章实验中安排输入端口特性,是为在下一章 utime 实验中,使用 Pin 的输入特性来测量一些物理量做准备。
三、Pin输入输出
在PLUS_F3270实验板上具有四个板载 LED(H2,A15,A0,G13)以及四个按键(D7,G7,G8,G9)。下面程序则是通过四个按键控制四个 LED。
▲ 图1.3.1 四个LED与四个KEY所在的位置
▲ 图1.3.2 四个LED与四个按键电路原理图
1、实验程序
from machine import PWM,Pin
import time
led1 = Pin('PH2', Pin.OUT_PUSHPULL, value=1)
led2 = Pin('PA15', Pin.OUT_PUSHPULL, value=1)
led3 = Pin('PA0', Pin.OUT_PUSHPULL, value=1)
led4 = Pin('PG13', Pin.OUT_PUSHPULL, value=1)
key1 = Pin('PD7', Pin.IN_PULLUP)
key2 = Pin('PG7', Pin.IN_PULLUP)
key3 = Pin('PG8', Pin.IN_PULLUP)
key4 = Pin('PG9', Pin.IN_PULLUP)
leddim = [led1,led2,led3,led4]
keydim = [key1,key2,key3,key4]
while True:
for l,k in zip(leddim, keydim):
l(k.value())
time.sleep_ms(10)
2、实验结果
分别按动四个按键,分别控制四个 LED 的点亮与熄灭。
▲ 图1.3.3 按动按键与LED点亮
※ 总 结 ※
本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的关于单片机端口软件用例部分内容。
一、改进建议
现在这个版本, 无法允许直接通过 Pin.mode 对 Pin的属性进行修改。 比如:
led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
使用 led.mode = Pin.OUT_OPENDRAIN 则是非法的。
建议增加通过 led.mode 直接修改,可以提高程序的执行效率。
■ 相关文献链接:
● 相关图表链接: