首页 理论教育 改进版的锁

改进版的锁

时间:2022-02-09 理论教育 版权反馈
【摘要】:麻烦在于我们只有3个引脚可以做这件事情,即使是最高级的PICAXE芯片也仅有不超过10个这样的引脚。将所有这些电阻加在一块,得到的是2 kΩ,这是PICAXE 芯片希望我们使用的范围。给b1重新赋值的过程只有在b0的值大于表中的某个数值时才会停止。然而PICAXE程序编辑器可以为你提供莫大的帮助,因为它具有仿真功能。这正是这个实验的纯硬件版本的电路在搭建时所遵循的方法。子程序是任何一个序列的程序语句,应以指令return结束。end将停止PICAXE的运行。

我在实验20中描述的组合锁特别适合用微控制器来实现,因为它需要一系列类似于计算机程序的操作。我将教你如何用PICAXE 08M芯片来对这个项目进行重新设计,而将本书其他实验项目的转换问题留给你去考虑。

以下是你需要用到的东西。

□ 实验20中推荐的同一类的小键盘和继电器。

□ 一个晶体管或者达林顿陈列来放大PICAXE的输出,以使其能够驱动继电器。

获取用户输入

PICAXE芯片的任何输入引脚都可以感知开关的闭合。麻烦在于我们只有3个引脚可以做这件事情,即使是最高级的PICAXE芯片也仅有不超过10个这样的引脚。因此我们怎样才能将一个10键的小键盘连接到08M上呢?

我有一个建议:给小键盘上的各个按键接上不同的电阻器,从而使不同的按键在同一个ADC引脚上施加的电压不同。然后使用ADC功能将电压转换成数值,并用一个可能数值的表格来判断到底是哪个键被按下。这也许不是最优雅的解决方案,但是它可行!

小键盘可以如图5-147那样接线。星号键仍然跟原来的实验一样,用于供电,英磅键也跟以前一样,在你的计算任务结束以后用其来对继电器进行复位。

图5-147 使用总共2 kΩ 电阻值的一个电阻器链,可以快速、简单地将小键盘连接到PICAXE芯片来提供数字输入。当按钮按下时,它将把ADC输入引脚连接到电阻器链的某个点上。然后芯片中的程序可以对输入引脚检测到的电阻值进行转换,来确定到底是按下了哪一个键

电流依次流过一系列的电阻器,开始的那个电阻器为500 Ω。由于这不是标准的电阻值,因此你要么用其他电阻值串联组合起来得到,要么通过预设一个微调电位器来得到。然后,每个按键通过一个100 Ω 的电阻器与下一个按键隔开。最后,在链条的末端,一个600 Ω 的电阻器将最后一个按钮与电源的负端隔开。同样,这也不是一个标准的电阻值,你也许要使用一个微调电位器来获得。

将所有这些电阻加在一块,得到的是2 kΩ,这是PICAXE 芯片希望我们使用的范围。当你按下一个按钮时,你就分接到电阻链中去了。按钮9 在PICAXE 的ADC 引脚与地之间接入了600 Ω 的电阻值。按钮6 是700 Ω,按钮3 是800 Ω,如此等等(你也许喜欢其他的按钮布局方式,以便电阻值的变化显得更有逻辑性,这是你的权利。我选择的布局方式是最容易在小键盘上绘制出来的)。

现在回过头去看看第414页表中提供的ADC数值。这些就是当你按下不同的小键盘按钮时应该得到的数值——不过你不要指望它们能够绝对精确,因为当你的电阻器的阻值不是十分精确的时候,以及当你的供电不正好是5 V 的时候,这些值可能会有变化。例如,若说在电阻值为600 Ω 时PICAXE 芯片会精确地产生一个大小为77 的ADC 转换值,那将是不可靠的。但是如果说这个转换值将在71到83之间,却是比较有把握的。如下表所示,若我们为每个按键确定一个数值范围,那么我们将有相当好的机会正确地解释每个按钮。

假定你将小键盘上的共用引脚连接到PICAXE芯片的ADC逻辑引脚2上。那么你现在就可以使用程序编辑器写出类似以下的程序。

getkey:

readadc 2,b0

let b1=9

if b0 < 84 then finish

let b1=6

if b0 < 97 then finish

let b1=3

if b0 < 109 then finish

let b1=0

if b0 < 122 then finish

let b1=8

if b0 < 135 then finish

let b1=5

if b0 < 148 then finish

let b1=2

if b0 < 161 then finish

let b1=7

if b0 < 173 then finish

let b1=4

if b0 < 186 then finish

let b1=2

finish:

return

以上程序结尾的return是什么意思呢?我很快就将对其进行解释。我想先解释该程序的其余部分。

当数模转换器检查小键盘时,其产生的数值提供给b0保存。在数值保存到b0之后,程序必须搞清楚到底它同哪一个键相符。键的辨识符(0到9)则保存在另一个变量b1中。

程序开始时将数值9赋给变量b1。然后它检查b0<84是否成立(这意味着“如果b0小于84”)。如果是,程序就告诉PICAXE转到finish(这意味着“跳转到finish:标号”)。但是如果b0不小于84,那么在默认的情况下,PICAXE将继续执行下一行,它将第二次猜测到底按下的是哪个键。它会将数字6赋给b1。现在出现了另一个if-then测试,如此等等。给b1重新赋值的过程只有在b0的值大于表中的某个数值时才会停止。

如果你熟悉其他形式的BASIC语言,可能会觉得以上的程序有点繁琐。你可能会问,我们为什么不能使用一条下面这样的语句:

if b0 > 70 and b0 < 84 then b1=9

其答案在于PICAXE的BASIC语言还没有高级到可以允许这种格式。一个if-then语句必然导致一个往程序其他位置的跳转。这是唯一允许的出口。

如果你以前未曾有过任何的编程经验,这个程序对于你来讲也仍然有点繁琐,甚至还有点费解。这是可以理解的,因为你正在接受的是一个支离破碎的软件设计课程而没有任何正式的准备。然而PICAXE程序编辑器可以为你提供莫大的帮助,因为它具有仿真功能。不过在可以使用仿真功能之前,你必须在我刚刚提供的程序的前面输入一个控制程序。图5-148所示的屏幕截屏图显示了整个程序的样子。

图5-148 这个屏幕截图显示了一个完整的程序列表,该程序与组合锁结合,来读取三个按键序列。如果序列正确,PICAXE将往其一个引脚发出一个高电平。如果序列不对,程序将循环回到开头为止

我为我们的组合锁选择了一个任意的组合7-4-1。当使用这些数字组合时,程序的main段如下。

main:

low 1

gosub getkey

if b1<>7 then main

gosub getkey

if b1<>4 then main

gosub getkey

if b1<>1 then main

high 1

end

需要解释的是,符号对<>表示“不等于”。因此程序的第四行意味着:“如果b1不等于7”。

如果用户正在输入正确的组合,那么b1的值应为7。如果不是7,就说明用户输入了错误的数值,if-then语句就会将PICAXE送回到程序的开头。事实上,任何时候只要用户输入的数字不是正确的顺序7-4-1,程序就会将PICAXE送回到程序的开头。这正是这个实验的纯硬件版本的电路在搭建时所遵循的方法。

但是,gosub 是什么意思呢?它意味着“go to a subroutine”(进入一个子程序)。子程序是任何一个序列的程序语句,应以指令return结束。所以gosub getkey 就是告诉PICAXE 对程序当前的位置进行标记,并跳到名为getkey:的代码段去执行,直到它发现return语句为止,该语句会使PICAXE返回到它所来的地方。

PICAXE会按以上的方式连续运行,直到它遇到end。我必须加入end,否则PICAXE将连续执行程序,并掉进子程序中。end将停止PICAXE的运行。图5-148给出了程序完整列表的屏幕快照。

那么是不是这样就完整了呢?是的,这已经完整了。如果你严格按照我提供的样子将代码输入到程序编辑器中,那么你应该可以在仿真模式下运行该程序,并且在仿真窗口中,点击逻辑引脚A2旁边朝右的箭头来逐步增大其数值。每次在getkey:子程序中通过一个数值时,你应该可以看到变量b1的显示数值发生改变。

这正是运行组合锁的功能时你真正需要的一切。当PICAXE芯片运行这个程序时,它等待正确的组合。如果它接收到了正确的组合,就会从逻辑引脚1输出一个高电平;否则的话,逻辑引脚1将保持低电平。

唯一需要增加的一样东西就是一个晶体管或者一个CMOS门,用在逻辑引脚1和继电器之间来给计算机开锁,因为PICAXE本身无法提供足够的电流来驱动继电器。

将这个程序放在一个控制器芯片中不仅简化了电路,还提供了另外一个优点:你可以通过重写程序并往芯片下载新的版本来简单地改变按键组合。

基础知识

MCU的局限性

PICAXE芯片确实也有一些缺点。光是它对电压的严格要求就使得你无法像使用555定时器那样自由地使用它。

此外,我只需将一片555定时器插在面包板上,并添加几个电阻器和电容器,就立即可以得到结果,而PICAXE则要求我添加一个下载插座,并将其连接到计算机上,在程序编辑器中写好程序,再下载程序。

有些人不喜欢写程序,或者难以适应计算机编程所要求的苛刻的左脑思维方式。他们也许喜欢组装硬件这样的手艺。

另外一些人则正好相反。这种情况当然跟个人的喜好有关,但是有一个毫无疑问的事实是,计算机程序中往往包含错误,它们也许需要几周甚至数月以后才能自己暴露出来。就拿PICAXE来讲,如果你给一个变量赋予一个超过其类型上限的数值,PICAXE就保护不了你。假设b1=200,b2=60,而你的程序告诉PICAXE:

let b3=b1 + b2

其结果应该是260,但是单字节变量只能数到255。因此会出现什么情况呢?你将发现b3得到的值为4,但却不会给出任何的警告或解释。这就是所谓的“溢出错误”,它是很难预测的,因为它发生在运行的时候,是外部因素在起着控制作用。代码看起来很完美,程序编辑器没有发现任何的语法错误,仿真结果也很正常。但是在现实的世界里,数天甚至数月以后,出乎意料的一组环境因素导致一个输入引起溢出,而由于代码位于出错的芯片的内部,你也许会很难发现问题到底出现在哪里。

软件有软件的问题,硬件有硬件的优点。

基础知识

未及探索的领地

如果你花时间亲手完成了本书的大部分实验项目,那么你就已经对电子学的大多数基础有了十分快速的入门。

在这一路上你还遗落了什么没有呢?下面是一些十分值得你去探索的主题。如果对它们感兴趣的话,你自然应该在网上搜索一下这些主题。

我在本书中使用了非正式的、在实验中发现学问的方法,其特点是在理论方面着力较少。我绕过了大多数的数学知识,而在关于本书主题的任何一个更为严格的课程里,这些数学知识都是需要掌握的。如果你拥有很好的数学能力,你可以利用它来对电路工作的方式方法获得更加深入的认识。

我对计算机构架的介绍也不多。我没有深入地介绍二进制码,你也没有搭建半加器电路,这是从最基础的层面学习计算机功能的一个很好的方法。也许你应该考虑自己组装一台。

我避免了过多深入到交流电的迷人而神秘的性质中去。因为这里面也要牵涉一些数学知识,不过就交流电本身来讲,只有高频下的电流行为才是十分有趣的主题。

由于前面已经陈述的理由,我避免使用表面安装元件——不过你只需花费相对较少的投资,就可以自己进入这个领域(如果你喜欢制作特别微小的设备的话)。这也许是业余电子爱好者将来的发展方向,因此如果你坚持的话,你最终也许会进入到表面安装的世界。

电子管(真空管)没有提及,因为就目前来讲,它们的主要价值在于历史意义。关于电子管有一些特别而美丽的东西,尤其是在你可以将它们封装在一个奇特的细木家具里的时候。在一个能工巧匠的手里,电子管放大器和收音机可以变成艺术品

我也没有教你如何蚀刻自己的印制电路板。这个任务只对某些人有吸引力,在蚀刻之前,你需要制作出十分整洁的图纸,或者使用计算机软件来完成制图任务。如果碰巧有这方面的条件,你也许希望蚀刻自己的板子。这将是使你自己的设备进行大批量生产的第一步。

本书完全没有覆盖静电学的内容。高电压火花在日常生活中并没太多的应用,但它们却会引起一些安全问题——它们给人们的印象极其深刻,你也很容易得到必要的信息来制作高电压设备。也许你应该试一试。

其他控制器

如果你需要某样更加强大的东西,那么BASIC Stamp 家族的芯片将是PICAXE 芯片之后下一个合乎逻辑、应该学习的内容。BASIC Stamp之所以这样称呼,是因为它最初看起来像一枚邮票。BASIC Stamp 芯片具有较大的命令词汇和较宽范围的辅助设备(包括有图形能力的显示器、专用的小键盘)。BASIC Stamp 如图5-149 所示。

图5-149 BASIC Stamp 控制器由一些表面安装的元件安装在一个引脚间隔为1/10 in 的平台上,可以插在面包板上或者模型电路板上。该控制器使用一个跟PICAXE的编程语言十分相似的BASIC 版本的编程语言,但是它拥有更多的扩展。BASIC Stamp 拥有大量的外围设备可供选择,包括许多的字母数字点阵显示器

从底部可以发现,跟BASIC Stamp 相关的所有东西都要比PICAXE世界中的相应东西昂贵一点儿,其下载过程也不像PICAXE那么简单。

在MCU的世界里,最新的发展是Arduino,它是一种既成熟又强大的芯片。它需要用C语言来进行编程。这种语言有点儿难于理解,它与PICAXE 以及BASIC Stamp 中使用的语法只有十分有限的相似性。另一方面,由于C语言占据了计算世界的大部分,因此学习这种语言也许不是什么坏事,何况Arduino还提供了一些确实令人惊奇的功能。由于它是如此普及,因此有很多软件工具、文档、用户论坛以及许多的业余爱好者可以帮助你。另外有两本Make系列的图书,书名我以前已经提到过了,分别是Getting Started with Arduino 以及Making Things Talk,它们对Arduino提供了很好的入门介绍。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈