概述
环境监测通常需要小巧灵活的微控制器。如果在这类应用中使用个人电脑,对其计算能力和存储容量而言都是一种浪费,可采用一个微控制器与温、湿度传感器或其它环境监测传感器通信,读取并存储监测数据。为实现更高的灵活性,这些微控制器可连成网络,各自将监测数据上传到功能更*的系统中,对整体环境参数进行分析记录。
本篇应用笔记介绍如何使用低功耗微控制器MAXQ3210实现环境监测应用。增加一个通过一根1-Wire总线实现供电和通信的数字
温度传感器DS1822,我们可用zui少的元器件构建一个电池供电的非易失温度记录系统。
可以下载相关演示代码。代码采用MAXQ汇编语言编写,在MAX-IDE开发环境自带的标准宏汇编预处理器和汇编器中编译。该代码是为MAXQ3210评估板编写,因此还需要以下器件(图1)。
温度传感器:DS1822经济型1-Wire数字温度传感器(TO-92封装)
RS-232电平转换器:MAX233ACWP
图1.MAXQ32101-Wire温度记录仪演示电路所需的元器件
设计目标
演示代码要完成以下任务(图2):
通过1-Wire网络(位模拟方式)与温度传感器DS1822通信。
每分钟唤醒一次测量温度。
将温度数据存储在MAXQ3210内部的非易失EEPROM中。
上电后以9600bps的速率通过位模拟串口发送温度记录数据。
在发送前将温度数据转换成容易识别的ASCII格式(十进制华氏度)。
根据主机要求清空存储器(擦除在EEPROM中存储的温度数据)。
图2.温度记录应用的程序流程图
为何使用MAXQ3210
几乎所有的低功耗MAXQ微控制器都可以实现这一应用,但MAXQ3210更适合用于温度记录。
集成稳压器。MAXQ3210内部集成5V稳压器,可以直接由标准9V电池供电。MAXQ3210的5V稳压输出还可为其它设备供电(zui大电流50mA)。这一特性非常重要,这意味着如果其它器件也可采用5V供电,则不再需要另加单独的电源芯片。
低功耗。MAXQ3210仅需消耗很小的电流,即使以3.58MHz全速运行,典型值也仅为6mA。当降低频率或处理器停止工作进入休眠状态时,电池电流还可更低。MAXQ3210内部集成的8kHz环形振荡器驱动一个长周期的唤醒时钟,可在长达2分钟的可编程间隔后将处理器从休眠状态唤醒。
内部数据EEPROM。在掉电时需要保存温度记录数据,这些数据可能要采集几小时,几天,甚至是几周时间。MAXQ3210数据存储空间有64个字的EEPROM,可非常容易的实现这一要求。EEPROM中的每个16位字都可调用UtilityROM中的一个函数单独修改;EEPROM技术意味着在写数据之前从来都不需要擦除操作。如果需要更多EEPROM空间,可将数据写入任何未用的程序EEPROM空间,该写入过程调用UtilityROM中的另一个函数以类似方式逐字修改,无需重载整个应用程序。
5V端口引脚。与所有MAXQ微控制器一样,MAXQ3210的端口引脚可灵活的设为输入、输出、弱上拉和三态。MAXQ3210还可提供多种接口选择。由于微控制器的端口为5V电平,可以直连5V器件或通过上拉电阻连接低功耗器件(工作在三态/开漏模式)。由于这一应用所需端口很少,使用大的微控制器会浪费许多功能。
压电扬声器驱动器。尽管压电扬声器功能在这一应用中没有使用,但在许多类型的环境监测应用中都需要产生可听见的告警声。例如烟雾监测和一氧化碳监测。MAXQ3210可直接驱动压电扬声器,可用非常简单的软件实现这一功能。仅需1位控制位来打开或关闭压电扬声器。根据所选的扬声器不同,MAXQ3210输出的幅度可以达到100dB。
小封装:MAXQ3210提供小型的24引脚TSSOP封装。
驱动1-Wire网络
DallasSemiconductor/Maxim提供一系列使用1-Wire网络接口的传感器和其它器件。该接口的数据通信和供电仅需通过一根数据线再加一根地线,这意味着微控制器仅需一个端口即可与1-Wire传感器通信。
1-Wire网络工作于一主多从模式(多点网络)。时序非常灵活,允许从机以高达16kbps的速率与主机通信。每个1-Wire器件都有一个*的64位ROMID,允许1-Wire主机选择位于网络任何位置的一个从机进行通信。
1-Wire总线采用漏极开路模式工作,主机(或需要输出数据的从机)将数据线拉低到地表示数据0,将数据线释放为高表示数据1。这通常通过在数据线和VCC之间连一个分立电阻实现,但MAXQ3210的端口引脚支持弱上拉模式,只需将引脚切换到弱上拉模式,数据线即可浮高。因此MAXQ3210不需外接电阻。由于主机和从机仅需将数据线拉低,而从不将数据线主动拉高,因此数据线可以实现“线-或”功能,这可防止多个从机试图同时通过1-Wire总线发送数据时出现冲突。
为驱动1-Wire网络,MAXQ3210利用软件在一个引脚上实现以下类型的时隙。由于1-Wire所有时隙由主机启动,因此当MAXQ3210不与从机通信时不需要监测1-Wire线路。有关1-Wire时序的更多详细信息请参考DS1822的数据资料。
Reset时隙宽度大约为1ms。在时隙的前半部分,主机(MAXQ3210)将1-Wire总线拉低,然后主机将总线释放,使其浮高。总线上的所有1-Wire从机复位,并在该时隙的后半段将总线拉低。这一步产生一个presencepulse(在线脉冲),向主机表明有一个或多个1-Wire从机在线,并且准备好开始通信。
Write时隙大约长120μs,主机利用这一时隙向1-Wire从机发送0或1。两种写时隙都是以主机将总线拉低至少1微秒开始。如果发送1,主机随即释放1-Wire总线(使其浮高)。如果发送0,主机在该时隙剩余的时间内一直将总线拉低。
Read时隙大约长60μs,主机利用这一时隙读取从机发送的0或1。该时隙是以主机将总线拉低至少1微秒开始的。随后主机将总线释放,允许从机将总线拉低(表示0),或将总线释放使其浮空为高(表示1)。主机在时隙中部采样总线读取从机发送来的数据。
由于MAXQ3210每微秒约等于三个半指令周期(3.58MHz时钟频率下),软件可利用一个端口引脚(P1.6)方便的实现1-Wire协议。
#defineOWINM0[09h].6;PI1.6
#defineOWOUTM0[01h].6;PO1.6
#defineOWDIRM0[11h].6;PD1.6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:Reset1Wire
;;Description:Sendsastandardspeed1-WireresetpulseonP1.6
;;andchecksforapresencepulsereply.
;;Inputs:None
;;Outputs:C-Clearedonsuccess;setonerror(nopresence
;;pulsedetected)
;;Destroys:PSF,LC[0]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Reset1Wire:
moveOWDIR,#1;Outputmode
moveOWOUT,#0;Drivelow
moveLC[0],#RESET_LOW
djnzLC[0],$
moveOWOUT,#1;Snaphigh
moveLC[0],#SNAP
djnzLC[0],$
moveOWDIR,#0;Changetoweakpullupinput
moveLC[0],#RESET_PRESAMPLE
djnzLC[0],$
moveC,OWIN;Checkforpresencedetect
moveLC[0],#RESET_POSTSAMPLE
djnzLC[0],$
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:Write1Wire
;;Description:Writesastandardspeed1-WireoutputbyteonP1.6.
;;Inputs:GRL-Bytetowriteto1-Wire.
;;Outputs:None.
;;Destroys:PSF,AP,APC,A[0],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Write1Wire:
moveAPC,#080h;Standardmode,selectA[0]asAcc
moveAcc,GRL
moveOWDIR,#1;Outputdrivemode
moveLC[1],#8;8bitstowrite
Write1Wire_slot:
moveOWOUT,#0;Drivelowforstartofwriteslot
moveLC[0],#WRITE_PREBIT
djnzLC[0],$
rrc;Getthenextbit
jumpC,Write1Wire_one
Write1Wire_zero:
moveOWOUT,#0;Keepthelinelow(zerobit)
jumpWrite1Wire_next
Write1Wire_one:
moveOWOUT,#1
Write1Wire_next:
moveLC[0],#WRITE_POSTBIT
djnzLC[0],$;Finishthetimeslot
moveOWOUT,#1;Drivebackhigh(endofslot)
moveLC[0],#WRITE_RECOVERY
djnzLC[0],$;Recoverytimeperiod
djnzLC[1],Write1Wire_slot
ret
实现读时隙的功能与之类似。注意,在1-Wire总线上所有数据均为低有效位(LSB)先发。
利用MAXQ3210实现1-Wire时序时,另一点需要注意的是:尽管1-Wire总线上拉电阻的阻值与总线上的设备数有关,但通常在4k到5k之间。可是MAXQ3210端口引脚上的弱上拉电阻为50k到100k。为了防止1-Wire总线从低电平到高电平转换的时间过长,演示代码先将P1.6输出设为短暂的高电平,将总线强制拉高,然后变为正常的弱上拉模式。只要该过程不是在从机试图将总线拉低的时候进行,就不会出现问题。另外,还可以在总线上再加一个分立的上拉电阻,这样就可以正常的方式使端口输出低代表0,输出三态代表1。
注意:当构建的1-Wire网络传输距离较远或连接的从机数量较多时,还需要注意其他事项。更多信息请参考以下应用笔记。
AN148:1-Wire网络可靠设计指南
AN570:TechBrief1:1-WireNetDesignGuide
AN937:BookofiButtonStandards
用DS1822测量温度
尽管MAXQ3210可以使用上面的代码与大多数1-Wire从机器件通信,在本应用中我们将主要考虑与DS1822通信。DS1822是一个1-Wire从机器件,可实现9到12位的摄氏温度测量,测量结果可被1-Wire主机读取。与多数1-Wire从机一样,DS1822可以*由1-Wire总线供电,我们称之为寄生供电。
DS1822的测量范围可达-55°C至+125°C,适用于多数的室内外温度测量应用。温度分辨率在9位下为0.5°C,12位下0.0625°C。进行一次温度转换所需时间在低分辨率下约为94ms,在zui高分辨率下约为750ms。由于这是一个简单应用,我们选择9位分辨率,并忽略zui低位(0.5°C)。这样就可使整个8位带符号温度数据与MAXQ3210的8位累加器匹配。
所有的1-Wire从机器件都支持一个通用指令集,从而使得主机可以判断总线上的从机数目,读取ROMID,并且可以与某一个从机或一组从机进行通信。一旦某个1-Wire从机被激活,主机可以针对该从机类型向其发送特殊指令。其它所有未被激活的从机均处于等待状态,直到下一个复位脉冲出现,才开始再次监测1-Wire总线。
由于在我们的应用中总线上仅有一个1-Wire器件,我们可以使用zui简单的指令集访问从机器件,不需要读取从机的ROMID。当总线上有多个从机器件时,ROMID被用来区分不同的从机器件。我们的程序中也读取了一次DS1822的ROMID,但仅是为了演示。
我们将使用下面的1-Wire指令集,DS1822支持的其它指令请参考其数据资料。
ReadROM[33h]。这一指令假设1-Wire总线上只有一个从机器件。1-Wire从机收到该指令后将其8字节的ROMID发回1-Wire主机。这个ID包括48位序列号,8位CRC,8位家族码。家族码代表器件类型。DS1822的家族码为22h。收到ReadROM指令后,1-Wire从机被激活,并响应后续与该从机器件相关的指令。
SkipROM[CCh]。1-Wire总线上有一个或多个从机器件时都可以使用这一指令。这条指令激活总线上的所有从机,与从机的ROMID无关。当总线上只有一个从机时,可利用这条指令不读取从机ID而激活从机,使其接收后续相关指令。当总线上有多个从机时,如果使用这条指令,则必须保证后面的指令不会造成从机向主机发送数据。因为从机可能发送不同的数据而造成数据冲突。
WriteScratchpad[4Eh]。这是DS1822的指令,之前先用ReadROM或SkipROM指令激活器件。在该指令后1-Wire主机发送3字节的配置数据用来配置DS1822,包括温度转换的位分辨率。更多详情请参考DS1822的数据资料。
ReadScratchpad[BEh]。这也是DS1822的指令,该指令允许主机从DS1822读取zui多9字节数据。这些数据包括通过WriteScratchpad指令设置的配置寄存器值,以及zui近的温度转换结果。更多详情请参考DS1822的数据资料。我们的应用仅需要zui开始的两个字节,这两个字节就是zui近的温度转换结果。
ConvertTemperature[44h]。这是DS1822的指令。DS1822收到该指令后开始测量温度,并将其按位分辨率转换成数字量。结果存储到两个内部寄存器中,1-Wire主机可以通过ReadScratchpad读取。
当执行ConvertTemperature指令时,DS1822需要消耗更多的电流(zui多1.5mA),可能超过1-Wire总线弱上拉所能提供的电流。因此,一旦主机发出这一指令,必须对1-Wire总线进行强上拉,直至温度转换结束。在此期间,1-Wire总线上不能有任何通信发生。MAXQ3210简单地通过将P1.6端口从弱上拉切换成输出高电平来满足此要求。MAXQ3210端口驱动器能够输出足够DS1822工作所需的电流。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:ConvertAndReadTemp
;;Description:Sendscommandstomeasuretemperatureandread
;;scratchpadfromtheDS1822.
;;Inputs:None.
;;Outputs:GRL-8-bitsignedtemperaturevalue,indegreesC.
;;Destroys:PSF,AP,APC,A[0],A[1],A[2],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ConvertAndReadTemp:
callReset1Wire;ResettheDS1822
moveGRL,#OW_SKIP_ROM;SelecttheDS1822
callWrite1Wire
moveGRL,#OW_CONVERT;Sendtempconvertcommand
callWrite1Wire
moveOWDIR,#1;Turnonstrongpullupfordrawcurrent
moveOWOUT,#1
moveLC[0],#55;Aboutasecond
delay:
moveLC[1],#0
djnzLC[1],$
djnzLC[0],delay
callReset1Wire;Conversioncompleted;resetagain
moveGRL,#OW_SKIP_ROM;Selectagain
callWrite1Wire
moveGRL,#OW_RD_SCRATCH;Readthescratchpadvalues
callWrite1Wire
callRead1Wire
moveA[1],GRL;TempLSB3210xxxx
callRead1Wire
moveA[2],GRL;TempMSBsssss654
moveAcc,A[1];3210xxxx
and#0F0h;3210----
xchn;----3210
moveA[1],Acc
moveAcc,A[2];sssss654
and#00Fh;----s654
xchn;s654----
orA[1];s6543210
moveGRL,Acc
ret
将测量结果存储在数据EEPROM中
为防止1-Wire总线偶然出现数据错误,演示代码每次测量都执行三次温度转换(A,B和C),并从中选择一个结果存储,选择的依据为:
如果所有数据相同,则存储该数据。
如果三个中有两个数据相同(A=B,B=C或A=C),则选择相同的数据存储。
如果没有数据相同,则取中间值存储。例如,如果(A>B>C),则存储B。
被选中的值被写入数据EEPROM的一个字中。由于采样结果为一个字节,每个字的高字节被用来指示该记录(也就是字)是否为空。如果高字节为0,该记录/字为空,如果高字节非0,则低字节为有效温度数据。这样就能区分空记录和存储数据为0°C的有效数据。
;;Twooutofthreemajorityvote,orfailingthat,themeasurement
;;inthemiddleofthethree.
moveAcc,A[4]
cmpA[5]
jumpE,recordTempA;If(A==B),usethatvalue
cmpA[6]
jumpE,recordTempA;If(A==C),usethatvalue
moveAcc,A[5]
cmpA[6]
jumpE,recordTempB;If(B==C),usethatvalue
moveAcc,A[4]
subA[5]
jumpS,B_greaterThan_A;Signissetif(A-B)isnegative
;;If(A>B){
;;If(C>A)recordA(C>A>B)
;;If(B>C)recordB,(A>B>C)
;;elserecordC(A>C>B)
A_greaterThan_B:
moveAcc,A[4]
subA[6];A-C
jumpS,recordTempA;Signissetif(A-C)isnegative
moveAcc,A[5]
subA[6];B-C
jumpS,recordTempC;Signissetif(B-C)isnegative
jumprecordTempB
;;If(B>A){
;;If(C>B)recordB(C>B>A)
;;If(A>C)recordB,(A>B>C)
;;elserecordC(B>C>A)
B_greaterThan_A:
moveAcc,A[5]
subA[6];B-C
jumpS,recordTempB;Signissetif(B-C)isnegative
moveAcc,A[4]
subA[6];A-C
jumpS,recordTempC;Signissetif(A-C)isnegative
jumprecordTempB
recordTempA:
moveGRL,A[4]
jumprecordTemp
recordTempB:
moveGRL,A[5]
jumprecordTemp
recordTempC:
moveGRL,A[6]
jumprecordTemp
recordTemp:
moveA[15],GRL
moveGRL,#'@'
callTxCharBB
moveGR,DP[0]
moveGRL,GRH
callTxHexByteBB
moveGRL,DP[0]
callTxHexByteBB
moveGRL,#''
callTxCharBB
moveGRL,#'W'
callTxCharBB
moveGRL,A[15]
callTxHexByteBB
moveGRL,A[15];Lowbytecontainstempdata
moveGRH,#055h;Highbytemarksnonzeroentry
lcallUROM_loadData;WriteentrytodataEEPROM
callIncDP0_EE;Movetothenextentryposition
moveGR,#0000h;Eraseanydatathatexists
lcallUROM_loadData;Erasetheoldestentry
记录采用循环方式,从数据EEPROM地址020h开始到05Fh结束,然后再回到开始处。之后每写入一个新记录,将擦除一个zui旧的记录。当通过串行接口向外发送数据时,应用程序通过查找前面是否又有空记录的方式定位zui旧的记录数据。
节省功耗
由于本应用每分钟仅记录一次温度数据,而读取DS1822数据并将其存储到EEPROM中仅需几秒钟。多数时间应用都在等待一分钟的延时结束。根据应用的要求,不需更改太多代码即可将温度记录间隔拉长,比如到五分钟、十分钟或三十分钟。为了减少等待期间对电池的消耗,应尽可能降低功耗。
MAXQ3210所能提供的zui低功耗模式为待机模式。该模式下,程序停止运行,高频晶振停止工作,电流降到微安量级。由于没有其它器件还在工作,我们需要将MAXQ3210从待机模式周期性的唤醒来测量温度。
这一要求可通过MAXQ3210的唤醒时钟实现。这一时钟依靠在待机模式仍然工作的内部8kHz低电流环形振荡器运行,能以zui长两分钟的可编程间隔唤醒微控制器。这种定时唤醒对于我们的应用非常理想,在应用中可将“闹钟”设为一分钟,微控制器工作结束后接着进入待机模式以节省功耗,然后等待被唤醒再次采集数据。
;;Startthewakeuptimerfor60seconds.
moveCKCN.6,#1;Selectringoscillatormode
waitRing:
moveC,CKCN.5
jumpNC,waitRing;WaitforRGMD=1(runningfromring)
moveWUT,#30000;1/8kHz*30000*16=60seconds
moveWUTC,#0101b;Startthewakeuptimer(runningfromring)
moveIV,#wakeUpInt;Setinterrupthandlerforwakeupinterrupt
moveIMR.0,#1;Enableinterruptsfrommodule0
moveIC.0,#1;Globallyenableinterrupts
movePD0.7,#0;TurnoffoutputmodeforLEDpin
movePO0.7,#1;Returntodefaultstate(weakpullup)
moveCKCN.4,#1;GointoStopmode,waitforwakeupint
nop
jumpmainLoop;Backforanotherround
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wakeUpInt:
movePD0.7,#1;TurnonoutputmodeforLEDportpin
movePO0.7,#0;LighttheLED
moveCKCN.6,#1;Selectringoscillatormode
wakeUp_ring:
moveC,CKCN.5
jumpNC,wakeUp_ring;WaitforRGMD=1(runningfromring)
moveLC[0],#4000
djnzLC[0],$
movePO0.7,#1;LEDoff
moveLC[0],#4000
djnzLC[0],$
moveWUTC,#0;Clearwakeuptimerflag
moveCKCN.6,#0;Selectcrystalmode
wakeUp_xtal:
moveC,CKCN.5
jumpC,wakeUp_xtal;WaitforRGMD=0(runningfromcrystal)
moveGRL,#'W'
callTxCharBB
moveGRL,#'U'
callTxCharBB
moveGRL,#0Dh
callTxCharBB
moveGRL,#0Ah
callTxCharBB
reti
上传温度记录数据
每次上电复位后,应用程序向主机系统发送温度记录数据。数据通过10位异步串行接口以9600bps的速率发送(1位开始位,8位数据位,1位停止位)。MAXQ3210不带硬件UART串口,需要使用一个端口引脚模拟实现。由于本应用只需发送,不需接收,所以实现起来比较简单。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:TxCharBB
;;Description:Transmitsa10-bitserialcharacter(bit-banged)
;;overP0.0.
;;Inputs:GRL-Charactertosend
;;Outputs:None
;;Destroys:PSF,AP,APC,A[0],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TxCharBB:
moveAPC,#080h;Standardmode,selectA[0]asAcc
moveAcc,GRL
movePO0.0,#0;STARTbitlow
moveLC[0],#BITLOOP
djnzLC[0],$
moveLC[1],#8;8bits
TxCharBB_bitLoop:
rrc;Getthenextbit
jumpC,TxCharBB_one
TxCharBB_zero:
movePO0.0,#0
sjumpTxCharBB_next
TxCharBB_one:
movePO0.0,#1
TxCharBB_next:
moveLC[0],#BITLOOP
djnzLC[0],$
djnzLC[1],TxCharBB_bitLoop
movePO0.0,#1;STOPbithigh
moveLC[0],#BITLOOP
djnzLC[0],$
moveLC[0],#BITLOOP
djnzLC[0],$
ret
要把温度数据从带符号的2进制、8位摄氏度数值转换成容易识别的ASCII码、华氏度数值,还需要增加较多代码,但这些代码简单易懂。使用BCD(二进制编码的十进制)运算规则执行二进制到十进制的转换,同时完成摄氏度到华氏度的转换。
moveGR,@DP[0];Getthecurrententry
moveAcc,GRH;Checkthehighbyte
jumpZ,endOutput;Ifit'szerowe'redone
moveA[15],GRL;Savethelowbyte(tempvalue)
moveA[7],#0;Hundreds=0
moveA[6],#0;Tens=0
moveA[5],#0;Ones=0
moveA[4],#0;Tenths=0
moveA[3],#0;Add01.8perdegreeC
moveA[2],#1
moveA[1],#8
moveAcc,A[15];s6543210
jumpS,tempNegC
tempPosC:
moveGRL,#'+'
jumpZ,tempPrint
moveLC[0],Acc
tempPosC_loop:
callAddBCD
djnzLC[0],tempPosC_loop
moveA[3],#3
moveA[2],#2
moveA[1],#0;Add32.0
callAddBCD
jumptempPrint
tempNegC:
moveGRL,#'-'
neg
jumpZ,tempPrint;Negativezero
jumpS,tempPrint;-128isoutsidethesensorrangeanyhow
moveLC[0],Acc
tempNegC_loop:
callAddBCD
djnzLC[0],tempNegC_loop
moveA[3],#3
moveA[2],#2
moveA[1],#0;Subtract32.0
callSubBCD
jumpNC,tempPrint
moveGRL,#'+';Backtopositiveagain
jumptempPrint
tempPrint:
callTxCharBB;Printplus/minussign
callTxTempBB;Printtemperaturevalue+newline
callIncDP0_EE;Movetothenextentry
由于MAXQ3210的端口输出采用5V电平,在与PC的COM串口连接之前必须使用外部器件(如MAX233ACWP)对输出进行电平转换。完成这一转换后,可以使用任何标准终端仿真程序接收应用输出的数据。
RST
DS1822Detected:22A9CC15000000E5
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+59.0
+62.6
+69.8
+59.0
+55.4
+55.4
+55.4
+55.4
+55.4
+55.4
+55.4
+57.2
+55.4
+55.4
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
应用功能扩展
MAXQ3210具有1kx16(1024字)的EEPROM程序存储空间,演示代码只占用了其中的60%至70%。可对应用代码进一步优化,使其仅占用50%的程序存储空间。开发了应用的核心功能后,可增加许多额外功能,使其成为功能完备的环境检测系统。
多传感器。可以轻松地扩充1-Wire子程序,使其能够访问多个DS1822温度传感器,这些传感器可以分别与单独的端口连接(每端口接1个器件),或者在单根线上挂一组器件(多点配置)。多点配置结构比较复杂,但能够使MAXQ3210连接更多的器件。
多种传感器类型。应用可以连接多种不同类型的1-Wire传感器,以测量不同环境参数,包括:湿度(DS1923温度/湿度记录仪)、物理开关(DS2401硅序列号),或使用模数转换器(DS2450,1-Wire接口、四通道、A/D转换器)的通用传感器。更多信息见MaximIC的1-Wire/iButton产品页面。
声音告警。MAXQ3210内置压电扬声器驱动电路,因此可以非常简单地加入高分贝扬声器。当温度转换结果高于或低于门限后,将发出告警声。
增加记录容量。应用可以按照写数据EEPROM的方式将数据写到未使用的程序EEPROM中。如果应用代码足够小,可以用一部分程序EEPROM来存储更多的温度转换结果,进而记录更长时间的温度数据。
双向串行通信。通过位模拟方式实现双向串行端口,要比仅仅实现发送端口更复杂,但MAXQ3210仍可轻松实现。有了双向端口,主机可以请求MAXQ3210上传记录数据,设置配置数据(如DS1822的温度分辨率),按需访问特定的传感器,甚至可以通过串行接口更新MAXQ3210的固件。
结论
小封装,低功耗,I/O灵活的MAXQ3210是电池供电的环境监测应用的理想选择。许多1-Wire传感器可被用来测量温度、湿度等环境参数,而这些传感器又可仅通过一个端口实现与MAX3210的接口。zui后,数据还可以被存贮在MAXQ3210自带的非易失EEPROM存储器中,供以后查询和分析。