基于51单片机Ds18B20温度采集LCD显示汇编程序.docx
《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx(26页珍藏版)》请在冰点文库上搜索。
![基于51单片机Ds18B20温度采集LCD显示汇编程序.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/674bb623-2175-4d0b-8a73-f4116bcc41b0/674bb623-2175-4d0b-8a73-f4116bcc41b01.gif)
基于51单片机Ds18B20温度采集LCD显示汇编程序
TEMP_ZHEQU24H;实测温度值存放单元
TEMPLEQU25H
TEMPHEQU26H
TEMP_THEQU27H;高温报警值存放单元
TEMP_TLEQU28H;低温报警值存放单元
TEMPHCEQU29H;正、负温度值标记
TEMPLCEQU2AH
TEMPFCEQU2BH
K1EQUP1.4;查询按键
K2EQUP1.5;设置/调整键
K3EQUP1.6;调整键
K4EQUP1.7;确定键
BEEPEQUP3.7;蜂鸣器
RELAYEQUP1.3;指示灯
LCD_XEQU2FH;LCD字符显示位置
LCD_RSEQUP2.0;LCD寄存器选择信号
LCD_RWEQUP2.1;LCD读写信号
LCD_ENEQUP2.2;LCD允许信号
FLAG1EQU20H.0;DS18B20是否存在标志
KEY_UDEQU20H.1;设定按键的增、减标志
DQEQUP3.3;DS18B20数据信号
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H;将20H~2FH单元清零
MOVR1,#10H
CLEAR:
MOV@R0,A
INCR0
DJNZR1,CLEAR
LCALLSET_LCD
LCALLRE_18B20
START:
LCALLRST;调用18B20复位子程序
JNBFLAG1,START1;DS1820不存在
LCALLMENU_OK;DS1820存在,调用显示正确信息子程序
MOVTEMP_TH,#055H;设置TH初值85度
MOVTEMP_TL,#019H;设置TL初值25度
LCALLRE_18B20A;调用暂存器操作子程序
LCALLWRITE_E2;写入DS18B20
LCALLTEMP_BJ;显示温度标记
JMPSTART2
START1:
LCALLMENU_ERROR;调用显示出错信息子程序
LCALLTEMP_BJ;显示温度标记
SJMP$
START2:
LCALLRST;调用DS18B20复位子程序
JNBFLAG1,START1;DS18B20不存在
MOVA,#0CCH;跳过ROM匹配命令
LCALLWRITE
MOVA,#44H;温度转换命令
LCALLWRITE
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0BEH;读温度命令
LCALLWRITE
LCALLREAD;调用DS18B20数据读取操作子程序
LCALLCONVTEMP;调用温度数据BCD码处理子程序
LCALLDISPBCD;调用温度数据显示子程序
LCALLCONV;调用LCD显示处理子程序
LCALLTEMP_COMP;调用实测温度值与设定温度值比较子程序
LCALLPROC_KEY;调用键扫描子程序
SJMPSTART2;循环
;***************************键扫描子程序*****************************
PROC_KEY:
JBK1,PROC_K1
LCALLBEEP_BL
JNBK1,$
MOVDPTR,#M_ALAX1
MOVA,#1
LCALLLCD_PRINT
LCALLLOOK_ALARM
JBK3,$
LCALLBEEP_BL
JMPPROC_K2
PROC_K1:
JBK2,PROC_END
LCALLBEEP_BL
JNBK2,$
MOVDPTR,#RST_A1
MOVA,#1
LCALLLCD_PRINT
LCALLSET_ALARM
LCALLRE_18B20;将设定的TH,TL值写入DS18B20
LCALLWRITE_E2
PROC_K2:
LCALLMENU_OK
LCALLTEMP_BJ
PROC_END:
RET
;***************************设定温度报警值TH、TL***************************
SET_ALARM:
LCALLLOOK_ALARM
AS0:
JBK1,AS00
LCALLBEEP_BL
JNBK1,$
CPL20H.1;UP/DOWN标记
AS00:
JB20H.1,ASZ01;20H.1=1,增加
JMPASJ01;20H.1=0,减小
ASZ01:
JBK2,ASZ02;TH值调整(增加)
LCALLBEEP_BL
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,ASZ011
MOVTEMP_TH,#0
ASZ011:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPASZ01
ASZ02:
JBK3,ASZ03;TL值调整(增加)
LCALLBEEP_BL
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#99,ASZ021
MOVTEMP_TL,#00H
ASZ021:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPASZ02
ASZ03:
JBK4,AS0;确定调整
LCALLBEEP_BL
JNBK4,$
RET
ASJ01:
JBK2,ASJ02;TH值调整(减少)
LCALLBEEP_BL
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,ASJ011
JMPASJ022
ASJ011:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPAS0
ASJ02:
JBK3,ASJ03;TL值调整(减少)
LCALLBEEP_BL
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#0FFH,ASJ021
JMPASJ022
ASJ021:
LCALLLOOK_ALARM;
MOVR5,#10
LCALLDELAY
JMPAS0
ASJ022:
CPL20H.1
JMPASZ01
ASJ03:
JMPASZ03
RET
RST_A1:
DB"SETALERTCODE",0
;***********************实测温度值与设定温度值比较子程序**********************
TEMP_COMP:
MOVA,TEMP_TH
SUBBA,TEMP_ZH;减数>被减数,则
JCCHULI1;借位标志位C=1,转
MOVA,TEMPFC
CJNEA,#0BH,COMP
SJMPCHULI2
COMP:
MOVA,TEMP_ZH
SUBBA,TEMP_TL;减数>被减数,则
JCCHULI2;借位标志位C=1,转
MOVDPTR,#BJ5
LCALLTEMP_BJ3
CLRRELAY;点亮指示灯
RET
CHULI1:
MOVDPTR,#BJ3
LCALLTEMP_BJ3
SETBRELAY;熄灭指示灯
LCALLBEEP_BL;蜂鸣器响
RET
CHULI2:
MOVDPTR,#BJ4
LCALLTEMP_BJ3
SETBRELAY;熄灭指示灯
LCALLBEEP_BL;蜂鸣器响
RET
;-----------------------------------------
TEMP_BJ3:
MOVA,#0CEH
LCALLWCOM
MOVR1,#0
MOVR0,#2
BBJJ3:
MOVA,R1
MOVCA,@A+DPTR
LCALLWDATA
INCR1
DJNZR0,BBJJ3
RET
BJ3:
DB">H"
BJ4:
DB"BJ5:
DB"!
"
;
;****************************显示温度标记子程序***************************
TEMP_BJ:
MOVA,#0CBH
LCALLWCOM
MOVDPTR,#BJ1;指针指到显示消息
MOVR1,#0
MOVR0,#2
BBJJ1:
MOVA,R1
MOVCA,@A+DPTR
LCALLWDATA
INCR1
DJNZR0,BBJJ1
RET
BJ1:
DB00H,"C"
;********************************显示正确信息子程序***************************
MENU_OK:
MOVDPTR,#M_OK1;指针指到显示消息
MOVA,#1;显示在第一行
LCALLLCD_PRINT
MOVDPTR,#M_OK2;指针指到显示消息
MOVA,#2;显示在第一行
LCALLLCD_PRINT
RET
M_OK1:
DB"DS18B20OK",0
M_OK2:
DB"TEMP:
",0
;********************************显示出错信息子程序***************************
MENU_ERROR:
MOVDPTR,#M_ERROR1;指针指到显示消息
MOVA,#1;显示在第一行
LCALLLCD_PRINT
MOVDPTR,#M_ERROR2;指针指到显示消息1
MOVA,#2;显示在第一行
LCALLLCD_PRINT
RET
M_ERROR1:
DB"DS18B20ERROR",0
M_ERROR2:
DB"TEMP:
----",0
;****************************DS18B20复位子程序*****************************
RST:
SETBDQ
NOP
CLRDQ
MOVR0,#6BH;主机发出延时复位低脉冲
MOVR1,#04H
TSR1:
DJNZR0,$
MOVR0,#6BH
DJNZR1,TSR1
SETBDQ;拉高数据线
NOP
NOP
NOP
MOVR0,#32H
TSR2:
JNBDQ,TSR3;等待DS18B20回应
DJNZR0,TSR2
JMPTSR4;延时
TSR3:
SETBFLAG1;置1标志位,表示DS1820存在
JMPTSR5
TSR4:
CLRFLAG1;清0标志位,表示DS1820不存在
JMPTSR7
TSR5:
MOVR0,#06BH
TSR6:
DJNZR0,$;时序要求延时一段时间
TSR7:
SETBDQ
RET
;************************DS18B20暂存器操作子程序***************************
RE_18B20:
JBFLAG1,RE_18B20A
RET
RE_18B20A:
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
WR_SCRAPD:
MOVA,#4EH;写暂器
LCALLWRITE
MOVA,TEMP_TH;TH(报警上限)
LCALLWRITE
MOVA,TEMP_TL;TL(报警下限)
LCALLWRITE
MOVA,#7FH;12位精度
LCALLWRITE
RET
;************************复制暂存器子程序*******************************
WRITE_E2:
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#48H;把暂存器里的温度报警值拷贝到EEROM
LCALLWRITE
RET
;***********************重读EEROM子程序********************************
READ_E2:
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0B8H;把EEROM里的温度报警值拷贝回暂存器
LCALLWRITE
RET
;************************将自定义字符写入LCD的CGRAM中*********************
STORE_DATA:
MOVA,#40H
LCALLWCOM
MOVR2,#08H
MOVDPTR,#D_DATA
MOVR3,#00H
S_DATA:
MOVA,R3
MOVCA,@A+DPTR
LCALLWDATA;写入数据
INCR3
DJNZR2,S_DATA
RET
D_DATA:
DB0CH,12H,12H,0CH,00H,00H,00H,00H
;***********************DS18B20数据写入操作子程序************************
WRITE:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRDQ;开始写入DS18B20总线要处于复位(低)状态
MOVR3,#07
DJNZR3,$;总线复位保持16微妙以上
RRCA;把一个字节DATA分成8个BIT环移给C
MOVDQ,C;写入一位
MOVR3,#3CH
DJNZR3,$;等待100微妙
SETBDQ;重新释放总线
NOP
DJNZR2,WR1;写入下一位
SETBDQ
RET
;**********************DS18B20数据读取操作子程序**************************
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总线读得一位
MOVR3,#3CH
DJNZR3,$;等待100微妙
RRCA;把读得的位值环移给A
DJNZR2,RE01;读下一位
MOV@R1,A
INCR1
DJNZR4,RE00
RET
;************************温度值BCD码处理子程序*************************
CONVTEMP:
MOVA,TEMPH;判温度是否零下
ANLA,#08H
JZTEMPC1;温度零上转
CLRC
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
MOVTEMPHC,#0BH;负温度标志
MOVTEMPFC,#0BH
SJMPTEMPC11
TEMPC1:
MOVTEMPHC,#0AH;正温度标志
MOVTEMPFC,#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
DIVAB
MOVR4,A
MOVA,#0AH
XCHA,B
DIVAB
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;显示在第二行
LCALLLCD_PRINT
MOVA,#0C6H
LCALLTEMP_BJ1
MOVA,TEMP_TH;加载TH数据
MOVLCD_X,#3;设置显示位置
LCALLSHOW_DIG2H;显示数据
MOVA,#0CEH
LCALLTEMP_BJ1
MOVA,TEMP_TL;加载TL数据
MOVLCD_X,#12;设置显示位置
LCALLSHOW_DIG2L;显示数据
RET
M_ALAX1:
DB"LOOKALERTCODE",0
M_ALAX2:
DB"TH:
TL:
",0
TEMP_BJ1:
LCALLWCOM
MOVDPTR,#BJ2;指针指到显示信息区
MOVR1,#0
MOVR0,#2
BBJJ2:
MOVA,R1
MOVCA,@A+DPTR
LCALLWDATA
INCR1
DJNZR0,BBJJ2
RET
BJ2:
DB00H,"C"
;**************************LCD显示子程序**********************************
SHOW_DIG2H:
MOVB,#100
DIVAB
ADDA,#30H
PUSHB
MOVB,LCD_X
LCALLLCDP2
POPB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
INCLCD_X
PUSHB
MOVB,LCD_X
LCALLLCDP2
POPB
INCLCD_X
MOVA,B
MOVB,LCD_X
ADDA,#30H
LCALLLCDP2
RET
SHOW_DIG2L:
MOVB,#100
DIVAB
MOVA,#0AH
XCHA,B
DIVAB
ADDA,#30H
PUSHB
MOVB,LCD_X
LCALLLCDP2
POPB
INCLCD_X
MOVA,B
MOVB,LCD_X
ADDA,#30H
LCALLLCDP2
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;百位
DISPBCD2:
RET
;***************************LCD显示数据处理子程序*************************
CONV:
MOVA,73H;加载百位数据
MOVLCD_X,#6;设置位置
CJNEA,#1,CONV1
JMPCONV2
CONV1:
CJNEA,#0BH,CONV11
MOVA,#"-";"-"号显示
JMPCONV111
CONV11:
MOVA,#"";"+"号不显示
CONV111:
MOVB,LCD_X
LCALLLCDP2
JMPCONV3
CONV2:
LCALLSHOW_DIG2;显示数据
CONV3:
INCLCD_X
MOVA,72H;十位
LCALLSHOW_D