微控制器
微控制器是将微型计算机的主要部分集成在一个芯片上的单芯片微型计算机。微控制器诞生于20世纪70年代中期,经过20多年的发展,其成本越来越低,而性能越来越强大,这使其应用已经无处不在,遍及各个领域。例如电机控制、条码阅读器/扫描器、消费类电子、游戏设备、电话、HVAC、楼宇安全与门禁控制、工业控制与自动化和白色家电(洗衣机、微波炉)等。
微控制器(Microcontroller Unit,即MCU)可从不同方面进行分类:根据数据总线宽度可分为8位、16位和32位机;根据存储器结构可分为Harvard结构和Von Neumann结构;根据内嵌程序存储器的类别可分为OTP、掩膜、EPROM/EEPROM和闪存Flash;根据指令结构又可分为CISC(Complex Instruction Set Computer)和RISC(Reduced Instruction Set Computer)微控制器。
微控制器工作原理
今天,在大量形形色色的产品中,都可以看到微控制器的影子。如果你的微波炉有发光二极管或是液晶显示屏和操作按键,那么它就装有微控制器。现在所有的汽车都至少装有一个微控制器,多的可达六到七个: 发动机、防抱死刹车系统和定速巡航控制都离不开微控制器的控制。任何配有遥控装置的设备几乎都装有微控制器: 电视机、录像机和高端的立体声系统都属于这一类。 精密的单反相机、数码相机、手机、便携摄像机、电话应答机、激光打印机、带来电显示和号码存储等功能的电话、寻呼机、功能全面的电冰箱、洗碗机、洗衣机以及带有显示屏和操作键盘的干衣机……你应该有所了解了。总的来说,任何需要与用户进行交互的产品或设备都内置有微控制器。
在本文中,我们将探讨微控制器,帮助你了解它们的本质和工作原理。之后我们将进一步介绍如何能够亲自动手使用微控制器。提前透露一下,我们将制作一个带有微控制器的数字时钟!此外,我们还将制作一支数字温度计。 在整个过程中,你将学到大量关于微控制器如何应用于商业产品的知识。
背景知识
如果你对数字逻辑、门电路和线路连接不熟悉,那么请先阅读以下内容:
位和字节
布尔逻辑的应用
电子门工作原理
什么是微处理器?
一个微处理器就是一个计算机。所有的计算机——无论我们所说的个人台式计算机或是一台大型计算机或是一个微控制器——都有很多共同点:
所有的计算机都有一个用来执行程序的CPU(中央处理单元)。如果你正坐在一台台式计算机前阅读这篇文章,这台计算机的CPU现在正在执行一个程序,这个程序就是用于显示这个网页的Web浏览器。
CPU从某个设备中加载程序。在你的台式计算机上,浏览器程序是从硬盘中载入的。
计算机具有一些用来存储“变量”的RAM(随机存取存储器)。
此外,计算机还有一些输入和输出的设备,这样它才能和用户交换信息。在你的台式计算机上,键盘和鼠标是输入设备,显示器和打印机是输出设备。 硬盘则是一个输入输出设备——它既可以输入又可以输出。
你正在使用的台式机是一种“通用计算机”,它可以运行数以千计的各类程序。而微控制器则是用作特殊用途的“专用计算机”。它专注于做一件事。 微控制器还有许多共同的特点。如果一个计算机具备了以下大部分的特征,那么你就可以称之为“微控制器”:
微控制器都“嵌入”在其他装置(通常是一个消费类产品)内部来控制该产品的功能和操作。 因此,微控制器又被称为“嵌入式控制器”。
微控制器运行一个特定的程序来完成一项专门的工作。该程序存储在ROM(只读存储器)中,一般不会被修改。
微控制器通常是低能耗的装置。 台式计算机的电源插头几乎始终插在墙壁插座中,其功率约为50瓦。电池供电的微控制器的功率大概为0.05瓦。
微控制器有一个专用输入设备,通常(但并不总是)还有一个用作输出的发光二极管或液晶显示屏。 微控制器也从它所控制的装置获取输入信号,并通过向设备中的不同部分发送信号来控制该设备。
例如,电视机中的微控制器从遥控器得到输入信号,然后在屏幕上显示出来。微控制器会控制频道选择器、扬声器和一些如色彩、亮度等显像管的电子调节。 汽车中的发动机控制器从氧气和爆震等传感器中得到输入信号,对燃料混合以及火花塞定时等进行控制。微波炉控制器从操作键盘获得输入信号,在液晶显示屏上显示输出,并控制负责微波发生器开关的继电器。
微控制器通常具有小巧、低成本的特点。 对各个元件的选择都秉持使体积最小化、使成本最低化的原则。
微控制器通常都很耐用,但也并不总是这样。
例如,控制轿车发动机的微控制器必须能够在一般计算机无法承受的温度极限下工作。美国阿拉斯加的汽车的微控制器就需要工作在零下34摄氏度的寒冷天气里,而同样的控制器在美国内华达州则需要工作在零上49摄氏度的炎热环境中。再加上发动机运行发出的热量,发动机箱的温度可高达零上65-80摄氏度。
而录像机内部使用的嵌入式微控制器则没有这么苛刻的要求。
实际上,用作微控制器的处理器多种多样。 例如,数字手机工作原理一文中的移动电话就包含一个Z-80处理器。Z-80处理器是一个8位微处理器,它诞生于二十世纪七十年代,最初用于当时的家用计算机中。GPS接收机工作原理中的Garmin全球定位系统,包含一个低功耗版的Intel 80386处理器,据说是这样。Intel 80386处理器最初是专为台式计算机设计的。
在许多产品中,例如微波炉,对于微控制器性能的要求很低,价格是主要的考虑因素。 在这样的情况下,制造商开始设计专用的微控制器芯片——一种专为成本低、体积小且功耗低设计的嵌入式中央处理器。Motorola 6811和Intel 8051都是这种芯片的成功典范。另外还有Microchip公司生产的名为“PIC 微控制器”的系列控制器,也非常受欢迎。从今天的标准来看,这些中央处理器简易得令人难以置信;但是大批量购买的价格非常低廉,而且往往只需一片就可以满足产品设计者的需要。
一个典型的低端微控制器芯片中约有1000字节的只读存储器和20字节的随机存取存储器,有8个输入输出引脚。大批量生产这种芯片,单位成本不过几美分。 当然,你也不能指望在这种芯片上运行像Microsoft Word这样的程序——因为 Microsoft Word需要约30兆字节的随机存取存储空间和每秒可执行几百万条指令的处理器。不过控制一台微波炉可不需要Microsoft Word这么复杂的程序。你要使用微控制器完成的是一个具体的任务,而且低成本、低功耗运行才是最重要的。
微控制器的使用
在电子门工作原理一文中,你了解到了7400系列TTL(晶体管逻辑电路)元件,在哪里购买以及如何装配它们。 你会发现要实现一个简单的装置通常需要很多门电路。 例如,在数字时钟部分,我们所设计的时钟可能需要15到20片芯片。微控制器的主要优势之一就在于,软件(你编写并在控制器上执行的那个小程序)可以取代许多门电路。 因此,本文中我们将用微控制器制作一台数字时钟。 这将是一台非常昂贵的数字时钟(近200美元!),但是在这一过程中,你将积累下今后几年使用微控制器需要的各种知识。 即使并不实际动手制作这样一个数字时钟,阅读相关内容就能让你获益良多。
这里用到的一款微控制器是专为方便日常生活设计的。 它是Parallax公司开发的名为“BASIC Stamp”的微控制器。 BASIC Stamp是一个兼容BASIC程序设计语言的PIC微控制器。使用BASIC程序设计语言使得微控制器的软件编写变得十分容易。 微控制器配套提供了一个9伏电池供电的母板,通过和计算机的一个端口相连对其进行编程。没有一个制造商会在实际的产品中使用BASIC Stamp——因为 Stamp价格高且速度慢(相对而言)。 但是,为进行实验建模或一次性演示产品使用Stamp非常普遍,因为它的设置和使用是令人难以置信的轻松。
该微控制器之所以被称为“Stamps”是因为它只有一张邮票大小。
Parallax公司生产了两种版本的BASIC Stamp:BS-1与BS-2。下面是两种版本的对比:
比较项目BS-1BS-2
随机存取存储器14字节26字节
电可擦除只读存储器256字节2000字节
最大程序长度约75条指令约600条指令
执行速度每秒2,000行每秒4,000行
输入输出引脚816
本文中用到的是一个名为“BASIC Stamp修正版D”的微控制器(如下图所示)。
BASIC Stamp修正版D是一个BS-1芯片,安装在一块9伏电池供电的母板上。配套组件包括:电压调节器、程序连接电缆、输入输出引脚插针以及一小块建模区域。你也可以单独购买一块BS-1芯片,在面包板上和其他元件相连。修正版D只不过更加方便一些。
从上表可以看出,你不可能用BASIC Stamp做出非常奇特的东西来。BS-1的75行(256字节的电可擦除只读存储器可以存放约75行BASIC语言程序)程序的限制有相当的局限性。然而,你可以做些精巧的东西,Stamp非常小巧并用电池供电,这就意味着它几乎可以适用于任何地方。
BASIC Stamp程序设计
您需要使用BASIC程序设计语言对BASIC Stamp进行编程。如果对BASIC语言已经有一些了解,您会发现Stamp中的BASIC语言非常易懂,只是略显零散。如果您不懂BASIC语言,但是您会使用如C、Pascal或是Java等程序设计语言,那么掌握BASIC对您来说是易如反掌。如果您没有任何编程经验,建议您先阅读一下学习编程。下面是Stamp BASIC编程所用到指令的简要列表。
标准BASIC语言指令:
for.。.next : 标准循环语句
gosub : 跳转到子程序
goto : 跳转到程序标记处(例如 -“label:”)
if.。.then : 标准的“if/then”(如果/那么)判断
let : 赋值(可选)
return : 从子程序返回
end : 结束程序,进入休眠状态
与输入输出引脚相关的指令:
button : 读取输入引脚上的键值,防反跳并自动重复
high : 将输入输出引脚设置为高电平
input : 将输入输出引脚的方向设置为输入
low : 将一个输入输出引脚设置为低电平
output : 将输入输出引脚的方向设置为输出
pot : 读取输入输出引脚上的电位计值
pulsin : 读取输入引脚上脉冲的宽度
pulsout : 通过一个输出引脚发出指定宽度的脉冲
pwm : 在输出引脚上执行脉冲宽度调制
reverse : 反转引脚输入输出方向
serin : 读取输入引脚的串行数据
serout : 在输出引脚写入串行数据
sound : 向输出引脚发送特定频率的声音
toggle : 切换输出引脚上的位
BASIC Stamp的特有指令:
branch : 读取转移表
debug : 向台式计算机上的控制台发送调试字符串
eeprom : 将程序下载到EEPROM
lookdown : 返回列表中某个值的指针
lookup : 使用索引进行数组查找
nap : 休眠一段时间
pause : 延迟指定的时间
random : 选取一个随机数
read : 从EEPROM中读取值
sleep : 断电指定的时间长度
write : 向EEPROM写入数据
运算:
+ : 加
- : 减
* : 乘(低字)
** : 乘(高字)
/ : 除
// : 取余数
max : 返回两个值中的最大值
min : 返回两个量的最小值
and : 与
| : 或
^ : 异或
and/ : 与非
|/ : 或非
^/ : 异或非
if 语句逻辑:
=
《》
《
《=
》
》=
AND
OR
变量
BS-1中的所有变量都具有预定义的名称(您可以用自己的名称代替这些名称)。 请记住,只有14个字节的RAM(随机存取存储器)可用,所以变量名称应简洁。 以下是标准的名称:
w0, w1, w2.。.w6 : 16位字变量
b0, b1, b2.。.b13 : 8位字节变量
bit0, bit1, bit2.。.bit15 : 1位位变量
由于只有14个字节的内存可用,所以w0和b0/b1在RAM中是相同的位置,w1和b2/b3是相同的位置,以此类推。 此外,bit0到bit15位于w0中(因而b0/b1也是如此)。
输入输出引脚
您可以看到,BS-1中有14条指令与I/O引脚相关。之所以要强调这一点是因为输入输出引脚是BASIC Stamp与外界交流的唯一途径。BS-1有8根输入输出引脚(编号0到7),BS-2有16根输入输出引脚(编号0到15)。
这些输入输出引脚都是双向的,就是说既可以从引脚上读输入值也可以通过引脚输出。要向引脚发送值,最简便的方法是使用HIGH或LOW指令。 使用语句high 3可以在引脚3上发出一个1(+5伏),使用LOW则发出一个0(接地)。这里的3号引脚是任意选取的——您可以对0到7号任意引脚输出电平信号。
关于输入输出引脚有许多有趣的指令。 例如,如果您按照POT指令要求在电位计(可变电阻器)两端并联一个电容器,POT指令就可以读出电位计的设置。 PWM指令可以发出脉冲宽度的调制信号。借助类似这样的指令,为Stamp添加控制和驱动功能要轻松得多。有关语言的详细信息,请参见documentation。此外,诸如斯科特·爱德华所著Programming and Customizing the BASIC Stamp Computer(对BASIC Stamp计算机进行编程和自定义)这样包含大量示例项目的书,也是极有裨益的。
BASIC Stamp的实际操作
如果您想实际操作一下BASIC Stamp,上手是十分容易的。您所需要的就是一台台式计算机,和一个BASIC Stamp入门工具包。入门工具包包括Stamp微控制器、编程电缆以及一个运行于台式计算机的应用程序,该应用程序将BASIC程序下载到Stamp中。
入门工具包可以从Parallax公司这样的制造商那里获得,也可以从Jameco公司这样的供应商那里获得。如果读过有关门电路和数字时钟的文章,您会对Jameco公司耳熟能详。从Parallax公司您可以订购“BASIC Stamp D入门工具包”(部件号 27202),从Jameco公司您可以订购部件号为140089的入门工具包。您将收到 Stamp(如下图)、编程电缆、软件和操作说明书。两家公司的定价均为79美元。有时,Parallax公司会推出特别版本的入门工具包,称为“必备基础、一网打尽”,这个特别版本除上述内容外,还包括斯科特·爱德华编写的Programming and Customizing the BASIC Stamp Computer(对BASIC Stamp计算机进行编程和自定义)一书。
Stamp的连接十分容易。您只需将其连接到计算机的并行端口, 然后运行DOS 应用程序来编辑您的BASIC程序,并将该程序下载到Stamp中就可以了。以下是一个典型的编辑器(选自斯科特·爱德华的书中)的截图:
要在此编辑器中运行程序,请按ALT+R组合键。编辑器应用程序将检查BASIC程序,然后通过电缆将程序发送到Stamp上的EEPROM(电可擦除只读存储器)。 随后,Stamp会执行该程序。在这个例子中,程序在I/O引脚3上生成方波。如果引脚3上连接有逻辑探针或LED(发光二极管),您将看到,LED每秒钟亮灭两次,这是由于它根据PAUSE指令,每隔250毫秒改变一次状态。了解LED的详细信息,请参阅有关门电路的文章。一节9伏的干电池可以让这个程序运行几个星期。缩短LED处于打开状态的时间(例如亮50毫秒,灭450毫秒),或者用NAP r指令代替PAUSE指令,都可以节约电能。
制作数字时钟
花79美元让一只LED亮起来似乎有些奢侈。你肯定更想用BASIC Stamp制作出更实用的东西。花上100多美元,你就可以制作一台精致的数字时钟!这好像也过于奢侈,但以后做其他各种装置时,你会发现这些元件都可以重复利用。
我们将使用BASIC Stamp的输入输出引脚来显示数字。在数字时钟部分,我们了解了如何连接7447芯片的7段显示发光二极管。7447芯片可以和BASIC Stamp协同工作。将BASIC Stamp的四根输入输出引脚直接与7447相连,就可以很容易的显示0到9的数字。BS-1版本的Stamp有8根输入输出引脚,这样可以直接驱动两片7447芯片。
就一个时钟而言,需要至少显示4个数字。为了用8个输入输出引脚驱动4片7447,我们需要更有创造性一些。下图给出了一种解决办法:
上图中,8根输入输出引脚从左边引入。该方法用4个输入输出引脚驱动全部的4片7447。剩余的4个引脚,用来按顺序激活4片7447(芯片上的“E”表示“Enable 使能”——7447芯片上的5号引脚)。要让这个系统工作,Stamp的程序首先通过4根数据线发出第一个数字,并且把第一片7447的E引脚与第一根控制线置位,从而把7447激活。然后发出第二个数字,激活第二片7447,就这样按顺序不停的反复激活四片7447。 实际上,稍微改动一下连线,一片7447就可以实现这些功能。使用74154多路转换芯片以及一些驱动,就可以用这种方法驱动多达16个数字。
这就是实际中控制发光二极管显示屏的标准方法。如果你有一个老式的发光二极管显示的计算器,边晃动边观察显示屏。你会发现同一时刻只有一个数字被点亮。这种技术被称为多路复用显示。
这种技术在时钟和计算器上有很好的应用,但是存在两个重要问题:
发光二极管耗电量大。
7 段显示发光二极管只能显示数字。
另一方法是使用液晶显示屏。 液晶显示屏应用广泛,而且与Stamp连接方便。 例如,下图所示的两行字母数字式的液晶显示屏在Jameco公司(部件号150990)和Parallax公司(部件号27910)都可以买到。 此处展示的是一个典型的液晶显示屏,将液晶显示屏插在面包板上,便于和其他芯片连接:
这类液晶显示屏的优点:
一根引脚就可以驱动显示。 显示屏包含允许Stamp以串行方式与自己通信的逻辑电路,因此只需一根引脚。 此外,BASIC Stamp中的SEROUT命令可以十分容易的实现串口通信,控制显示屏十分简单。
液晶显示屏可以显示字母数字文本,包括: 字母和数字,甚至可以是自定义字符。
液晶显示屏耗电量极低——只需3毫安的电流。
唯一美中不足就是,这样的一个液晶显示屏要花费59美元。显然,没有人会在烤箱上装这样的显示屏。 而设计烤箱时,一般会先用这样的显示屏作样品试验,而后用自己设计的芯片和软件驱动便宜的显示屏,用于最终的产品。
驱动这样的显示屏,你只需提供5伏以上的电源和地线(Stamp的9伏电池满足这两个条件),然后把Stamp的一个输入输出引脚与显示输入线连接。 要将Stamp的输入输出引脚连接到像液晶显示屏这样的设备,我能找到的最轻松的方法,是使用Jameco公司生产的连线工具(部件号34577)和30-gauge规格的连接线(部件号22541)。这样不需要焊接,并且连接结实、可靠。
下面的程序中,BASIC Stamp完成了一个时钟的功能,通过液晶显示屏输出时间(假定液晶显示屏接在Stamp输入输出0号引脚上):
pause 1000 ‘等待液晶显示屏启动serout 0, n2400, (254,1) ’清除显示serout 0, n2400, (“time:”) 显示屏上 显示“time:” ‘在加载程序之前进行预设b0 = 0 ’秒数b1 = 27 ‘分钟数b2 = 6 ’小时数 again: b0 = b0 + 1 ‘秒数加1if b0 《 60 then minutes b0 = 0 ’如果秒数等于60 b1 = b1 + 1 ‘则分钟数加1minutes: if b1 《 60 then hours b1 = 0 ’如果分钟数等于 60 b2 = b2 + 1 ‘则小时数加1hours: if b2 《 13 then show b2 = 1 ’如果小时数等于13,则重置为1 show: serout 0, n2400, (254, 135) ‘在显示屏上定位光标, ’然后显示时间serout 0, n2400, (#b2, “:”, #b1, “:”, #b0, “ ”) pause 950 ‘暂停950毫秒goto again ’重复
这个程序中,通过SEROUT命令向液晶显示屏发送数据。 序列 (254, 1) 用于清空液晶显示屏,其中254是转义字符,1是清空屏幕的指令。 序列(254, 135)用于定位光标。其他两个SEROUT指令只是将文本字符串发送到显示屏。
这种方法将得到一个比较精确的时钟。通过调整PAUSE语句,可以将每天的误差控制在数秒之内。显然,真正的时钟需要一到两个按钮来校正时间—— 在这个程序中,你需要在向 Stamp 载入程序前,预先设置时间。
此方法简单、有效,但并不十分准确。如果你需要提高计时精度,在Stamp上连接实时时钟芯片是一种好的选择。这样,每过一秒左右就会从芯片读取时间并显示出来。实时时钟芯片中使用石英晶体获得极佳的精确度。 时钟芯片通常还包含日期信息,并可以自动进行闰年修正。
要让实时时钟和Stamp实现对接,一个简单的办法是使用称为Pocket Watch B的元件。
Pocket Watch B模块
Pocket Watch B在Jameco公司(部件号145630)和Parallax公司(部件号 27962)都可以买到。该元件只有一枚硬币大小,包括时钟芯片、石英晶体和与输入输出引脚通信用的串行接口。它的价格在30美元左右,也不适用于烤箱,但却非常适合在搭建样品模型时使用。
制作数字温度计
现在您对Stamp和液晶显示屏有了初步的了解,我们再加一个元件就可以制作一支数字温度计。 制作数字温度计需要用到芯片DS1620。 该芯片包含:
一个温度传感器
一个用于保存设置的小型电可擦除只读存储器
DS1620有两种工作模式: 一种作为独立的恒温芯片;另一种则是与计算机相连作温度计使用。 电可擦除只读存储器用来保存当前的工作模式和恒温模式设定值。
DS1620与Stamp的连接十分简单。 该芯片有8根引脚。从Stamp引出的5伏以上电源接入DS1620的8号引脚; 电源地线接DS1620的4号引脚。3根Stamp输入输出引脚驱动DS1620的以下三根引脚:
1 号引脚为数据线。 通过该引脚读写数据。
2 号引脚为时钟引脚。 为移位寄存器移入移出数据提供时钟。
3 号引脚为复位、片选信号。 该引脚置高电平,选通芯片。
例程代码中,假设:
数据线连接Stamp的2号输入输出引脚。
时钟引脚连接Stamp的1号输入输出引脚。
复位、片选信号由Stamp的0号输入输出引脚提供。
完整连线如下图所示:
DS1620可以从Jameco公司(部件号146456)或Parallax公司(部件号27917)的“应用工具包”中获得,这一工具包包括芯片、电容器、一些有用的文档和示例代码。 或者,你也可以从Jameco公司单独购买该芯片(部件号114382)。如果你是第一次使用此芯片,还是建议你购买“应用工具包”,里面的文档会非常有用。
你可以将DS1620芯片安装在Stamp的母板的实验建模区,也可以装在单独的面包板上。安装完毕,将液晶显示屏与Stamp的3号输入输出引脚相连,载入并运行下面的程序:
symbol RST = 0 ‘ 定义复位、选通1620芯片引脚编号symbol CLK = 1 ’ 定义连接1620芯片移位寄存器的时钟引脚编号symbol DQ = 2 ‘ 定义连接1620芯片数据线的引脚编号symbol DQ_PIN = pin2 ’ 定义2号引脚为数据线symbol LCD = 3 ‘ 定义液晶显示屏数据线引脚编号 begin: low RST ’ 不用时,不选通1620芯片high CLK ‘ 1620芯片时钟引脚默认为高电平pause 1000 ’ 等待温度计与显示屏的引导启动 setup: high RST ‘ 选通1620芯片b0 = $0C ’ $0c 是1620的命令字节 ‘ 意思是“写入设定”gosub shift_out ’ 发送至1620芯片b0 = %10 ‘ %10 是1620的命令字节 ’ 设定温度计工作模式gosub shift_out ‘ 发送至1620芯片low RST ’ 不选通1620芯片pause 50 ‘ 延时50毫秒,等待电可擦除只读存储器 start_convert: b0 = $EE ’ $EE 是1620的命令字节 ‘ 启动模数转换high RST ’ 选通1620芯片gosub shift_out ‘ 发送至1620芯片low RST ’ 不选通1620芯片 ‘ 以下为主循环程序’ -- 每秒读取并显示温度main_loop: high RST ‘ 选通1620芯片 b0 = $AA ’ $AA 为1620命令字节 ‘ 温度信号采样 gosub shift_out ’ 发送至1620芯片 gosub shift_in ‘ 从1620读取 ’ 温度数值 low RST ‘ 不选通DS1620。 gosub display ’ 用摄氏度单位显示温度 pause 1000 ‘ 等待一秒goto main_loop ’ shift_out 子程序将b0字节中的内容‘ 发送至 1620 芯片shift_out: output DQ ’ 设置数据线为 ‘ 输出模式for b2 = 1 to 8 low CLK ’ 准备1620发送数据所需的时钟 DQ_PIN = bit0 ‘ 发送数据位 high CLK ’ 数据位送至1620 b0 = b0/2 ‘ 将所有位 ’ 朝bit0右移next return ‘ shift_in 子例程从 1620 中’ 得到 9 位的温度读数shift_in: input DQ ‘ 设置数据线设置为 ’ 输入模式w0 = 0 ‘ 变量w0清零for b5 = 1 to 9 w0 = w0/2 ’ 输入数据右移。 low CLK ‘ 向1620请求下一位 bit8 = DQ_PIN ’ 读取位 high CLK ‘ 时钟信号引脚切换为高电平next return ’ 以摄氏度单位显示温度display: if bit8 = 0 then pos ‘ 如果bit8=1 ’ 温度为负值 b0 = b0 and/ b0 ‘ 通过对自身的与非操作 ’ 对b0取反 b0 = b0 + 1 pos: serout LCD, n2400, (254, 1) ‘ 清除液晶显示屏serout LCD, n2400, (“Temp = ”) ’ 在显示屏上 ‘ 显示“Temp=”bit9 = bit0 ’ 保存0.5度b0 = b0 / 2 ‘ 换算成度数if bit8 = 1 then neg ’ 判断温度是否为负值 serout LCD, n2400, (#b0) ‘ 显示正温度 goto half neg: serout LCD, n2400, (“-”, #b0)’ 显示负温度half: if bit9 = 0 then even serout LCD, n2400, (“.5 C”) ‘ 显示 .5度 goto done even: serout LCD, n2400, (“.0 C”) ’ 显示 .0度done: return
运行这个程序,你会发现这一温度计是以0.5度的精度,以摄氏度为单位显示温度。
DS1620芯片测量温度的精度为0.5摄氏度。这个芯片用9位2-补码二进制数表示华氏-110至250度(摄氏-55至125度)范围内的温度。把接收到的数值除以2就是实际温度的数值。2-补码是一种表示负值的便捷方法。下面列出了4位2-补码四位二进制数据所代表的数值:
0111 : 7 0110 : 6 0101 : 5 0100 : 4 0011 : 3 0010 : 2 0001 : 1 0000 : 0 1111 : -1 1110 : -2 1101 : -3 1100 : -4 1011 : -5 1010 : -6 1001 : -7 1000 : -8
通常用四位二进制数表示0到15的数值,而四位2-补码二进制数表示-8到7。最左边一位决定了数值的正负。如果数值为负,我们可以通过把其他各位取反加1的方法,得到其绝对值。
以下是上述数字温度计程序执行的操作:
使用symbol关键字设置若干常量,使程序更易于阅读(也更容易把芯片与其他不同的输入输出引脚相连)。
设定DS1620芯片的时钟和复位引脚信号为预期值。
通过向DS1620的电可擦除只读存储器写入命令字节,使其工作在“温度计模式”。你只需要进行一次这样的操作,严格地说你在运行过一次程序之后,就可以把这段代码删掉了(出于节省程序存储空间考虑),因为这种工作模式已经保存在电可擦除只读存储器中。
程序发送指令$EE(“$”表示十六进制数,$EE转换成十进制为238),启动温度计的模数转换。
之后,程序进入循环。 每秒向DS1620芯片发出指令获取目前温度信号,读取 DS1620返回的9位的数据,将其保存在变量w0中。Stamp通过切换时钟信号一次发送或接收一位数据信号,与DS1620通信。变量w0(16位)与b0/b1(8位)与 bit0/bit1/。。./bit15(1位)占有相同的存储空间,当我们从bit8开始插入从DS1620 获取的位数据,并将w0变量除以2时,实际上我们就是在将数据右移,以便把从 DS1620获取的9位温度信号保存在变量w0中。 温度保存在w0中之后,display子例程判断读数的正负,然后以摄氏度为单位,在液晶显示屏上正确显示读数。 摄氏度到华氏度的单位换算如下:
dF=dC*9/5+32
这样,我们就完成了一个非常昂贵的温度计的制作。 它有些什么用途呢? 这有一个好主意。 例如你在一家制药公司工作,需要在全国范围内运输药品,药品运输全程温度要保持恒定,否则药品会失效。 你可以用 Stamp 制作一台温度数据记录仪。 Jameco公司(部件号143811)和Parallax公司(部件号27960)都出售称为“RAM 封装模块”的元件。 它包含具备串行接口的低功耗8千字节(也可以选择32千字节)RAM芯片。 可以给你的Stamp配上该元件(或相似产品),编写代码,每分钟将读取的温度数值保存在随机存取存储器中。 然后,你可以将 Stamp随药品一起打包,在运输过程结束时取回Stamp。 RAM模块会包含整个运输过程的温度历史记录,通过记录你可以知道药品是否解冻过。
掌握微控制器的工作原理之后,你可以借助Stamp制作出大量类似这样的小巧实用的设备。
评论
查看更多