基于51单片机Ds18B20温度采集LCD显示汇编程序.docx
- 文档编号:12918655
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:26
- 大小:20.17KB
基于51单片机Ds18B20温度采集LCD显示汇编程序.docx
《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx(26页珍藏版)》请在冰豆网上搜索。
基于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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 Ds18B20 温度 采集 LCD 显示 汇编程序
![提示](https://static.bdocx.com/images/bang_tan.gif)