液晶显示温度控制器.docx
《液晶显示温度控制器.docx》由会员分享,可在线阅读,更多相关《液晶显示温度控制器.docx(30页珍藏版)》请在冰豆网上搜索。
液晶显示温度控制器
功能说明:
本装置的功能是对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。
;
程序清单:
;--------------------------------
TEMP_ZHEQU24H;实时温度值存放单元
TEMPLEQU25H;低温度值存放单元
TEMPHEQU26H;高温度值存放单元
TEMP_THEQU27H;高温报警值存放单元
TEMP_TLEQU28H;低温报警值存放单元
TEMPHCEQU29H;存十位数BCD码
TEMPLCEQU2AH;存个位数BCD码
;--------------------------------
K1EQUP2.1
K2EQUP2.2
K3EQUP2.3
K4EQUP2.4
;--------------------------------
SPKEQUP3.4
RELAYEQUP2.0
XEQU2FH;LCD地址变量
;--------------------------------
RSEQUP3.5
RWEQUP3.6
EEQUP3.7
;--------------------------------
FLAGEQU20H.0;DS18B20是否存在标记
KEY_UDEQU20H.1;设定KEY的UP与DOWN标记
DQEQUP2.5
;========================主程序==========================
MAIN:
ACALLSET_LCD;LCD初始化设置子程序
ACALLWR_THL;将报警上下线写入暂存寄存器
TOOP:
ACALLRESET_1820;18B20复位子程序
JNBFLAG,TOOP1;DS1820不存在
ACALLMEU_OK;显示"OK"菜单
ACALLRE_THL;把EEROM里温度报警值拷贝回暂存器
ACALLTEMP_BJ;显示温度标记"C"
JMPTOOP2
TOOP1:
ACALLMEU_ERROR;显示"ERROR"菜单
ACALLTEMP_BJ;显示温度标记
JMP$
;--------------------------
TOOP2:
ACALLRE_TEMP
ACALLSET_DATA
ACALLTEMP_COMP;实际温度值与标记温度值比较子程序
ACALLP_KEY;键扫描子程序
SJMPTOOP2
;---------读取温度数据子程序---------
RE_TEMP:
ACALLRESET_1820;18B20复位子程序
JNBFLAG,TOOP1;DS1820不存在
MOVA,#0CCH;跳过ROM匹配
ACALLWRITE_1820;写入子程序
MOVA,#44H;发出温度转换命令
ACALLWRITE_1820;调写入子程序
ACALLRESET_1820;调复位子程序
MOVA,#0CCH;跳过ROM匹配
ACALLWRITE_1820;写入子程序
MOVA,#0BEH;发出读温度命令
ACALLWRITE_1820;写入子程序
ACALLREAD_1820;调用读入子程序
RET
;--------温度数据处理显示子程序----------
SET_DATA:
ACALLCONV_TEMP;处理温度BCD码子程序
ACALLDISP_BCD;显示区BCD码温度值刷新子程序
ACALLCONV;数据转换子程序
RET
;-----------按键键扫描子程序----------
P_KEY:
;按键K1处理
JBK1,PK1;K1键未按,转到PK1处
ACALLSPK_BZ;K1键按下,一声鸣响
JNBK1,$;等按键放开
MOVDPTR,#M_ALAX1;存M_ALAX1表
MOVA,#1
ACALLLCD_PRINT;显示字符
ACALLLOOK_ALARM;显示信息区
JBK3,$;等待K3按下
ACALLSPK_BZ;一声鸣响
JMPPK2;转到标号PK2处
PK1:
;按键K2处理
JBK2,PK3;K2键未按,转到PK3处
ACALLSPK_BZ;K2键按下,一声鸣响
JNBK2,$;等按键放开
MOVDPTR,#TA1;存#TA1表
MOVA,#1
ACALLLCD_PRINT;显示字符
ACALLSET_ALARM;设定报警值TH、TL
ACALLWR_THL;将设定的TH,TL值写入DS18B20内
ACALLWRITE_E2;
PK2:
ACALLMEU_OK;显示"OK"菜单
ACALLTEMP_BJ;显示温度标记
PK3:
RET
;-----------------------------------
TA1:
DB"RESETALERTCODE"
;-----------------------------------
;----------设定报警值TH、TL子程序---------
;设定报警值TH、TL
SET_ALARM:
ACALLLOOK_ALARM
A0:
JBK1,A2
ACALLSPK_BZ
JNBK1,$
CPL20H.1;UP/DOWN标记
A2:
JB20H.1,A3;20H.1=1,UP
JMPA8;20H.1=0,DOWN
A3:
JBK2,A5;TH值调整(增加)
ACALLSPK_BZ
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,A4
MOVTEMP_TH,#0
A4:
ACALLLOOK_ALARM
MOVR5,#10
ACALLDELAY
JMPA3
A5:
JBK3,A7;TL值调整(增加)
ACALLSPK_BZ
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#99,A6
MOVTEMP_TL,#00H
A6:
ACALLLOOK_ALARM;
MOVR5,#10
ACALLDELAY
JMPA5
A7:
JBK4,A0;确定调整OK
ACALLSPK_BZ
JNBK4,$
RET
A8:
JBK2,A10;TH值调整(减少)
ACALLSPK_BZ
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,A9
JMPA12
A9:
ACALLLOOK_ALARM
MOVR5,#10
ACALLDELAY
JMPA0
A10:
JBK3,A13;TL值调整(减少)
ACALLSPK_BZ
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#0FFH,A11
JMPA12
A11:
ACALLLOOK_ALARM;
MOVR5,#10
ACALLDELAY
JMPA0
A12:
CPL20H.1
JMPA3
A13:
JMPA7
RET
;----------显示信息区子程序-----------
LOOK_ALARM:
MOVDPTR,#M_ALAX2;指针指到显示信息区
MOVA,#2;显示在第二行
ACALLLCD_PRINT
MOVA,#0C6H
ACALLTEMP_BJ1
MOVA,TEMP_TH;加载TH数据
MOVX,#3;设置位置
ACALLSHOW_LINE2H;显示数据
MOVA,#0CEH
ACALLTEMP_BJ1
MOVA,TEMP_TL;加载TL数据
MOVX,#12;设置位置
ACALLSHOW_LINE2L;显示数据
RET
;-------------------------------
M_ALAX1:
DB"LOOKALERTCODE",0
M_ALAX2:
DB"TH:
TL:
",0
;-------------------------------
TEMP_BJ1:
ACALLWR_COMM
MOVDPTR,#BJ2;指针指到显示信息区
MOVR1,#0
MOVR0,#2
B0:
MOVA,R1
MOVCA,@A+DPTR
ACALLWR_DATA
INCR1
DJNZR0,B0
RET
BJ2:
DB00H,"C"
;----------------------------------
SHOW_LINE2H:
;在LCD的第二行显示数字
MOVB,#100
DIVAB
ADDA,#30H
PUSHB
MOVB,X
ACALLLCDP2
POPB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
INCX
PUSHB
MOVB,X
ACALLLCDP2
POPB
INCX
MOVA,B
MOVB,X
ADDA,#30H
ACALLLCDP2
RET
;-----------------------------
SHOW_LINE2L:
;在LCD的第二行显示数字
MOVB,#100
DIVAB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
PUSHB
MOVB,X
CALLLCDP2
POPB
INCX
MOVA,B
MOVB,X
ADDA,#30H
ACALLLCDP2
RET
;--------------------------------
;-----------温度值比较子程序------------
;实际温度值与标记温度值比较子程序
TEMP_COMP:
MOVA,TEMP_TH
SUBBA,TEMP_ZH;减数>被减数,则
JCTCL1;借位标志位C=1,转
MOVA,TEMP_ZH
SUBBA,TEMP_TL;减数>被减数,则
JCTCL2;借位标志位C=1,转
MOVDPTR,#BJ5
ACALLTEMP_BJ3
CLRRELAY;继电器吸合
RET
TCL1:
MOVDPTR,#BJ3;存入#BJ3表
ACALLTEMP_BJ3;调用显示高、低温度及加热标记子程序
SETBRELAY;继电器关闭
ACALLSPK_BZ
RET
TCL2:
MOVDPTR,#BJ4;存入#BJ4表
ACALLTEMP_BJ3;调用显示高、低温度及加标记子程序
ACALLSPK_BZ;调用鸣响子程序
RET
;---显示高、低温度及加热标记程序----
TEMP_BJ3:
MOVA,#0CEH
ACALLWR_COMM
MOVR1,#0
MOVR0,#2
BJJ:
MOVA,R1
MOVCA,@A+DPTR
ACALLWR_DATA
INCR1
DJNZR0,BJJ
RET
BJ3:
DB">H"
BJ4:
DB"BJ5:
DB"!
"
;---------报警上下线写入暂存器子程序----------
WR_THL:
JBFLAG,WR_T;
RET
WR_T:
ACALLRESET_1820
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#4EH;写暂存寄存器
LCALLWRITE_1820
MOVA,TEMP_TH;TH(报警上限)
LCALLWRITE_1820
MOVA,TEMP_TL;TL(报警下限)
LCALLWRITE_1820
MOVA,#7FH;12位精确度
LCALLWRITE_1820
RET
;---------报警值拷贝到EEROM子程序-----------
WRITE_E2:
ACALLRESET_1820
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#48H;[48H]为拷贝到EEROM的指令代码
LCALLWRITE_1820
RET
;----------报警值拷贝回暂存器子程序----------
RE_THL:
ACALLRESET_1820
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0B8H;把EEROM里的温度报警值拷贝回暂存器
ACALLWRITE_1820
RET
;----------处理温度BCD码子程序-----------
;处理温度BCD码子程序
CONV_TEMP:
MOVA,TEMPH;判温度是否零下
ANLA,#80H
JZTC1;温度零上转
CLRC
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
SJMPTC2
TC1:
MOVTEMPHC,#0AH
TC2:
MOVA,TEMPHC
SWAPA
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;乘0.0625
MOVDPTR,#DOTTAB
MOVCA,@A+DPTR
MOVTEMPLC,A;TEMPLCLOW=小数部分BCD
MOVA,TEMPL;整数部分
ANLA,#0F0H;取出高四位
SWAPA
MOVTEMPL,A
MOVA,TEMPH;取出低四位
ANLA,#0FH
SWAPA
ORLA,TEMPL;重新组合
MOVTEMP_ZH,A
LCALLHEX2BCD1
MOVTEMPL,A
ANLA,#0F0H
SWAPA
ORLA,TEMPHC;TEMPHCLOW=十位数BCD
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH
SWAPA;TEMPLCHI=个位数BCD
ORLA,TEMPLC
MOVTEMPLC,A
MOVA,R4
JZTC3
ANLA,#0FH
SWAPA
MOVR4,A
MOVA,TEMPHC;TEMPHCHI=百位数BCD
ANLA,#0FH
ORLA,R4
MOVTEMPHC,A
TC3:
RET
;--------------------------
HEX2BCD1:
MOVB,#064H;十六进制->BCD
DIVAB;B=A%100
MOVR4,A;R7=百位数
MOVA,#0AH
XCHA,B
DIVAB;B=A%B
SWAPA
ORLA,B
RET
;-------------------------
;小数部分码表
DOTTAB:
DB00H,00H,01H,01H,02H,03H,03H,04H
DB05H,05H,06H,06H,07H,08H,08H,09H
;-------------------------
;---------显示区BCD码温度值刷新子程序----------
;显示区BCD码温度值刷新
DISP_BCD:
MOVA,TEMPLC
ANLA,#0FH
MOV70H,A;小数位
MOVA,TEMPLC
SWAPA
ANLA,#0FH
MOV71H,A;个位
MOVA,TEMPHC
ANLA,#0FH
MOV72H,A;十位
MOVA,TEMPHC
SWAPA
ANLA,#0FH
MOV73H,A;百位
MOVA,TEMPHC
ANLA,#0F0H
CJNEA,#010H,DI0
SJMPDI2
DI0:
MOVA,TEMPHC
ANLA,#0FH
JNZDI2;十位数是0
MOVA,TEMPHC
SWAPA
ANLA,#0FH
MOV73H,#0AH;符号位不显示
MOV72H,A;十位数显示符号
DI2:
RET
;-------------------DS18B20复位初始化子程序----------------------
RESET_1820:
;复位(有具体的时序要求)
SETBDQ
NOP
CLRDQ
;――――――――――――
;主机发出延时537微秒的复位低脉冲
MOVR1,#3
DLY:
MOVR0,#107
DJNZR0,$
DJNZR1,DLY
;――――――――――――
;然后拉高数据线
SETBDQ
NOP
NOP
NOP
;――――――――――――
MOVR0,#25H
T2:
JNBDQ,T3;等待DS18B20回应
DJNZR0,T2
JMPT4
;――――――――――――
T3:
SETBFLAG;置标志位,表示DS1820存在
JMPT5
;――――――――――――
T4:
CLRFLAG;清标志位,表示DS1820不存在
JMPT7
;――――――――――――
T5:
MOVR0,#117
T6:
DJNZR0,T6;时序要求延时一段时间
;――――――――――――
T7:
SETBDQ
RET;复位子程序
;-------------------写入DS18B20子程序-----------------------
WRITE_1820:
;写入DS18B20(有具体的时序要求)
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRDQ;总线低位,开始写入
MOVR3,#6
DJNZR3,$;保持16微秒以上
RRCA;把字节DATA分成8个BIT环移给C
MOVDQ,C;写入一个BIT
MOVR3,#23
DJNZR3,$;等待
SETBDQ;重新释放总线
NOP
DJNZR2,WR1;写入下一个BIT
SETBDQ
RET;写入子程序
;---------------------读出DS18B20子程序--------------------
READ_1820:
;;将温度低位、高位、TH、TL从DS18B20中读出
MOVR4,#4;movr4,#4
MOVR1,#TEMPL;存入25H、26H、27H、28H
RE0:
MOVR2,#8;数据一共有8位
RE1:
CLRC
SETBDQ
NOP
NOP
CLRDQ;读前总线保持为低
NOP
NOP
NOP
SETBDQ;开始读总线释放
MOVR3,#9
DJNZR3,$;延时18微妙
MOVC,DQ;从总线读到一个BIT
MOVR3,#23;
DJNZR3,$;等待50微秒
RRCA;把读得的位价值环移给A
DJNZR2,RE1;读下一个BIT
MOV@R1,A
INCR1;R1内数据递增
DJNZR4,RE0
RET;读出子程序
;===================LCD1602显示程序======================
;初始化设置
SET_LCD:
;对LCD做初始化设置及测试
CLRE
CALLINIT_LCD;初始化LCD
CALLSTORE_DATA;将自定义字符存入LCD的CGRAM
RET
;-----------LCD初始化子程序-----------
INIT_LCD:
;8位I/O控制LCD接口初始化
MOVA,#38H
CALLWR_COMM
calldelay1
MOVA,#0CH;开显示,显示光标,光标不闪烁
CALLWR_COMM
calldelay1
MOVA,#01H;清除LCD显示屏
CALLWR_COMM
calldelay1
RET
;-----------显示温度标记子程序------------
;显示温度标记子程序
TEMP_BJ:
MOVA,#0CBH
ACALLWR_COMM
MOVDPTR,#BJ;指针指到显示消息
MOVR1,#0
MOVR0,#2
TP1:
MOVA,R1
MOVCA,@A+DPTR
ACALLWR_DATA
INCR1
DJNZR0,TP1
RET
BJ:
DB00H,"C"
;-----------自定义字符子程序------------
;将自定义字符写入LCD1602的CGRAM中
STORE_DATA:
MOVA,#40H
ACALLWR_COMM
MOVR2,#08H
MOVDPTR,#D_DATA
MOVR3,#00H
S_DATA:
MOVA,R3
MOVCA,@A+DPTR
ACALLWR_DATA;写入数据
INCR3
DJNZR2,S_DATA
RET
;---------------------------
D_DATA:
DB0CH,12H,12