当前位置:文档之家› 液晶显示温度控制器

液晶显示温度控制器

功能说明:本装置的功能是对温度进行实时监测与控制。

由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。

如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。

;程序清单:;--------------------------------TEMP_ZH EQU 24H ;实时温度值存放单元TEMPL EQU 25H ;低温度值存放单元TEMPH EQU 26H ;高温度值存放单元TEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU 28H ;低温报警值存放单元TEMPHC EQU 29H ;存十位数BCD码TEMPLC EQU 2AH ;存个位数BCD码;--------------------------------K1 EQU P2.1K2 EQU P2.2K3 EQU P2.3K4 EQU P2.4;--------------------------------SPK EQU P3.4RELAY EQU P2.0X EQU 2FH ;LCD 地址变量;--------------------------------RS EQU P3.5RW EQU P3.6E EQU P3.7;--------------------------------FLAG EQU 20H.0 ;DS18B20是否存在标记KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记DQ EQU P2.5;======================== 主程序========================== MAIN:ACALL SET_LCD ;LCD初始化设置子程序ACALL WR_THL ;将报警上下线写入暂存寄存器TOOP: ACALL RESET_1820 ;18B20复位子程序JNB FLAG,TOOP1 ;DS1820不存在ACALL MEU_OK ;显示"OK"菜单ACALL RE_THL ;把EEROM里温度报警值拷贝回暂存器ACALL TEMP_BJ ;显示温度标记"C"JMP TOOP2TOOP1: ACALL MEU_ERROR ;显示"ERROR"菜单ACALL TEMP_BJ ;显示温度标记JMP $;--------------------------TOOP2:ACALL RE_TEMPACALL SET_DATAACALL TEMP_COMP ;实际温度值与标记温度值比较子程序ACALL P_KEY ;键扫描子程序SJMP TOOP2;---------读取温度数据子程序---------RE_TEMP:ACALL RESET_1820 ;18B20复位子程序JNB FLAG,TOOP1 ;DS1820不存在MOV A,#0CCH ;跳过ROM匹配ACALL WRITE_1820 ;写入子程序MOV A,#44H ;发出温度转换命令ACALL WRITE_1820 ;调写入子程序ACALL RESET_1820 ;调复位子程序MOV A,#0CCH ;跳过ROM匹配ACALL WRITE_1820 ;写入子程序MOV A,#0BEH ;发出读温度命令ACALL WRITE_1820 ;写入子程序ACALL READ_1820 ;调用读入子程序RET;--------温度数据处理显示子程序----------SET_DA TA:ACALL CONV_TEMP ;处理温度BCD 码子程序ACALL DISP_BCD ;显示区BCD 码温度值刷新子程序ACALL CONV ;数据转换子程序RET;-----------按键键扫描子程序----------P_KEY: ;按键K1处理JB K1,PK1 ; K1键未按,转到PK1处ACALL SPK_BZ ;K1键按下,一声鸣响JNB K1,$ ;等按键放开MOV DPTR,#M_ALAX1 ;存M_ALAX1表MOV A,#1ACALL LCD_PRINT ;显示字符ACALL LOOK_ALARM ;显示信息区JB K3,$ ;等待K3按下ACALL SPK_BZ ;一声鸣响JMP PK2 ;转到标号PK2处PK1: ; 按键K2处理JB K2,PK3 ;K2键未按,转到PK3处ACALL SPK_BZ ;K2键按下,一声鸣响JNB K2,$ ;等按键放开MOV DPTR,#TA1 ;存#TA1表MOV A,#1ACALL LCD_PRINT ;显示字符ACALL SET_ALARM ;设定报警值TH、TLACALL WR_THL ;将设定的TH,TL值写入DS18B20内ACALL WRITE_E2 ;PK2:ACALL MEU_OK ;显示"OK"菜单ACALL TEMP_BJ ;显示温度标记PK3:RET;-----------------------------------TA1:DB "RESET ALERT CODE";-----------------------------------;----------设定报警值TH、TL子程序---------;设定报警值TH、TLSET_ALARM:ACALL LOOK_ALARMA0:JB K1,A2ACALL SPK_BZJNB K1,$CPL 20H.1 ;UP/DOWN 标记A2: JB 20H.1,A3 ;20H.1=1,UPJMP A8 ;20H.1=0,DOWNA3: JB K2,A5 ;TH值调整(增加)ACALL SPK_BZINC TEMP_THMOV A,TEMP_THCJNE A,#120,A4MOV TEMP_TH,#0A4: ACALL LOOK_ALARMMOV R5,#10ACALL DELAYJMP A3A5: JB K3,A7 ;TL值调整(增加)ACALL SPK_BZINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,A6MOV TEMP_TL,#00HA6: ACALL LOOK_ALARM ;MOV R5,#10ACALL DELAYJMP A5A7: JB K4,A0 ;确定调整OKACALL SPK_BZJNB K4,$RETA8:JB K2,A10 ;TH值调整(减少)ACALL SPK_BZDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,A9JMP A12A9: ACALL LOOK_ALARMMOV R5,#10ACALL DELAYJMP A0A10: JB K3,A13 ;TL值调整(减少)ACALL SPK_BZDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,A11JMP A12A11: ACALL LOOK_ALARM ;MOV R5,#10ACALL DELAYJMP A0A12: CPL 20H.1JMP A3A13: JMP A7RET;----------显示信息区子程序-----------LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行ACALL LCD_PRINTMOV A,#0C6HACALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV X,#3 ;设置位置ACALL SHOW_LINE2H ;显示数据MOV A,#0CEHACALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV X,#12 ;设置位置ACALL SHOW_LINE2L ;显示数据RET;-------------------------------M_ALAX1:DB " LOOK ALERT CODE",0M_ALAX2:DB "TH: TL: ",0;-------------------------------TEMP_BJ1:ACALL WR_COMMMOV DPTR,#BJ2 ;指针指到显示信息区MOV R0,#2B0: MOV A,R1MOVC A,@A+DPTRACALL WR_DA TAINC R1DJNZ R0,B0RETBJ2:DB 00H,"C";----------------------------------SHOW_LINE2H: ;在LCD 的第二行显示数字MOV B,#100DIV ABADD A,#30HPUSH BMOV B,XACALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC XPUSH BMOV B,XACALL LCDP2POP BINC XMOV A,BMOV B,XADD A,#30HACALL LCDP2RET;-----------------------------SHOW_LINE2L: ;在LCD 的第二行显示数字MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,XPOP BINC XMOV A,BMOV B,XADD A,#30HACALL LCDP2RET;--------------------------------;-----------温度值比较子程序------------;实际温度值与标记温度值比较子程序TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC TCL1 ;借位标志位C=1,转MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC TCL2 ;借位标志位C=1,转MOV DPTR,#BJ5ACALL TEMP_BJ3CLR RELAY ;继电器吸合RETTCL1:MOV DPTR,#BJ3 ;存入#BJ3表ACALL TEMP_BJ3 ;调用显示高、低温度及加热标记子程序SETB RELAY ;继电器关闭ACALL SPK_BZRETTCL2:MOV DPTR,#BJ4 ;存入#BJ4表ACALL TEMP_BJ3 ;调用显示高、低温度及加标记子程序ACALL SPK_BZ ;调用鸣响子程序RET;---显示高、低温度及加热标记程序----TEMP_BJ3:MOV A,#0CEHACALL WR_COMMMOV R1,#0MOV R0,#2BJJ: MOV A,R1MOVC A,@A+DPTRACALL WR_DA TAINC R1DJNZ R0,BJJRETBJ3:DB ">H"BJ4:DB "<L"BJ5:DB " !";---------报警上下线写入暂存器子程序----------WR_THL:JB FLAG,WR_T ;RETWR_T:ACALL RESET_1820MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#4EH ;写暂存寄存器LCALL WRITE_1820MOV A,TEMP_TH ;TH(报警上限)LCALL WRITE_1820MOV A,TEMP_TL ;TL(报警下限)LCALL WRITE_1820MOV A,#7FH ;12位精确度LCALL WRITE_1820RET;---------报警值拷贝到EEROM子程序-----------WRITE_E2:ACALL RESET_1820MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#48H ;[48H]为拷贝到EEROM的指令代码LCALL WRITE_1820RET;----------报警值拷贝回暂存器子程序----------RE_THL:ACALL RESET_1820MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器ACALL WRITE_1820RET;----------处理温度BCD 码子程序-----------; 处理温度BCD 码子程序CONV_TEMP: MOV A,TEMPH ;判温度是否零下ANL A,#80HJZ TC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,ASJMP TC2TC1: MOV TEMPHC,#0AHTC2: MOV A,TEMPHCSW AP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#DOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCDMOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SW AP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSW AP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSW AP AORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSW AP A ;TEMPLC HI = 个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TC3ANL A,#0FHSW AP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FHORL A,R4MOV TEMPHC,ATC3: RET;--------------------------HEX2BCD1:MOV B,#064H ;十六进制-> BCDDIV AB ;B= A % 100MOV R4,A ;R7 = 百位数MOV A,#0AHXCH A,BDIV AB ;B = A % BSW AP AORL A,BRET;-------------------------; 小数部分码表DOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04HDB 05H,05H,06H,06H,07H,08H,08H,09H;-------------------------;---------显示区BCD 码温度值刷新子程序----------;显示区BCD 码温度值刷新DISP_BCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSW AP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSW AP AANL A,#0FHMOV 73H,A ;百位MOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DI0SJMP DI2DI0: MOV A,TEMPHCANL A,#0FHJNZ DI2 ;十位数是0MOV A,TEMPHCSW AP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DI2: RET;------------------- DS18B20复位初始化子程序----------------------RESET_1820: ;复位(有具体的时序要求)SETB DQNOPCLR DQ;――――――――――――;主机发出延时537微秒的复位低脉冲MOV R1,#3DL Y: MOV R0,#107DJNZ R0,$DJNZ R1,DL Y;――――――――――――;然后拉高数据线SETB DQNOPNOPNOP;――――――――――――MOV R0,#25HT2: JNB DQ ,T3 ;等待DS18B20回应DJNZ R0, T2JMP T4;――――――――――――T3: SETB FLAG ;置标志位,表示DS1820存在JMP T5;――――――――――――T4: CLR FLAG ;清标志位,表示DS1820不存在JMP T7;――――――――――――T5: MOV R0,#117T6: DJNZ R0,T6 ;时序要求延时一段时间;――――――――――――T7: SETB DQRET ;复位子程序;------------------- 写入DS18B20子程序-----------------------WRITE_1820: ;写入DS18B20(有具体的时序要求)MOV R2,#8 ;一共8位数据CLR CWR1:CLR DQ ;总线低位,开始写入MOV R3,#6DJNZ R3,$ ;保持16微秒以上RRC A ;把字节DATA分成8个BIT环移给CMOV DQ, C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待SETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DQRET ;写入子程序;--------------------- 读出DS18B20子程序--------------------READ_1820: ;; 将温度低位、高位、TH、TL从DS18B20中读出MOV R4,#4 ;mov r4,#4MOV R1,#TEMPL ; 存入25H、26H、27H、28H RE0:MOV R2,#8 ;数据一共有8位RE1:CLR CSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#9DJNZ R3,$ ;延时18微妙MOV C, DQ ;从总线读到一个BITMOV R3,#23 ;DJNZ R3,$ ;等待50微秒RRC A ;把读得的位价值环移给ADJNZ R2,RE1 ;读下一个BITMOV @R1,AINC R1 ; R1内数据递增DJNZ R4,RE0RET ;读出子程序;=================== LCD 1602 显示程序======================;初始化设置SET_LCD: ;对LCD 做初始化设置及测试CLR ECALL INIT_LCD ;初始化LCDCALL STORE_DA TA ;将自定义字符存入LCD的CGRAMRET;-----------LCD 初始化子程序-----------INIT_LCD: ;8位I/O控制LCD 接口初始化MOV A,#38HCALL WR_COMMcall delay1MOV A,#0CH ;开显示,显示光标,光标不闪烁CALL WR_COMMcall delay1MOV A,#01H ;清除LCD 显示屏CALL WR_COMMcall delay1RET;-----------显示温度标记子程序------------;显示温度标记子程序TEMP_BJ:MOV A, #0CBHACALL WR_COMMMOV DPTR,#BJ ;指针指到显示消息MOV R1 ,#0MOV R0 ,#2TP1: MOV A,R1MOVC A,@A+DPTRACALL WR_DA TAINC R1DJNZ R0,TP1RETBJ:DB 00H,"C";-----------自定义字符子程序------------;将自定义字符写入LCD1602的CGRAM中STORE_DATA:MOV A,#40HACALL WR_COMMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA:MOV A,R3MOVC A,@A+DPTRACALL WR_DATA ;写入数据INC R3DJNZ R2,S_DATARET;---------------------------D_DA TA:DB 0CH,12H,12H,0CH,00H,00H,00H,00H;--------------;-----------显示“OK”信息子程序---------MEU_OK:MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行CALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行CALL LCD_PRINTRETM_OK1:DB " DS18B20 OK ",0M_OK2:DB " TEMP: ",0;----------显示“ERROR”信息子程序-------MEU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息1MOV A,#1 ;显示在第一行ACALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行ACALL LCD_PRINTRET;---------------M_ERROR1:DB " DS18B20 ERROR ",0M_ERROR2:DB " TEMP: ---- ",0;---------------;-------显示菜单------LCD_PRINT: ;在LCD的第一行或第二行显示字符CJNE A,#1,LINE2 ;判断是否为第一行LINE1:ACALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址ACALL WR_COMM ;写入命令JMP FILLLINE2:ACALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD 的第二行地址ACALL WR_COMMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: ACALL WR_DA TA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;----------数据转换--------------CONV:MOV A,73H ;加载百位数据MOV X,#6 ;设置位置CJNE A,#1,CO1JMP CO2CO1: MOV A,#" "MOV B,XACALL LCDP2JMP CO3CO2: ACALL SHOW_LINE2 ;显示数据CO3: INC X ;MOV A,72H ;mov a,72h ;十位ACALL SHOW_LINE2INC X ;inc XMOV A, 71H ;mov a,71h ;个位ACALL SHOW_LINE2INC X ;inc XMOV A,#'.'MOV B,XACALL LCDP2MOV A,70H ;h ;加载小数点位INC X ;设置位置ACALL SHOW_LINE2 ;显示数据RET;------显示第二行------SHOW_LINE2: ;在LCD 的第二行显示数字ADD A,#30HMOV B,XACALL LCDP2RET;-----------------------LCDP2: ;在LCD的第二行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址ACALL WR_COMM ;写入命令POP ACC ;由堆栈取出AACALL WR_DATA ;写入数据RET;------写指令程序-----WR_COMM: ;以8位控制方式将命令写至LCD MOV P1,A ;写入命令CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR RWSETB EACALL DELAY1CLR ERET;----------写数据程序--------------WR_DATA: ;以8位控制方式将数据写至LCD MOV P1,A ;写入数据SETB RSCLR RWSETB ECALL DECLR ECALL DERET;----------清除LCD 的字符-------------CLR_LINE: ;清除该行LCD 的字符MOV R0,#24CL1: MOV A,#' 'ACALL WR_DA TADJNZ R0,CL1RET;--------------CLR_LINE1: ;清除LCD的第一行字符MOV A,#80H ;设置LCD 的第一行地址ACALL WR_COMM ;MOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDCALL WR_DATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;-------------鸣响子程序------------SPK_BZ:MOV R6,#100BZ2: ACALL DEX1CPL SPKDJNZ R6,BZ2MOV R5,#10ACALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;-------------延时子程序-------------DELAY: ;(R5)*延时10MSMOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: ;延时5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETDE:MOV R7,#250DJNZ R7,$RET;---------------------------END。

相关主题