温度测量.docx
《温度测量.docx》由会员分享,可在线阅读,更多相关《温度测量.docx(21页珍藏版)》请在冰豆网上搜索。
温度测量
TEMP_ZHDATA24H;实时温度值整合后存放单元
TEMPLDATA25H
TEMPHDATA26H
TEMP_THDATA27H;高温报警值存放单元
TEMP_TLDATA28H;低温报警值存放单元
TEMPHHDATA29H;百位数bcd码存放单元
TEMPHLDATA2AH;十位数bcd码存放单元
TEMPLHDATA2BH;个位数bcd码存放单元
TEMPLLDATA2CH;小位数bcd码存放单元
SIGNEQU20H.3;1=温度为负,0=温度为正
K1EQUP1.4
K2EQUP1.5
K3EQUP1.6
K4EQUP1.7
BEEPEQUP3.7
FLAG1EQU20H.0;DS18B20是否存在/1存在,0不存在
DQEQUP3.4
;=====================================================
ORG0000H
JMPMAIN
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H;将20H-2FH单元清零
MOVR1,#10H
CLEAR:
MOV@R0,A
INCR0
DJNZR1,CLEAR
LCALLTHTL_DISP
MOVR1,#250
MMM1:
LCALLDELAY
DJNZR1,MMM1
START:
CALLRESET;18B20复位子程序
JNBFLAG1,START1;DS1820不存在
CALLREAD_E2;从eerom拷贝TH\TL到暂存器
JMPSTART2
START1:
JMP$
START2:
CLRBEEP
CALLRESET
JNBFLAG1,START1;DS1820不存在
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#44H;发出温度转换命令
CALLWRITE
CALLRESET
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#0BEH;发出读温度命令
CALLWRITE
CALLREAD
CALLCONV_TEMP
CALLLED_DISP
CALLTEMP_COMP
CALLPROC_K2
JMPSTART2
;-----------------------------------------------------
;============================================
;检测是否有键按下
;============================================
PROC_K2:
;按键K2处理
JBK2,PROC_END
CALLDELAY
JBK2,PROC_END
JNBK2,$
CALLBZ55_127
MOV29H,#0BH;H的bcd码送百位
MOVR4,TEMP_TH
LCALLTHTL_BCD
LCALLTHTL_DISP
CALLSET_ALARM
CALLRE_18B20;将设定的TH,TL值写入DS18B20内
CALLWRITE_E2
PROC_END:
RET
;-------------------------------------------------
;变不在-55---127内的TH.TL的为0
;------------------------------------------------
BZ55_127:
MOVR1,#TEMP_TH
MOVR2,#2
BZ1:
CLRC
MOVA,@R1
SUBBA,#0B7H
JCBZ2
MOV@R1,#00H
INCR1
DJNZR2,BZ1
BZ2:
RET
;============================================
;设定报警值TH、TL
;============================================
SET_ALARM:
NOP
AS_K1:
JBK1,AS0_K1
CALLDELAY
JBK1,AS0_K1
JNBK1,$
CPL20H.1;UP/DOWN标记
AS0_K1:
JB20H.1,UP_TH;20H.1=1,UP
JMPDOWN_TH;20H.1=0,DOWN
AS_K4:
LCALLTHTL_DISP
JBK4,AS_K1;确定调整OK
CALLDELAY
JBK4,AS_K1
JNBK4,$
RET
UP_TH:
JBK2,UP_TL;TH值调整(增加)
CALLDELAY
JBK2,UP_TL
JNBK2,$
MOVA,TEMP_TH
ANLA,#80H
JNZUP_TH1
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#128,TH_DISP;TH大于127转零
MOVTEMP_TH,#0B7H
JMPTH_DISP
UP_TH1:
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#128,TH_DISP;TH大于127转零
MOVTEMP_TH,#00H
TH_DISP:
MOV29H,#0BH;H的bcd码送百位
MOVR4,TEMP_TH
LCALLTHTL_BCD
LCALLTHTL_DISP
JMPUP_TH
UP_TL:
JBK3,AS_K4;TL值调整(增加)
CALLDELAY
JBK3,AS_K4
JNBK3,$
MOVA,TEMP_TL
ANLA,#80H
JNZUP_TL01
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#128,TL_DISP;TL大于127转零
MOVTEMP_TL,#0B7H
JMPTL_DISP
UP_TL01:
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#128,TL_DISP
MOVTEMP_TL,#00H
TL_DISP:
MOV29H,#0CH;L的bcd码送百位
MOVR4,TEMP_TL
LCALLTHTL_BCD
LCALLTHTL_DISP
JMPUP_TL
DOWN_TH:
JBK2,ASJ02;TH值调整(减少)
CALLDELAY
JBK2,ASJ02
JNBK2,$
MOVA,TEMP_TH;TH为0,应变为-1
ANLA,#80H
JNZDOWN_TH01
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,ASJ011
MOVA,#81H
MOVTEMP_TH,A
JMPASJ011
DOWN_TH01:
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#0B8H,ASJ011
MOVTEMP_TH,#127
ASJ011:
MOV29H,#0BH;H的bcd码送百位
MOVR4,TEMP_TH
LCALLTHTL_BCD
LCALLTHTL_DISP
JMPDOWN_TH
ASJ02:
JBK3,ASJ03;TL值调整(减少)
CALLDELAY
JBK3,ASJ03
JNBK3,$
MOVA,TEMP_TL
ANLA,#80H
JNZASJ022
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#0FFH,ASJ021
MOVTEMP_TL,#81H
JMPASJ021
ASJ022:
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#0B8H,ASJ021
MOVTEMP_TL,#127
ASJ021:
MOV29H,#0CH;L的bcd码送百位
MOVR4,TEMP_TL
LCALLTHTL_BCD
LCALLTHTL_DISP
JMPASJ02
ASJ03:
JMPAS_K4
RET
;============================================
;TH/TL分离bcd码
;============================================
THTL_BCD:
CLR20H.2
MOVA,R4;十六进制->BCD
ANLA,#80H
JZTHTL_01
SETB20H.2
MOV2AH,#0AH;负号的bcd码
MOVA,R4
ANLA,#7FH
MOVB,#10
JMPTHTL_02
THTL_01:
MOVA,R4
MOVB,#100
DIVAB
MOV2AH,A;百位数的bcd码
MOVA,#10
XCHA,B
THTL_02:
DIVAB
MOV2BH,A;TEMPLH=十位数BCD
MOV2CH,B;TEMPLL=个位数BCD
RET
;=======================================================
;将设定的TH,TL值写入DS18B20内
;=======================================================
RE_18B20:
JBFLAG1,RE_18B20A
RET
RE_18B20A:
CALLRESET
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#4EH;写暂存寄存器
LCALLWRITE
MOVA,TEMP_TH;TH(报警上限)
LCALLWRITE
MOVA,TEMP_TL;TL(报警下限)
LCALLWRITE
MOVA,#7FH;12位精确度
LCALLWRITE
RET
;------------------------------------------------------------
WRITE_E2:
CALLRESET
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#48H;把暂存器里的温度报警值拷贝到EEROM
LCALLWRITE
RET
;--------------------------------------------------------------
READ_E2:
CALLRESET
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0B8H;把EEROM里的温度报警值拷贝回暂存器
CALLWRITE
RET
;====================================================
;实际温度值与报警温度比较
;====================================================
TEMP_COMP:
JBSIGN,ARM2
MOVA,TEMP_TH
ANLA,#80H
JNZCHULI
CLRC
MOVA,TEMP_ZH
SUBBA,TEMP_TH
JNCCHULI
MOVA,TEMP_TL
ANLA,#80H
JNZARM1
MOVA,TEMP_ZH
CLRC
SUBBA,TEMP_TL
JCCHULI
CLRBEEP
ARM1:
RET
ARM2:
MOVA,TEMP_TH
ANLA,#80H
JZARM21
CLRC
MOVA,TEMP_TH
ANLA,#7FH
MOVR5,TEMP_ZH
XCHA,R5
SUBBA,TEMP_TH
JCCHULI;温度大于TH,则跳转闪烁
ARM21:
MOVA,TEMP_TL
ANLA,#80H
JNZCHULI
MOVA,TEMP_TL
ANLA,#7FH
CLRC
MOVR5,TEMP_ZH
XCHA,R5
SUBBA,R5
JNCCHULI;温度小于TL,则跳转闪烁
CLRBEEP
RET
CHULI:
LCALLBEEP_BL
CLRBEEP
RET
;====================================================
;DS18B20复位初始化程序(已修改)
;====================================================
RESET:
SETBDQ
NOP
CLRDQ
MOVR1,#03
TSR1:
MOVR0,#80
DJNZR0,$;延时
DJNZR1,TSR1
SETBDQ;然后拉高数据线
NOP
MOVR0,#15;96微秒
TSR2:
JNBDQ,TSR3
DJNZR0,TSR2
JMPTSR4;延时
TSR3:
SETBFLAG1;置标志位,表示DS18B20存在
LJMPTSR5
TSR4:
CLRFLAG1;清标志位,表示DS18B20不存在
JMPTSR7
TSR5:
MOVR0,#115;200微秒
DJNZR0,$;延时
TSR7:
SETBDQ
RET
;==============================================================
;WRITE程序,从P3.3端口写一个字节(已修改)
;==============================================================
WRITE:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRDQ;开始写入DS18B20总线要处于复位(低)状态
MOVR3,#07
DJNZR3,$;总线复位保持16微妙以上
RRCA;把一个字节DATA分成8个BIT环移给C
MOVDQ,C;写入一个BIT
MOVR3,#3CH
DJNZR3,$;等待100微妙
SETBDQ;重新释放总线
NOP
DJNZR2,WR1;写入下一个BIT
SETBDQ
RET
;==============================================================
;READ程序,从18B20中读出温度低位、高位、TH、TL(已修改)
;==============================================================
READ:
MOVR4,#4;将温度低位、高位、TH、TL从DS18B20中读出
MOVR1,#TEMPL;存入25H、26H、27H、28H
RE00:
MOVR2,#8
RE01:
CLRCY
SETBDQ
NOP
NOP
CLRDQ;读前总线保持为低
NOP
NOP
NOP
SETBDQ;开始读总线释放
MOVR3,#09;延时18微妙
DJNZR3,$
MOVC,DQ;从DS18B20总线读得一个BIT
MOVR3,#3CH
DJNZR3,$;等待100微妙
RRCA;把读得的位值环移给A
DJNZR2,RE01;读下一个BIT
MOV@R1,A
INCR1
DJNZR4,RE00
RET
;*****************************************************
;处理温度BCD码子程序(已修改)
;***************************************F*************
CONV_TEMP:
CLRSIGN;符号标志位清零
MOVA,TEMPH;判温度是否零下
ANLA,#80H
JZTEMPC1;温度零上转TEMPC1
SETBSIGN;小于零,符号标志位置1
CLRC
MOVA,TEMPL;零下,二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
TEMPC1:
MOVA,TEMPL
ANLA,#0FH;小数位,精确到0.1
MOVDPTR,#TAB0
MOVCA,@A+DPTR
MOVTEMPLL,A;TEMPLL=小数部分BCD
MOVA,TEMPL;整数部分
ANLA,#0F0H;取出高四位
SWAPA
MOVTEMPL,A
MOVA,TEMPH;取出低四位
ANLA,#0FH
SWAPA
ORLA,TEMPL;重新组合
MOVTEMP_ZH,A
MOVB,#100;十六进制->BCD
DIVAB;B=A%100
MOVTEMPHH,A;TEMPHH=百位数
TEMPC3:
MOVA,#10
XCHA,B
DIVAB;B=A%B
MOVTEMPHL,A;TEMPHL=十位数BCD
MOVTEMPLH,B;TEMPLH=个位数BCD
RET
;==========================================================
;LED显示子程序(已修改)
;==========================================================
LED_DISP:
LCALLLED_BCD
MOVR0,#0FEH
MOVR1,#29H;待输出数据,百位
MOVR2,#02H;连续输出百位和十位
MOVDPTR,#TAB2
LED_DISP0:
MOVP2,#0FFH
MOVA,@R1
MOVCA,@A+DPTR
MOVP0,A
MOVA,R0
MOVP2,A
RLA
MOVR0,A
LCALLDELAY;延时5mS
INCR1
DJNZR2,LED_DISP0
MOVP2,#0FFH
MOVDPTR,#TAB1;输出个位
MOVA,@R1
MOVCA,@A+DPTR
MOVP0,A
CLRP2.2
LCALLDELAY;延时5mS
SETBP2.2
INCR1;输出小数部分
MOVA,@R1
MOVDPTR,#TAB2
MOVCA,@A+DPTR
MOVP0,A
CLRP2.3
LCALLDELAY;延时5mS
SETBP2.3
RET
;==========================================================
;THTL的显示
;==========================================================
THTL_DISP:
MOVR0,#0FEH
MOVR1,#29H;待输出数据
MOVR2,#04H;
MOVDPTR,#TAB2
THTL_DISP0:
MOVP2,#0FFH
MOVA,@R1
MOVCA,@A+DPTR
MOVP0,A
MOVA,R0
MOVP2,A
RLA
MOVR0,A
LCALLDELAY;延时5mS
INCR1
DJNZR2,THTL_DISP0
RET
;-------------------------------------------------------------
;个位部分码表(共阴极)
;-------------------------------------------------------------
TAB1:
DB0FDH,61H,0DBH,0F3H,67H
DB0B7H,0BFH,0E1H,0FFH,0F7H
TAB0:
DB00H,01H,01H,02H,03H,03H,04H,04H
DB05H,06H,06H,07H,08H,08H,09H,09H
;-------------------------------------------------------------
;小数、十位、百位、符号等码表(共阴极)
;-------------------------------------------------------------
TAB2:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH
DB0E0H,0FEH,0F6H,02H,6EH,1CH,00H
;(-HL熄灭)
;(0A0B0C0D)
;-----------------------------------------------------------------
;符号的显示位置调整程序(已修改)
;-----------------------------------------------------------------
LED_BCD:
MOVA,TEMPHH
JZLED_BCD1;百位为零,转移
RET;百位不为零,返回
LED_BCD1:
MOVA,TEMPHL
JZLED_BCD3;十位为零,转移
JBSIGN,LED_BCD2;温度零下,转移
MOVTEMPHH,#0DH;温度大于零且为两位数,百位熄灭
SJMPLED_BCD5
LED_BCD2:
MOVTEMPHH,#0AH;温度小于零且为两位数,百位显示负号
SJMPLED_BCD5
LED_BCD3:
MOVTEMPHH,#0DH;温度小于10,百