python编辑七段数码管引脚图_少儿Python程序第十二讲:单片机控制数码管

本讲继续学习用Python控制单片机,并用单片机连接和控制其它硬件,具体目标是利用开发板控制四位数码管,显示指定的数字。实验效果如图12.1所示:图12.1 单片机控制四位数码管显示数字

注意:请先把上一节的例程及练习做完,打好基础,再学习本课内容。

12.1 硬件

本例的难点在于:新增加了一些硬件、连接比较复杂、代码较长、逻辑也相对复杂,需要控制数字到显示的转换。实验需要的硬件包括:TPYBoard V102开发板(单片机)。

5461AS四位共阴数码管。

面包板一块。

200欧电阻四个。

连接线:10条公对母、10条母对母。

12.1.1 数码管

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管的每个数字由七段发光二极管组成,另外一个显示小数点。通过控制每一段二极管是否点亮组成不同的数字。用a,b,c,d,e,f,g,h八个字母代表对应位置的二极管,如图12.2所示。图12.2 数码管图示

一般情况下,点亮一个发光二极管需要一正一负两条连接线,那么显示四个数字,每个数字由八位发光二极管组成,则需要连接非常多的数据线。数码管简化了连线,一般只需要12条连接线,其中八条控制显示的具体数字,另外四条控制当前操作的是四个数字中的具体哪一位数字。

数码管后面排针连接开发板,接收来自开发板的控制信息,本例中使用的5461AS四位共阴数码管引脚顺序如12.2所示。

注意:由于各厂商硬件不同,不同型号数码管的引脚位置可能存在差异。

12.1.2 面包板

面包板上有很多小插孔,专为电子电路的无焊接实验设计制造。各种电子元器件可根据需要随意插入或拔出,免去了焊接,节省了电路的组装时间,主要用于电路的组装、调试和实验。

面包板的板底有金属条,当元件插入孔中时与金属条接触,从而达到导电的目的。比如中间区域相连的五个孔相互纵向导通,上下方区域横向导通,如图12.3所示:图12.3 面包板连通示意图

12.1.3 电阻

电阻器简称为电阻,是一种限流元件,将电阻接在电路中后,可限制通过它所连支路的电流大小。电阻器的阻值是固定的,一般有两个引脚,如图12.4所示:12.4 电阻

实验一般购买“电阻包”,几元钱可购买不同阻值的几百个电阻。可以看到电阻上带有色环,根据不同颜色及其排列方式可判断电阻大小。

计算电阻值先要确定色环的顺序,比如对于一个五道色环的电阻而言,第五环和第四环之间的间隔比第一环和第二环之间的间隔要宽一些。五环电阻的第一、二、三环分别代表三位有效数的阻值;第四环代表倍率;第五环代表误差。具体颜色对应如表12.1所示:表12.1 电阻色环颜色对应表

例如:如果色环依次为“黄紫黑黑棕”,前三位有效数字为470,第四位100,因此,470*100=470,电阻为470欧姆,允许偏差为正负1%。

课后练习:(练习答案见本讲最后的小结部分)

练习一:利用电阻的色环计算几个电阻的阻值,并使用本小节中的网址验证计算结果是否正确。

12.1.4 连接线

连接线用于连接各个电子元件,连线的接口需要与元件匹配。接口分为公头和母头,公头为针,母头为孔,连接线分为以下几种:公对公、母对母、公对母,如图12.5所示:图12.5 连接线

图中从上到下依次是:公对母线、母对母线、公对公线,以及专供面包板使用的公对公连接线。

12.1.5 硬件连接

X1-X8针连接数码管的a-h排针用于控制每个数字对应的8位发光二极管是否点亮,Y1-Y4针串联电阻后分别与数码管的1-4排针连接,用于指定当前信号是控制四位中的哪一位数字。

请读者按图12.6连接各个元件。图12.6 数码管接线图

12.2 编写代码

代码较长,因此将其分成三部分:初始化、绘制数字、控制程序。请认真阅读代码及对应说明,理解每一句代码。本节代码较长,注意不要输入错误。

12.2.1 初始化

第一部分初始化。

01 from pyb import Pin

02 import pyb

03 x_pin = {}

04 for i in range(1,8):

05 key = 'X'+str(i)

06 x_pin[key] = Pin(key, Pin.OUT_PP)

07 x_pin[key].high()

08

09 y_pin = {}

10 for i in range(1,5):

11 key = 'Y'+str(i)

12 y_pin[key] = Pin(key, Pin.OUT_PP)

13 y_pin[key].high()

第01行引入硬件控制pyb模块的Pin类,用于在程序中操作排针。

第02行引入pyb模块。

第03-07行建立字典x_pin用于控制排针X1-X8。

第04行用循环方式分别将1-8赋值给变量i。

第05行每次循环生成变量key:X1、X2……X8

第06行每次循环给字典添加一个键为key,值指向排针的元素,其中OUT_PP指定建立方式为向排针输出数据(而非从排针读入数据)。

第07行将该针置为高电平。

同理,第09-13行建立字典y_pin用于控制排针Y1-Y4。

电流从高电平引脚流向低电平引脚,由于X1-X8,Y1-Y4都被设为高电平,因此,初始化之后无电流流过,因此没有数字被点亮。

12.2.2 绘制数字

第二部分用于向数码管发送不同的信号以显示不同数字,其中定义了draw函数用于绘制每一位数字。

01 num = {}

02 num['0'] = '11111100'

03 num['1'] = '01100000'

04 num['2'] = '11011010'

05 num['3'] = '11110010'

06 num['4'] = '01100110'

07 num['5'] = '10110110'

08 num['6'] = '10111110'

09 num['7'] = '11100000'

10 num['8'] = '11111110'

11 num['9'] = '11110110'

12

13 def draw(idx, n):

14 for i in range(1,8):

15 key = 'X'+str(i)

16 x_pin[key].low()

17 for i in range(1,5):

18 key = 'Y'+str(i)

19 if idx == i:

20 y_pin[key].low()

21 else:

22 y_pin[key].high()

23 for i in range(1,8):

24 key = 'X'+str(i)

25 if num[n][i-1] == '1':

26 x_pin[key].high()

第01-12行建立字典,字典中的键是被绘制的数字,值是长度为8的字符串,字符串的每一位对应八位数码管的每一个发光二极管,例如:显示数字0时,abcdef位置点亮,而中间的g位置和后面的小数点h位置不亮,因此,对应的字符串为“11111100”。 每个数值依次对应图12.2中的a-h。

第13行定义了单个字母绘制函数draw,函数提供两个参数,第一个参数用于指定绘制哪一位数字,第二个参数用于指定绘制的具体数字0-9。

第14-16行是复位操作,将X1-X8置为低电平。

第17-22行判断设置的是哪一位数据,将被设置的位置设为低电平。

第23-26行从num字典中取出具体数字对应的发光二极管亮灭的字符串,并将需要点亮位置对应的针置为高电平,此时位置idx中对应位置的发光二极管被点亮。

12.2.3 控制程序

本例中控制程序显示“4278”四个数字,由于每次设置只能显示一个数字,如果需要四个数字同时显示,则需要不断循环点亮四个数字,利用视错觉看到LED灯同时点亮的效果。设置每次显示的时间间隔为0.002秒,显示四个数字约0.01秒左右。人眼每秒钟能识别约三十张图片(30帧),识别每张图的时间约0.03秒,由于显示速度比人眼识别速度快,所以人眼看不到LED灯的亮灭变换。

下面程序利用不断循环的方法,将四个数字依次设置到对应的位置。

01 show_str = '4278'

02 idx = 0

03 while True:

04 draw(idx+1, show_str[idx])

05 pyb.udelay(2000)

06 idx = idx + 1

07 if idx >= 4:

08 idx = 0

第01行将需要显示的数字4278赋值给字符串变量show_str。

第02行创建变量idx用于指定显示第几个数字。

第03行建立循环不断写入四个数字。

第04行调用draw 函数写入具体的数字。

第05行的udelay使程序阻塞2000微秒,1微秒= 0.000001秒,2000微秒=0.002秒。

第06-08修改idx,使得idx从0-3循环变化。

课后练习:

练习二:用数码管显示“ABCD”。

12.3 思维训练

这一讲中的实验需要大量插线,虽然没有复杂的逻辑,但工作过程比较复杂。动手尝试很重要,不需要一次插对所有部件,所以看到有一个数码管点亮时,无论它显示正不正确,都是一个进步。然后再基于当前的状态逐步改造。

解决复杂的问题时,首先需要把大问题切分成小块的“子问题”,然后逐个解决子问题,最后还需要考虑子问题之间的相互作用。问题复杂,解决问题的过程也比较复杂。

对于解决复杂的问题,做笔记是非常重要的习惯。当步骤变多,有时需要上网查资料,找到答案后一定要记下来。可以用纸的笔记本,手机上记事本App,或者云端记事本(如:有道云笔记),无论使用什么方法,重要的是记录过程。另外,需要注意:一定要记录清楚,不仅自己能理解,也要让其他人可以看懂,尤其是低龄儿童。

12.3.1 意志力

很多人在童年阶段尝试过多种兴趣班,有的半途放弃,有的花了几年时间学习。在这个过程中到底得到了什么,或者想得到什么?家长可能有以下几种想法:万一是世界冠军的材料,别把孩子耽误了;培养一个兴趣爱好或者一技之长;开阔眼界;太闹在家待不住;或者只是因为周围的人都在学……这几年提倡快乐教育,强调兴趣的重要性,那摔倒了是需要爬起再继续?还是换一条相对好走的路呢?

大多数孩子并不是通过从小的训练,就能成为画家或者运动员,当面临多次挫败,被老师骂成狗,还能再一次调整自己,并且坚持下去,就培养起了一种意志力模式,它可能比学习的知识本身更加重要。之后遇到同等困难的时候,相比没训练过的人更容易克服。

20世纪60年代,斯坦福大学的科学家进行过一个非常著名的意志力实验:规则是把4岁儿童带进一个房间,告诉他们可以马上吃掉一块糖,或者稍等几分钟吃掉两块糖,然后测试人员离开房间,看孩子是否能抵御糖果的诱惑。并进行跟踪记录,当这些孩子上了高中之后,评价这些孩子的成绩、维持友谊能力和处理重要问题的能力,实验的结果是:最后得到两块糖果的孩子SAT成绩平均高出210分,并且在朋友中间也更受欢迎。自控力让他们受益一生。

在高智商和高自控力之间,通过自控力更容易预测一个人在下一学期的表现。如果一个人足够自律,则更加可控。在漫长的成长过程中,自律比智商更加重要。

那么是不是有人生来就有钢铁般的意志力呢?近年来科学家开始研究意志力相关的问题,他们发现意志力不是一种技术,而是一种力量,和肌肉力量一样,也是有限的资源,使用太频繁则会枯竭。在使用意志力的时候也需要注意:不要同时做太多消耗意志力的事,也不要设置超越意志力范围的计划。同时,意志力像肌肉一样,也是可以被塑造的能力。

12.3.2 做计划

培养意志力需要漫长的过程,在意志力不够强大时,也可以通过制定合理的长短期计划达成较好的效果。

生活中没有长期计划,只有短期计划,应付眼前的问题,是大多数小孩,以及不少成年人的做法。当有可能出现棘手的问题,或者令人尴尬的情况,很多时候,我们选择不去想,或者绕开不做。但更好的方法是做出相对的预案。

星巴克有着非常完善的员工培训方案,将有可能遇到的问题和解决方案直接写入员工手册,比如遇到客户的刁难应该如何处理?这使得每个员工无论能力高低,都能很好地应对突发情况。什么东西会伤害到你?通常是全力以赴也解决不了的问题。机遇难以控制,当我们培养起长视的习惯,多设想一些可能遇到的问题和解决方法,通过借鉴,学习,事先用大量的时间准备,即使遇到不如意的情况,反应也不那么狼狈。从而做得更好。

做计划的视角,类似于第10讲中分析问题的角度,需要在不同的层面,做多个计划。在不熟悉的情况下,最好先做一些具体的短期计划,这样即使无法达成最终目标,也能在过程中有所收获。长期计划,可能需要几个月至几年的时间才能实现。这个过程中会遇到各种问题,其它事情的干扰,与其它计划的冲突……因此,长期计划不需要制定得过于详细,在中途也需要不断调整。

12.4小结

12.4.1单词

本讲需要掌握的英文单词如表12.1所示。表12.1本讲需要掌握的英文单词

12.4.2习题答案练习一:利用电阻的色环计算几个电阻的阻值。

(1) 电阻色环顺序:棕棕黑棕棕=110101=1100欧姆

(2) 电阻色环顺序:红紫黑棕棕=270101=2700欧姆练习二:用数码管显示“ABCD”。

01 from pyb import Pin

02

03 x_pin={}

04 for i in range(1,8):

05 key='X'+str(i)

06 x_pin[key]=Pin(key,Pin.OUT_PP)

07 x_pin[key].high()

08

09 y_pin={}

10 for i in range(1,5):

11 key='Y'+str(i)

12 y_pin[key]=Pin(key,Pin.OUT_PP)

13 y_pin[key].high()

14

15 num={}

16 num['A']='11101110'

17 num['B']='11111110'

18 num['C']='10011100'

19 num['D']='11111100'

20

21 def draw(idx,n):

22 for i in range(1,8):

23 key='X'+str(i)

24 x_pin[key].low()

25 for i in range(1,5):

26 key='Y'+str(i)

27 if idx==i:

28 y_pin[key].low()

29 else:

30 y_pin[key].high()

31 for i in range(1,8):

32 key='X'+str(i)

33 if num[n][i-1]=='1':

34 x_pin[key].high()

35

36 show_str='ABCD'

37 idx=0

38 while True:

39 draw(idx+1,show_str[idx])

40 pyb.udelay(2000)

41 idx=idx+1

42 if idx>=4:

43 idx=0

建议先逐行读懂例程再做练习,理解是修改的基础。

你可能感兴趣的:(python编辑七段数码管引脚图_少儿Python程序第十二讲:单片机控制数码管)