基于51单片机Ds18B20温度采集LCD显示汇编程序.docx
- 文档编号:29579253
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:31
- 大小:183.41KB
基于51单片机Ds18B20温度采集LCD显示汇编程序.docx
《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机Ds18B20温度采集LCD显示汇编程序.docx(31页珍藏版)》请在冰豆网上搜索。
基于51单片机Ds18B20温度采集LCD显示汇编程序
TEMP_ZHEQU24H
TEMPLEQU25H
实测温度值存放单元
TEMPHEQU26H
TEMP_TH
EQU27H;
高温报警值存放单元
TEMP_TL
EQU28H;
低温报警值存放单元
TEMPHC
EQU29H;
正、负温度值标记
TEMPLC
EQU2AH
TEMPFC
EQU2BH
K1EQU;
查询按键
K2EQU;
设置/调整键
K3EQU;
调整键
K4EQU;
确定键
BEEPEQU;
蜂鸣器
RELAYEQU;
指示灯
LCD_XEQU2FH;LCD
字符显示位置
LCD_RSEQU
;LCD
寄存器选择信号
LCD_RWEQU
;LCD
读写信号
LCD_ENEQU
;LCD
允许信号
FLAG1EQU
;DS18B20
是否存在标志
KEY_UDEQU;设定按键的增、减标志
DQEQU;DS18B20数据信号
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H
MOVR1,#10H
CLEAR:
MOV@R0,A
INCR0
DJNZR1,CLEAR
LCALLSET_LCD
LCALLRE_18B20
START:
LCALLRST
JNBFLAG1,START1
LCALLMENU_OK信息子程序
MOVTEMP_TH,#055H
MOVTEMP_TL,#019H
LCALLRE_18B20A
LCALLWRITE_E2;
LCALLTEMP_BJ;
;将20H~2FH单元清零
;调用18B20复位子程序
;DS1820不存在
;DS1820存在,调用显示正确
;设置TH初值85度
;设置TL初值25度
;调用暂存器操作子程序
写入DS18B20
显示温度标记
JMPSTART2
START1:
LCALLMENU_ERROR
;调用显示出错信息子程序
;跳过ROME配
;读温度命令
;调用DS18B20数据读取操作
;调用温度数据BCD码处理子
;调用温度数据显示子程序
;调用LCD显示处理子程序
;调用实测温度值与设定温度
LCALLTEMP_BJSJMP$
START2:
LCALLRST
JNBFLAG1,START1MOVA,#0CCHLCALLWRITEMOVA,#44HLCALLWRITELCALLRSTMOVA,#0CCHLCALLWRITEMOVA,#0BEHLCALLWRITELCALLREAD子程序
LCALLCONVTEMP程序
LCALLDISPBCDLCALLCONVLCALLTEMP_COMP值比较子程序
显示温度标记
;调用DS18B2C复位子程序
QS18B20不存在
;跳过ROME配命令
;温度转换命令
调用键扫描子程序
;循环
键扫描子
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
***************************
SET_ALARM:
LCALLLOOK_ALARM
AS0:
JBK1,AS00
LCALLBEEP_BL
JNBK1,$
LCALLBEEP_BL
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,ASZ011
MOVTEMP_TH,#0
ASZ011:
LCALLLOOK_ALARM
MOVR5,#10
LCALLDELAY
JMPASZ01
ASZ02:
JBK3,ASZ03
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
LCALLBEEP_BL
DECTEMP_TH
MOVA,TEMP_TH
CJNEA,#0FFH,ASJ011
;TL值调整(增加)
;确定调整
;TH值调整(减少)
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:
CPL
JMPASZ01
ASJ03:
JMPASZ03
RET
RST_A1:
DB"SETALERTCODE",0
**********************
TEMP_COMP:
MOVA,TEMP_THSUBBA,TEMP_ZHJCCHULI1
MOVA,TEMPFC
CJNEA,#0BH,COMPSJMPCHULI2
COMP:
MOVA,TEMP_ZH
SUBBA,TEMP_TL;JCCHULI2;
MOVDPTR,#BJ5LCALLTEMP_BJ3CLRRELAY
RET
CHULI1:
MOVDPTR,#BJ3LCALLTEMP_BJ3SETBRELAY;LCALLBEEP_BLRET
CHULI2:
MOVDPTR,#BJ4LCALLTEMP_BJ3
;减数>被减数,则
;借位标志位C=1,转
减数>被减数,则
借位标志位C=1,转
;点亮指示灯
熄灭指示灯
;蜂鸣器响
熄灭指示灯
SETBRELAY
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 MOVR1,#0 MOVR0,#2 BBJJ1: MOVA,R1 MOVCA,@A+DPTR LCALLWDATA INCR1 DJNZR0,BBJJ1 RET BJ1: DB00H,"C" ・******************************** 5 *************************** MENU_OK: MOVDPTR,#M_OMOVA,#1; LCALLLCD_PRINTMOVDPTR,#M_OK2MOVA,#2; LCALLLCD_PRINT RET M_OK1: DB"DS18B20OK 显示正确信息子程序 ;指针指到显示消息 显示在第一行 ;指针指到显示消息 显示在第一行 ",0 *************************** MENU_ERROR: MOVDPTR,#M_ERROR针指到显示消息 MOVA,#1;显示在第一行 LCALLLCD_PRINT MOVDPTR,#M_ERROR2;指针指到显示消息1 MOVA,#2;显示在第一行 LCALLLCD_PRINT RET M_ERROR1: DB"DS18B20ERROR",0 M_ERROR2: DB"TEMP: ",0 ***************************** RST: SETBDQ NOP CLRDQ MOVR0,#6BH;主机发出延时复位低脉冲 MOVR1,#04H TSR1: DJNZR0,$ MOVR0,#6BH DJNZR1,TSR1 ;等待DS18B20回应 DS18B20暂存器操作子程序 NOP NOP NOP MOVR0,#32H TSR2: JNBDQ,TSR3 DJNZR0,TSR2 JMPTSR4; TSR3: SETBFLAG1 JMPTSR5 TSR4: CLRFLAG1 JMPTSR7 TSR5: MOVR0,#06BH TSR6: DJNZR0,$ TSR7: SETBDQ RET ・************************ 5 *************************** RE_18B20: JBFLAG1,RE_18B20A RET 延时 置1标志位,表示DS1820存在 清0标志位,表示DS1820不存在 时序要求延时一段时间 RE_18B20A: LCALLRST MOVA,#0CCH LCALLWRITE WR_SCRAPD: MOVA,#4EH LCALLWRITE MOVA,TEMP_TH LCALLWRITE MOVA,TEMP_TL LCALLWRITE MOVA,#7FH LCALLWRITE RET ;跳过ROME配 ;写暂器 ;TH(报警上限) ;TL(报警下限) ;12位精度 ・************************ 5 ******************************* WRITE_E2: LCALLRST MOVA,#0CCH LCALLWRITE MOVA,#48H EEROM 复制暂存器子程序 ;跳过ROME配 ;把暂存器里的温度报警值拷贝到 LCALLWRITE RET ・*********************** 重读EEROM子程序 ******************************** READ_E2: LCALLRST MOVA,#0CCH LCALLWRITE MOVA,#0B8H 暂存器 LCALLWRITE RET ;跳过ROME配 ;把EEROMI的温度报警值拷贝回 ・************************ 将自定义字符写入LCD的CGRAM中 ********************* STORE_DATA: MOVA,#40H LCALLWCOM MOVR2,#08H MOVDPTR,#D_DATA MOVR3,#00H S_DATA: MOVA,R3 MOVCA,@A+DPTR INCR3 DJNZR2,S_DATA RET D_DATA: DB0CH,12H,12H,0CH,00H,00H,00H,00H ・*********************** DS18B20数据写入操作子程序 ************************ 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 DS18B2冲读出 MOVR1,#TEMPL元 RE00: MOVR2,#8 RE01: CLRCY SETBDQ NOP NOP CLRDQ NOP NOP NOP SETBDQ MOVR3,#09 DJNZR3,$ MOVC,DQ MOVR3,#3CH ;将温度低位、高位、TH、TL从 ;存入25H、26H、27H、28H单 ;读前总线保持为低 ;开始读总线释放 ;延时18微妙 ;从DS18B20总线读得一位 DJNZR3,$ ;等待100微妙 RRCA ;把读得的位值环移给A DJNZR2,RE01 ;读下一位 MOV@R1,A INCR1 DJNZR4,RE00 RET ・************************ 温度值BCD码处理子程序 判温度是否零下 温度零上转 二进制数求补(双字节) 取反加1 ************************* CONVTEMP: MOVA,TEMPH ANLA,#08H JZTEMPC1; CLRC MOVA,TEMPL;CPLA; 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;乘 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指;针指到显示信息区 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 MOVA,#2 ;显示在第二行 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 ********************************** 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 INCR1 DJNZR0,BBJJ2 RET BJ2: DB00H,"C" POPB INCLCD_XMOVA,B MOVB,LCD_X ADDA,#30H LCALLLCDP2 RET SHOW_DIG2L: MOVB,#100DIVAB MOVA,#0AH XCHA,BDIVAB ADDA,#30HPUSHB MOVB,LCD_X LCALLLCDP2POPBINCLCD_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 ************************* CONV: MOVA,73H MOVLCD_X,#6 CJNEA,#1,CONV1 JMPCONV2 CONV1: CJNEA,#0BH,CONV11 MOVA,#"-" JMPCONV111CONV11: MOVA,#""CONV111: MOVB,LCD_X LCALLLCDP2 JMPCONV3 CONV2: LCALLSHOW_DIG2 CONV3: INCLCD_X MOVA,72H LCALLSHOW_DIG2 INCLCD_X MOVA,71HLCALLSHOW_DIG2 INCLCD_X ;加载百位数据 ;设置位置 ;"-"号显示 ;"+"号不显示 ;显示数据 ;十位 ;个位 MOVA,#'.' 第二行显示数字子程序 第二行显示数字子程序 设置显示地址 设置LCD的第二行地址 写入命令 由堆栈取出A ;写入数据 RET LCALLWCOM ・***************************** 5 ************************** CLR_LINE1: MOVA,#80HLCALLWCOMMOVR0,#24; C1: MOVA,#'';LCALLWDATADJNZR0,C1; RET ・************************* 5 ********************** LCALLDELAY1 MOVA,#01H;清除LCD显示屏 LCALLWCOM LCALLDELAY1 RET 清除LCD的第一行字符 设置LCD的第一行地址设置计数值 载入空格符至LCD 输出字符至LCD 计数结束 LCD的第一行或第二行显示字符 LCD_PRINT: CJNEA,#1,LINE2;判断是否为第一行 LINE1: MOVA,#80H;设置LCD的第一行地址 LCALLWCOM;写入命令 LCALLCLR_LINE;清除该行字符数据 LCALLWCOM;JMPFILL LINE2: MOVA,#0C0HLCALLWCOM;LCALLCLR_LINEMOVA,#0C0H; LCALLWCOM FILL: CLRA; MOVCA,@A+DPTRCJNEA,#0,LC1; RET LC1: LCALLWDATAINCDPTR;JMPFILL;RET ・**
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 Ds18B20 温度 采集 LCD 显示 汇编程序