18b20+1602LCD测温实验汇编.docx
《18b20+1602LCD测温实验汇编.docx》由会员分享,可在线阅读,更多相关《18b20+1602LCD测温实验汇编.docx(24页珍藏版)》请在冰点文库上搜索。
18b20+1602LCD测温实验汇编
ORG00H
JMPINPORT
ORG0BH
;JMPTM0
ORG30H
INPORT:
TMP_HEQU29H;温度高字节
TMP_LEQU28H
RSEQUP3.0;确定具体硬件的连接方式
RWEQUP3.1;确定具体硬件的连接方式
EEQUP3.2;确定具体硬件的连接方式
KEY_SETEQUP1.1
KEY_UPEQUP1.0
KEY_DOWNEQUP1.2
DS18B20_FLAGEQU70h
SET_FLAGEQU01H
FLASH_FLAGEQU02H
K_ONEQU03H
MOV25H,#0FFH;位00h-07h全部置1
MOVR4,#14
MOVTMOD,#01H
MOVTL0,#0B0H
MOVTH0,#3CH
MOVIE,#10000010B;(8:
总控,2:
定时0溢出中断控制位)
LCD_INIT:
;15MS
MOVR6,#30
CALLDELAY_BY_R6;15ms
MOVP0,#38H;写38h
ACALLWRITE_NOT_CHECK_BUSY
MOVR6,#10
CALLDELAY_BY_R6;5ms
MOVP0,#38H
ACALLWRITE_NOT_CHECK_BUSY
MOVR6,#10
CALLDELAY_BY_R6;5ms
;-----设转初始值
SETBE
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
MOVP0,#00111000B;8位2行5x7点阵
ACALLENABLE;调用写入命令子程序
MOVP0,#00001110B;显示器开、光标开、光标允许闪烁
ACALLENABLE;调用写入命令子程序
MOVP0,#00000110B;文字不动,光标自动右移
ACALLENABLE;调用写入命令子程序
STORE_DEFINE_DATA:
;把自定义字符存入CGRAM
MOVP0,#40H;CGRAM起始地址
ACALLENABLE
MOVR2,#8
MOVDPTR,#DEFINE_DATA
MOVR3,#0
NEXTP:
MOVA,R3
MOVCA,@A+DPTR
MOVP0,A
CALLWRITE_DATA_TO_LCD
INCR3
DJNZR2,NEXTP
;****************主程序*******************
START:
CALLRESET
JNB70h,MAIN1
MOVP0,#0C0H;写入显示起始地址(第二行第一个位置)
ACALLENABLE;调用写入命令子程序
DS18B20_NOT_READY:
CALLDISPLAY_18B20_ERROR
LOOP1:
CALLRESET
JNB70h,MAIN1
JMPLOOP1;如果栓测不到18b20程序下面不执行
MAIN1:
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
CALLDISPLAY_WATING;等待第一次结果.
CALLSKIP_ROM
CALLTEMP_CONV
CALLDELAY_600MS
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
MAIN:
CALLRESET
CALLSKIP_ROM
CALLRECALL_EPROM;调入温度限值.
MAIN_MAIN:
CALLREAD_TEMP;读18b20的内部温度
JB70h,DS18B20_NOT_READY;中途失败!
CALLDATA_CONV;数据转换
CALLDISPLAY_18B20_TEMP
CALLDISPLAY_18B20_TEMP_XZ;显示限值.
CALLCONTROL
JNBKEY_SET,S1
JMPMAIN_MAIN
CONTROL:
JNB03H,CONTROL1
LCALLDISPLAY_OFF
AJMPCONTROL_END
CONTROL1:
LCALLDISPLAY_ON
CONTROL_END:
RET
S1:
LCALLDELAY_2MS;延时消抖
JBKEY_SET,MAIN
JNBKEY_SET,$
LCALLKEY;有键输入
AJMPMAIN
;***************键处理程序******************
KEY:
SETB01H
KEY_IN:
;有键输入的程序
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
JNB01H,DSP_SET_L;01如果是0,则显示L:
DSP_SET_H:
;显示高温的限值
MOVP0,#10000000B
ACALLDISPLAY_SETING_TEMP_H;显示SETING_TEMP:
H..
MOVDPTR,#LED_DATA
MOVR1,42H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度限值低位
MOVDPTR,#LED_DATA
MOVR1,41H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度限值低位
MOVDPTR,#LED_DATA
MOVR1,40H;码表初值
MOVR0,#1;字数
CALLDISPLAY
AJMPKEY_SELECT
DSP_SET_L:
;显示低温的限值
MOVP0,#10000000B
ACALLDISPLAY_SETING_TEMP_L;显示SETING_TEMP:
L..
MOVDPTR,#LED_DATA
MOVR1,45H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度限值低位
MOVDPTR,#LED_DATA
MOVR1,44H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度限值低位
MOVDPTR,#LED_DATA
MOVR1,43H;码表初值
MOVR0,#1;字数
CALLDISPLAY
AJMPKEY_SELECT
KEY_SELECT:
JNBKEY_SET,K_SET
JNBKEY_UP,K_UP
JNBKEY_DOWN,K_DOWN
AJMPKEY_SELECT
K_SET:
LCALLDELAY_2MS
lcalldelay_2ms
lcalldelay_2ms
JBKEY_SET,KEY_SELECT
MOVR5,#250
KSET_LOOP:
JBKEY_SET,KEY_CPL
LCALLDELAY_2MS
LCALLDELAY_2MS
DJNZR5,KSET_LOOP
AJMPEXT_KEY
K_UP:
LCALLDELAY_2MS
lcalldelay_2ms
JBKEY_UP,KEY_SELECT
JNB01H,K_UP_LOW
K_UP_HIGH:
JNBKEY_UP,$
MOVA,2AH
INCA
MOV2AH,A
JMPK_UP_DOWN_END
K_UP_LOW:
JNBKEY_UP,$
MOVA,2BH
INCA
MOV2BH,A
JMPK_UP_DOWN_END
;*********************
K_DOWN:
LCALLDELAY_2MS
JBKEY_DOWN,KEY_SELECT
JNB01H,K_DOWN_LOW
K_DOWN_HIGH:
JNBKEY_DOWN,$
MOVA,2AH
DECA
MOV2AH,A
JMPK_UP_DOWN_END
K_DOWN_LOW:
JNBKEY_DOWN,$
MOVA,2BH
DECA
MOV2BH,A
K_UP_DOWN_END:
MOVA,2AH
MOVB,#10
DIVAB
MOV40H,B;高温限值个位
MOVB,#10
DIVAB
MOV41H,B;十位
MOV42H,A;百位
;----------------------------
MOVA,2BH
MOVB,#10
DIVAB
MOV43H,B;低温限值位个位
MOVB,#10
DIVAB
MOV44H,B;十位
MOV45H,A;百位
AJMPKEY_IN
KEY_CPL:
CPL01H
AJMPKEY_IN
EXT_KEY:
MOVP0,#00000001B;清屏并光标复位
CALLENABLE;调用写入命令子程序
CALLDISPLAY_SAVE
CALLRESET
CALLSKIP_ROM
MOVA,#4EH
CALLWRITE
MOVA,2AH;2A数据送高温限值寄存器.
CALLWRITE
MOVA,2BH;2B数据送低温限什寄存器.
CALLWRITE
CALLRESET
CALLSKIP_ROM
MOVA,#48H;将高低温限值寄存器数据送18B20-EPROM保存.
CALLWRITE
A_END:
RET
;***************18b20指令子程序**********************
READ_TEMP:
;读1820内部温度子程序.
CALLRESET
JB70h,EXT1
CALLSKIP_ROM
CALLTEMP_CONV;温度AD变换
CALLDELAY_600MS;时........
CALLRESET
CALLSKIP_ROM
CALLTEMP_GET;发取温度的命令
CALLREAD;接收...
EXT1:
RET
SKIP_ROM:
;跳过ROM检测
MOVA,#0CCH;#0CCH为跳过rom命令
CALLWRITE
RET
RECALL_EPROM:
;重调Eprom
MOVA,#0B8H
CALLWRITE
RET
TEMP_CONV:
MOVA,#44H;AD变换
CALLWRITE
RET
TEMP_GET:
MOVA,#0BEH;读18b20命令
CALLWRITE
RET
;****************************18B20基本时序子程序*********************************
RESET:
;初始化子程序
SETBP2.7
NOP
CLRP2.7;拉低
MOVR3,#150;*4=600US
CALLDELAY_BY_R3
SETBP2.7;拉高
MOVR3,#15;60US
CALLDELAY_BY_R3
MOVR3,#60;4个周期*60=240US内检测
A1:
JNBP2.7,A2;检测到低平信号
DJNZR3,A1;如果没有应答的低电平信号,返回A1重新检测,超时后下一行,
SETB70h;DS1820不存在.
JMPA3
A2:
CLR70h
MOVR3,120;240US;等恢复时间2*120=240us
DJNZR3,$
A3:
RET
;------------------------
WRITE:
MOVR2,#8;一个字节为8位
CLRC;C位清0C位用来放A的一位数据,用移位的方法放入C
B1:
SETBP2.7
NOP
CLRP2.7
MOVR3,#4;16US
CALLDELAY_BY_R3
RRCA;把A中的数送入C
MOVP2.7,C;把C送入总线
MOVR3,#12;48US(一位数据的发送:
60usCALLDELAY_BY_R3
SETBP2.7;拉高1us结束一位
NOP
DJNZR2,B1
RET
READ:
MOVR1,#4;接收4个字节数据依次是1.低位2.高位.3.高限4.低限
MOVR0,#28H;低位放28H;高位放29h(1.28H,2.29H3.2AH4.2BH)
C0:
MOVR2,#8;一字节数据8位
C1:
CLRC;清除C
SETBP2.7
NOP
NOP
CLRP2.7;拉低.
NOP;1us秒后拉高?
SETBP2.7
MOVR3,#4;16us后采数据
CALLDELAY_BY_R3
MOVC,P2.7;读出18b20的数据
RRCA;移入A
MOVR3,#12;48US恢复时间
CALLDELAY_BY_R3
DJNZR2,C1;一个字节收完
MOV@R0,A;移入存储位
INCR0;下一位;29h
DJNZR1,C0;全部取完吗?
没有重复
RET
;*********************************************************************************
;*****************LCD_控制命令***************
DISPLAY:
MOVA,R1
MOVCA,@A+DPTR
MOVP0,A
CALLWRITE_DATA_TO_LCD
INCR1
DJNZR0,DISPLAY
RET
WRITE_NOT_CHECK_BUSY:
SETBE
NOP
NOP
CLRRS;写入控制命令的子程序
CLRRW
CLRE
RET
ENABLE:
SETBE
NOP
NOP
CLRRS;写入控制命令的子程序
CLRRW
CLRE
ACALLTEST_BUSY
SETBE
RET
TEST_BUSY:
SETBE
NOP
NOP
MOVP0,#0FFH;判断液晶显示器是否忙的子程序
CLRRS
SETBRW
CLRE
NOP
SETBE
JBP0.7,TEST_BUSY;如果P0.7为高电平表示忙就循环等待
RET
WRITE_DATA_TO_LCD:
SETBE
NOP
NOP
SETBRS;RS=1
CLRRW;RW=0;准备写入数据
CLRE;E=0;执行显示命令
ACALLTEST_BUSY;判断液晶模块是否忙?
SETBE;E=1;显示完成,程序停车
RET
;***************************数据转换***************************
DATA_CONV:
;数据转换
MOVA,28H;低字节
ANLA,#0FH;去除高位
MOVB,#6;乘6得到实际数值的100倍.
MULAB
MOVB,#10
DIVAB
MOV33H,A;小数位高
MOV32H,B;小数位低
MOVA,28H
MOVC,29H.0;29h高位的低4字节
RRCA
MOVC,29H.1
RRCA
MOVC,29H.2
RRCA
MOVC,29H.3
RRCA
MOV28H,A;重新合成.结果存在28H.
MOVA,28H
MOVB,#10
DIVAB
MOV26H,A;整数位高
MOV25H,B;整数位低
;-------------------------
MOVA,2AH
MOVB,#10
DIVAB
MOV40H,B;高温限值个位
MOVB,#10
DIVAB
MOV41H,B;十位
MOV42H,A;百位
;----------------------------
MOVA,2BH
MOVB,#10
DIVAB
MOV43H,B;低温限值位个位
MOVB,#10
DIVAB
MOV44H,B;十位
MOV45H,A;百位
CLRC
MOVA,28H;现温度值与高温限值比较
SUBBA,2AH
JCBIG;如果高.则关机器
CLRC
MOVA,2BH;现温度与低温限值比较
SUBBA,28H
JCX_BIG;低温限值比现温高,则开机器
AJMPCONVERT_END
BIG:
CLRK_ON
AJMPCONVERT_END
X_BIG:
SETBK_ON
CONVERT_END:
RET
;********************显示温度*************************
DISPLAY_18B20_TEMP:
;LCD_显示子程序
MOVP0,#10000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB3;显示'WENDU:
'
MOVR1,#0;码表初值
MOVR0,#7;字数
CALLDISPLAY
;---------------显示温度值高位
MOVDPTR,#LED_DATA
MOVR1,26H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度值低位
MOVDPTR,#LED_DATA
MOVR1,25H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示小数点
MOVDPTR,#DOT
MOVR1,#0;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度值小数高位
MOVDPTR,#LED_DATA
MOVR1,33H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度值小数低位
MOVDPTR,#LED_DATA
MOVR1,32H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示单位度
MOVDPTR,#SIGN
MOVR1,#0;码表初值
MOVR0,#2;字数
CALLDISPLAY
RET
;******************显示限值.*****************
DISPLAY_18B20_TEMP_XZ:
MOVP0,#11000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB_L;显示'L:
'
MOVR1,#0;码表初值
MOVR0,#2;字数
CALLDISPLAY
;---------------显示温度限值高位
MOVDPTR,#LED_DATA
MOVR1,45H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示温度限值低位
MOVDPTR,#LED_DATA
MOVR1,44H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;-----------------
MOVDPTR,#LED_DATA
MOVR1,43H;码表初值
MOVR0,#1;字数
CALLDISPLAY
MOVP0,#11000111B;显示位置
ACALLENABLE
;----
MOVDPTR,#TAB_H;显示'H:
'
MOVR1,#0;码表初值
MOVR0,#2;字数
CALLDISPLAY
;---------------显示高温度限值高位
MOVDPTR,#LED_DATA
MOVR1,42H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;---------------显示高温度限值低位
MOVDPTR,#LED_DATA
MOVR1,41H;码表初值
MOVR0,#1;字数
CALLDISPLAY
;-------------------
MOVDPTR,#LED_DATA
MOVR1,40H;码表初值
MOVR0,#1;字数
CALLDISPLAY
RET
;**********************提示语**********************
DISPLAY_18B20_HELLO:
MOVP0,#10000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB_HELLO
MOVR1,#0;码表初值
MOVR0,#16;字数
CALLDISPLAy
RET
/*
DISPLAY_18B20_TESTING:
MOVP1,#10000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB_TESTING
MOVR1,#0;码表初值
MOVR0,#16;字数
CALLDISPLAy
RET
*/
DISPLAY_18B20_ERROR:
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE
MOVDPTR,#TAB1
MOVR1,#0;码表初值
MOVR0,#16;字数
CALLDISPLAy
RET
DISPLAY_WATING:
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
MOVP0,#10000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB2
MOVR1,#0;码表初值
MOVR0,#13;字数
CALLDISPLAy
RET
DISPLAY_SAVE:
MOVP0,#00000001B;清屏并光标复位
ACALLENABLE;调用写入命令子程序
MOVP0,#10000000B;显示位置
ACALLENABLE;执行指令
MOVDPTR,#TAB_SAVE
MOVR1,#0;码表初值
MOVR0,#10;字数
CALLDISPLAy
RET
DISPLAY_SETING_TEMP_H:
MOVP0,#00000001B;清屏并光标复位
ACALL