DS18B20温度控制lcd1602显示程序
扫描二维码
随时随地手机看文章
* ;* DS18B20的管脚定义:1、GND2、DQ3、VCC*
;温度显示用四位,当温度>=100度时,第四位才显示。*
;检测DS18B20状态:*
;DS18B20正常显示:DS18B20OKTEMP:25.8℃←显示实际温*
;DS18B20不正常显示:DS18B20ERRORTEMP:----℃←显示----*
;一、查看温度报警值:*
;K1→进入查看温度报警值状态。*
;LCD1602显示:LOOKALERTCODETH:028℃TL:18℃TH:028高位报警值*
;TL:18低位报警值K3→退出查看温度报警值状态。*
;二、设定温度报警值:*
;K2→进入设定温度报警值状态?*
;LCD1602显示:RESETALERTCODETH:028℃TL:18℃*
;K1:设定值加(UP)、减(DOWN)方式选择键(默认为减少)K2:TH值设定键*
;K3:TL值设定键K4:确定键(退出设定状态)*
;K2或K3以减(DOWN)方式设定,当设定数值减到“0”时自动转换为加(UP)方*
;K2或K3以加(UP)方式设定,当设定数值TH=120、TL=99时,设定数值均变为“0”*
;K4→确定并退出设定温度报警值状态。*
;将设定的温度报警值自动存入DS18B20的EEROM中,可永久保存。*
;每次开机时自动从DS18B20的EEROM读出温度报警值。*
;三、报警状态的显示:*
;1、当实际温度大于TH的设定值时,*
;LCD1602显示:DS18B20OKTEMP:88.8℃>H关闭继电器,蜂鸣器响,表示超温*
;2、当实际温度小于TL的设定值时,LCD1602显示:*
;DS18B20OKTEMP:18.8℃
;加热标记为“!”*
;*资源:继电器p1.0喇叭p3.718b20p3.3按键k1-k4p1.4-p1.71602液晶*
TEMP_ZHDATA24H;实时温度值存放单元
TEMPLDATA25H;
TEMPHDATA26H;
TEMP_THDATA27H;高温报警值存放单元
TEMP_TLDATA28H;低温报警值存放单元
TEMPHCDATA29H;
TEMPLCDATA2AH
K1EQUP1.4
K2EQUP1.5
K3EQUP1.6
K4EQUP1.7
BEEPEQUP3.7
RELAYEQUP1.0
LCD_XEQU2FH;LCD地址变量
LCD_RSEQUP2.0
LCD_RWEQUP2.1
LCD_ENEQUP2.2
flag1equ20H.0;DS18B20是否存在标记
KEY_UDEQU20H.1;设定KEY的UP与DOWN标记
date_lineequp3.3
;=====================================================
ORG0000H
JMPMAIN
MAIN:MOVSP,#60H
MOVA,#00H
MOVR0,#20H;将20H-2FH单元清零
MOVR1,#10H
CLEAR:MOV@R0,A
INCR0
DJNZR1,CLEAR
CALLSET_LCD
CALLRE_18B20
start:CALLRESET;18B20复位子程序
JNBFLAG1,START1;DS1820不存在
CALLMENU_OK
CALLREAD_E2
CALLTEMP_BJ;显示温度标记
JMPSTART2
START1:CALLMENU_ERROR
CALLTEMP_BJ;显示温度标记
JMP$
START2:
CALLRESET
JNBFLAG1,START1;DS1820不存在
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#44H;发出温度转换命令
CALLWRITE
CALLRESET
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#0BEH;发出读温度命令
CALLWRITE
CALLREAD
callCONVTEMP
CallDISPBCD
CALLCONV
CALLTEMP_COMP
CALLPROC_KEY;键扫描
SJMPSTART2
;-----------------------------------------------------
PROC_KEY:
JBK1,PROC_K1;按键K1处理
CALLBEEP_BL
JNBK1,$
MOVDPTR,#M_ALAX1
MOVA,#1
CALLLCD_PRINT
CALLLOOK_ALARM
JBK3,$
CALLBEEP_BL
JMPPROC_K2
PROC_K1:;按键K2处理
JBK2,PROC_END
CALLBEEP_BL
JNBK2,$
MOVDPTR,#RESET_A1
MOVA,#1
CALLLCD_PRINT
CALLSET_ALARM
CALLRE_18B20;将设定的TH,TL值写入DS18B20内
CALLWRITE_E2
PROC_K2:
CALLMENU_OK
CALLTEMP_BJ
PROC_END:
RET
;============================================
;设定报警值TH、TL
;============================================
SET_ALARM:
;CALLRESET_ALARM
CALLLOOK_ALARM
AS0:
JBK1,AS00
CALLBEEP_BL
JNBK1,$
CPL20H.1;UP/DOWN标记
AS00:JB20H.1,ASZ01;20H.1=1,UP
JMPASJ01;20H.1=0,DOWN
ASZ01:JBK2,ASZ02;TH值调整(增加)
CALLBEEP_BL
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,ASZ011
MOVTEMP_TH,#0
ASZ011:CALLLOOK_ALARM
MOVR5,#10
CALLDELAY
JMPASZ01
ASZ02:JBK3,ASZ03;TL值调整(增加)
CALLBEEP_BL
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#99,ASZ021
MOVTEMP_TL,#00H
ASZ021:CALLLOOK_ALARM;
MOVR5,#10
CALLDELAY
JMPASZ02
ASZ03:JBK4,AS0;确定调整OK
CALLBEEP_BL
JNBK4,$
RET
ASJ01:
JBK2,ASJ02;TH值调整(减少)
CALLBEEP_BL
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,ASJ011
JMPASJ022
ASJ011:CALLLOOK_ALARM
MOVR5,#10
CALLDELAY
JMPAS0
ASJ02:JBK3,ASJ03;TL值调整(减少)
CALLBEEP_BL
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#0FFH,ASJ021
JMPASJ022
ASJ021:CALLLOOK_ALARM;
MOVR5,#10
CALLDELAY
JMPAS0
ASJ022:CPL20H.1
JMPASZ01
ASJ03:JMPASZ03
RET
RESET_ALARM:
MOVDPTR,#RESET_A1;指针指到显示信息区
MOVA,#1;显示在第一行
CALLLCD_PRINT
RET
RESET_A1:
DB"RESETALERTCODE"
;====================================================
;实际温度值与标记温度值比较子程序
;====================================================
TEMP_COMP:
MOVA,TEMP_TH
SUBBA,TEMP_ZH;减数>被减数,则
JCCHULI1;借位标志位C=1,转
MOVA,TEMP_ZH
SUBBA,TEMP_TL;减数>被减数,则
JCCHULI2;借位标志位C=1,转
MOVDPTR,#BJ5
CALLTEMP_BJ3
CLRRELAY;继电器吸合
RET
CHULI1:
MOVDPTR,#BJ3
CALLTEMP_BJ3
SETBRELAY;继电器关闭
CALLBEEP_BL
RET
CHULI2:
MOVDPTR,#BJ4
CALLTEMP_BJ3
CALLBEEP_BL
RET
;-----------------------------------------
TEMP_BJ3:
MOVA,#0CEH
CALLWCOM
MOVR1,#0
MOVR0,#2
BBJJ3:MOVA,R1
MOVCA,@A+DPTR
CALLWDATA
INCR1
DJNZR0,BBJJ3
RET
BJ3:
DB">H"
BJ4:
DB"
DB"!"
;==================================================
;显示温度标记子程序
;==================================================
TEMP_BJ:
MOVA,#0CBH
CALLWCOM
MOVDPTR,#BJ1;指针指到显示消息
MOVR1,#0
MOVR0,#2
BBJJ1:MOVA,R1
MOVCA,@A+DPTR
CALLWDATA
INCR1
DJNZR0,BBJJ1
RET
BJ1:
DB00H,"C"
;=================================================
MENU_OK:
MOVDPTR,#M_OK1;指针指到显示消息
MOVA,#1;显示在第一行
CALLLCD_PRINT
MOVDPTR,#M_OK2;指针指到显示消息
MOVA,#2;显示在第一行
CALLLCD_PRINT
RET
M_OK1:
DB"DS18B20OK",0
M_OK2:
DB"TEMP:",0
;-----------------------------------------------
MENU_ERROR:
MOVDPTR,#M_ERROR1;指针指到显示消息1
MOVA,#1;显示在第一行
CALLLCD_PRINT
MOVDPTR,#M_ERROR2;指针指到显示消息1
MOVA,#2;显示在第一行
CALLLCD_PRINT
RET
M_ERROR1:
DB"DS18B20ERROR",0
M_ERROR2:
DB"TEMP:----",0
;====================================================
reset:setbdate_line
nop
clrdate_line
MOVr0,#6bh;主机发出延时复位低脉冲
MOVr1,#04h
tsr1:djnzr0,$
MOVr0,#6bh
djnzr1,tsr1
setbdate_line;然后拉高数据线
nop
nop
nop
MOVr0,#32h
tsr2:jnbdate_line,tsr3;等待DS18B20回应
djnzr0,tsr2
jmptsr4;延时
tsr3:setbflag1;置标志位,表示DS1820存在
jmptsr5
tsr4:clrflag1;清标志位,表示DS1820不存在
jmptsr7
tsr5:MOVr0,#06bh
tsr6:djnzr0,$;时序要求延时一段时间
tsr7:setbdate_line
ret
;=======================================================
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
;--------------------------------------------------------------
;将自定义字符写入LCD1602的CGRAM中
;--------------------------------------------------------------
STORE_DATA:
MOVA,#40H
CALLWCOM
MOVR2,#08H
MOVDPTR,#D_DATA
MOVR3,#00H
S_DATA:
MOVA,R3
MOVCA,@A+DPTR
CALLWDATA;写入数据
INCR3
DJNZR2,S_DATA
RET
D_DATA:
DB0CH,12H,12H,0CH,00H,00H,00H,00H
;==============================================================
write:MOVr2,#8;一共8位数据
CLRC
wr1:
clrdate_line;开始写入DS18B20总线要处于复位(低)状态
MOVr3,#07
djnzr3,$;总线复位保持16微妙以上
rrca;把一个字节DATA分成8个BIT环移给C
MOVdate_line,c;写入一个BIT
MOVr3,#3CH
djnzr3,$;等待100微妙
setbdate_line;重新释放总线
nop
djnzr2,wr1;写入下一个BIT
setbdate_line
ret
;--------------------------------------------------------------------
read:MOVr4,#4;将温度低位、高位、TH、TL从DS18B20中读出
MOVr1,#TEMPL;存入25H、26H、27H、28H
re00:MOVr2,#8
re01:clrcy
setbdate_line
nop
nop
clrdate_line;读前总线保持为低
nop
nop
nop
setbdate_line;开始读总线释放
MOVr3,#09;延时18微妙
djnzr3,$
MOVc,date_line;从DS18B20总线读得一个BIT
MOVr3,#3CH
djnzr3,$;等待100微妙
rrca;把读得的位值环移给A
djnzr2,re01;读下一个BIT
MOV@r1,a
incr1
djnzr4,re00
ret
;*****************************************************
;处理温度BCD码子程序
;****************************************************
CONVTEMP:MOVA,TEMPH;判温度是否零下
ANLA,#80H
JZTEMPC1;温度零上转
CLRC
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
SJMPTEMPC11
TEMPC1:MOVTEMPHC,#0AH;+
TEMPC11:MOVA,TEMPHC
SWAPA
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;乘0.0625
MOVDPTR,#TEMPDOTTAB
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
JZTEMPC12
ANLA,#0FH
SWAPA
MOVR4,A
MOVA,TEMPHC;TEMPHCHI=百位数BCD
ANLA,#0FH
ORLA,R4
MOVTEMPHC,A
TEMPC12:RET
;---------------------------------------------------------------
HEX2BCD1:
MOVB,#064H;十六进制->BCD
DIVAB;B=A%100
MOVR4,A;R7=百位数
MOVA,#0AH
XCHA,B
DIVAB;B=A%B
SWAPA
ORLA,B
RET
;-------------------------------------------------------------
;小数部分码表
;-------------------------------------------------------------
TEMPDOTTAB:
DB00H,00H,01H,01H,02H,03H,03H,04H
DB05H,05H,06H,06H,07H,08H,08H,09H
;=====================================================
LOOK_ALARM:
MOVDPTR,#M_ALAX2;指针指到显示信息区
MOVA,#2;显示在第二行
CALLLCD_PRINT
MOVA,#0C6H
CALLTEMP_BJ1
MOVA,TEMP_TH;加载TH数据
MOVLCD_X,#3;设置位置
CALLSHOW_DIG2H;显示数据
MOVA,#0CEH
CALLTEMP_BJ1
MOVA,TEMP_TL;加载TL数据
MOVLCD_X,#12;设置位置
CALLSHOW_DIG2L;显示数据
RET
;--------------------------------------------
M_ALAX1:
DB"LOOKALERTCODE",0
M_ALAX2:
DB"TH:TL:",0
;--------------------------------------------
TEMP_BJ1:
CALLWCOM
MOVDPTR,#BJ2;指针指到显示信息区
MOVR1,#0
MOVR0,#2
BBJJ2:MOVA,R1
MOVCA,@A+DPTR
CALLWDATA
INCR1
DJNZR0,BBJJ2
RET
BJ2:
DB00H,"C"
;---------------------------------------------------
SHOW_DIG2H:;在LCD的第二行显示数字
MOVB,#100
DIVAB
ADDA,#30H
PUSHB
MOVB,LCD_X
CALLLCDP2
POPB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
INCLCD_X
PUSHB
MOVB,LCD_X
CALLLCDP2
POPB
INCLCD_X
MOVA,B
MOVB,LCD_X
ADDA,#30H
CALLLCDP2
RET
SHOW_DIG2L:;在LCD的第二行显示数字
MOVB,#100
DIVAB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
PUSHB
MOVB,LCD_X
CALLLCDP2
POPB
INCLCD_X
MOVA,B
MOVB,LCD_X
ADDA,#30H
CALLLCDP2
RET
;-------------------------------------------------------------
;显示区BCD码温度值刷新子程序
;-------------------------------------------------------------
DISPBCD:
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,DISPBCD0
SJMPDISPBCD2
DISPBCD0:MOVA,TEMPHC
ANLA,#0FH
JNZDISPBCD2;十位数是0
MOVA,TEMPHC
SWAPA
ANLA,#0FH
MOV73H,#0AH;符号位不显示
MOV72H,A;十位数显示符号
DISPBCD2:RET
;==========================================================
;LCD1602显示子程序
;==========================================================
CONV:
MOVA,73H;加载百位数据
MOVLCD_X,#6;设置位置
CJNEA,#1,CONV1
JMPCONV2
CONV1:MOVA,#""
MOVB,LCD_X
CALLLCDP2
JMPCONV3
CONV2:CALLSHOW_DIG2;显示数据
CONV3:INCLCD_X;
MOVa,72h;十位
CALLSHOW_DIG2
incLCD_X
MOVa,71h;个位
CALLSHOW_DIG2
incLCD_X
MOVA,#’.’
MOVB,LCD_X
CALLLCDP2
MOVA,70h;加载小数点位
INCLCD_X;设置位置
CALLSHOW_DIG2;显示数据
RET
;-------------------------------------------------------
SHOW_DIG2:;在LCD的第二行显示数字
ADDA,#30H
MOVB,LCD_X
CALLLCDP2
RET
;---------------------------------------------------------
LCDP2:;在LCD的第二行显示字符
PUSHACC;
MOVA,B;设置显示地址
ADDA,#0C0H;设置LCD的第二行地址
CALLWCOM;写入命令
POPACC;由堆栈取出A
CALLWDATA;写入数据
RET
;---------------------------------------------------------
SET_LCD:;对LCD做初始化设置及测试
CLRLCD_EN
CALLINIT_LCD;初始化LCD
CALLSTORE_DATA;将自定义字符存入LCD的CGRAM
RET
INIT_LCD:;8位I/O控制LCD接口初始化
MOVA,#38H;双列显示,字形5*7点阵
CALLWCOM
calldelay1
MOVA,#38H
CALLWCOM
calldelay1
MOVA,#38H
CALLWCOM
calldelay1
MOVA,#0CH;开显示,显示光标,光标不闪烁
CALLWCOM
calldelay1
MOVA,#01H;清除LCD显示屏
CALLWCOM
calldelay1
RET
;==================================================
CLR_LINE1:;清除LCD的第一行字符
MOVA,#80H;设置LCD的第一行地址
CALLWCOM;
MOVR0,#24;设置计数值
C1:MOVA,#’’;载入空格符至LCD
CALLWDATA;输出字符至LCD
DJNZR0,C1;计数结束
RET
;==================================================
LCD_PRINT:;在LCD的第一行或第二行显示字符
CJNEA,#1,LINE2;判断是否为第一行
LINE1:MOVA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
MOVA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
JMPFILL
LINE2:MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM;写入命令
CALLCLR_LINE;清除该行字符数据
MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM
FILL:CLRA;填入字符
MOVCA,@A+DPTR;由消息区取出字符
CJNEA,#0,LC1;判断是否为结束码
RET
LC1:CALLWDATA;写入数据
INCDPTR;指针加1
JMPFILL;继续填入字符
RET
;=========================================
CLR_LINE:;清除该行LCD的字符
MOVR0,#24
CL1:MOVA,#’’
CALLWDATA
DJNZR0,CL1
RET
DE:MOVR7,#250
DJNZR7,$
RET
;============================================
WCOM:;以8位控制方式将命令写至LCD
MOVP0,A;写入命令
CLRLCD_RS;RS=L,RW=L,D0-D7=指令码,E=高脉冲
CLRLCD_RW
SETBLCD_EN
ACALLDELAY1
CLRLCD_EN
RET
;=============================================
WDATA:;以8位控制方式将数据写至LCD
MOVP0,A;写入数据
SETBLCD_RS
CLRLCD_RW
SETBLCD_EN
CALLDE
CLRLCD_EN
CALLDE
RET
;=============================================
;PRINTACHARONLINE1
;A=ASCDATA,B=LINEXPOS
;==============================================
LCDP1:;在LCD的第一行显示字符
PUSHACC;
MOVA,B;设置显示地址
ADDA,#80H;设置LCD的第一行地址
CALLWCOM;写入命令
POPACC;由堆栈取出A
CALLWDATA;写入数据
RET
;==============================================
BEEP_BL:
MOVR6,#100
BL2:CALLDEX1
CPLBEEP
DJNZR6,BL2
MOVR5,#10
CALLDELAY
RET
DEX1:MOVR7,#180
DE2:NOP
DJNZR7,DE2
RET
DELAY:;(R5)*延时10MS
MOVR6,#50
DL1:MOVR7,#100
DJNZR7,$
DJNZR6,DL1
DJNZR5,DELAY
RET
DELAY1:;延时5MS
MOVR6,#25
DL2:MOVR7,#100
DJNZR7,$
DJNZR6,DL2
RET
;================================================
END