普通IO口测量温度(NTC)(asm程序)
扫描二维码
随时随地手机看文章
这是一段利用单片机IO口作的温控程序,感温元件是NTC。功能是当温度低过某值时开始加热,随着温度上升;当高到某值时停止加热,然后开始冷却,不断重复。使用时要注意RC常数,常数过大会造成16位计数溢出,得不到正确结果。程序是作产品前的一个试验程序,当时调试已通过,能作到±0.5℃。
;******************************************************
;filename: IOTestNTC.asm
;mcu: MDT2005EP
;clock: 4 MHz for EXTXT
;date: 2006/03/17
;writer: aLin
;******************************************************
;计算被测量电阻。只做比较,不作计算。
;计算公式:Rx = Rf * (Tx/Tf)
;Rx为被测电阻
;Rf为已知电阻,Rf=10K
;Tx为被测电阻对电容C放电的计数值,为16位数
;Tf为被测电阻对电容C放电的计数值,为16位数
;查温度特性表(NTC型号为:CWF2-473F-3950K,大亚科技制造):
;下限温度5摄氏度时电阻为121545.44欧,即121.54544K
;换算为:Tx/Tf=Rx/Rf=12.154544
;扩大1000倍后结果为:12154.544,约为12155,即2F76H
;上限温度8摄氏度时电阻为104712.92欧,即104.71292K
;换算为:Tx/Tf=Rx/Rf=10.471292
;扩大1000倍后结果为:10471.292,约为10471,即28E7H
;-------------------------------------------------------------------
listp=pic16c54
#i nclude"p16c5x.inc"
;定义I/O口
#definevtportb,0
#definerfportb,1
#definerxportb,2
#defineonportb,4
#defineoffportb,4
#definef0user,0
;RAM 分配
CNTEQU10H;计数器
SOU1EQU11H;四字节被除数最低位和16位商的低8位
SOU2EQU12H;被除数和16位商高8位
SOU3EQU13H;被除数和16位余数的低8位
SOU4EQU14H;四字节被除数最高位和16位余数的高8位
USEREQU15H;用户标记位
SOUEQU16H;被数低8位和积(四字节积的最低位)和RX电阻计数器低8位
SOUHEQU17H;被乘数高8位和积和RX电阻计数器高8位
RLTEQU18H;乘数低8位和积
RLTHEQU19H;乘数高8位和积(四字节积的最高位)
TEMP1EQU1AH;临时寄存器1-4
TEMP2EQU1BH
TEMP3EQU1CH
TEMP4EQU1DH
RFCNTLEQU1EH;RF电阻计数器低8位
RFCNTHEQU1FH;RF电阻计数器高8位
;---------------------------------
ORG0000h
startbcffsr,6;选择bank0
bcffsr,5
movlwb'11101111';RB4定义为输出,其余输入,PortB4为一直输出
tris06h
;---------------------------------------------------
;停止加热处理程序
;等待温度降到5摄氏度以下是,重新加热,跳到加热处理程序
;
;负温度系电阻,阻值越大,温度越低
;用5摄氏度时对应的电阻减去测出的电阻,为负数,表明实际温度已低过5摄氏度
;需加热处理
;
HOT_DOWNbcfoff;停止加热
;calld1s;延时1秒
callio_rm;调用测量电阻程序
callDUMUL;调用16位无符号乖法程序
callDUDIV;调用32位除以16位无符号除法程序
;比较商大小
;0E10 对应36K电阻,温度是31度
MOVLW2FH
MOVWFTEMP1
MOVFSOU2,W
SUBWFTEMP1,W;商高8位先减
BTFSSSTATUS,C;检查是否有借位,有借位时C=0
GOTOHOT_UP;有借位,被减数小于减数,跳到加热程序
BTFSSSTATUS,Z;无借位,查相减结果是否为0
GOTOHOT_DOWN;结果不为0,则被减数大于减数,跳到停止加热程序
MOVLW76H;商高8位相等,商低8位相减
MOVWFTEMP1
MOVFSOU1,W
SUBWFTEMP1,W
BTFSSSTATUS,C
GOTOHOT_UP
BTFSSSTATUS,Z
GOTOHOT_DOWN