DS18B20温度控制数码管显示汇编非常详细.docx
- 文档编号:25388780
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:25
- 大小:19.29KB
DS18B20温度控制数码管显示汇编非常详细.docx
《DS18B20温度控制数码管显示汇编非常详细.docx》由会员分享,可在线阅读,更多相关《DS18B20温度控制数码管显示汇编非常详细.docx(25页珍藏版)》请在冰豆网上搜索。
DS18B20温度控制数码管显示汇编非常详细
;DS18B20温度控制数码管显示(汇编非常详细)*
;*1、P1.6=→进入设定温度报警值TL状态:
*
;*L--20*
;*2、P1.6→进入设定温度报警值TH状态:
*
;*H--28*
;*3、P1.6→返回*
;*4、设定过程:
P1.4→加键(UP),P1.5→减键(DOWN),可快速调。
*
;***
TIMER_LDATA23H
TIMER_HDATA24H
TIMER_COUNDATA25H
TEMPLDATA26H
TEMPHDATA27H
TEMP_THDATA28H
TEMP_TLDATA29H
TEMPHCDATA2AH
TEMPLCDATA2BH
TEMP_ZHDATA2CH
BEEPEQUP3.7
DATA_LINEEQUP3.3
RELAYEQUP1.3
FLAG1EQU20H.0
FLAG2EQU20H.1
;-------------------------------------------------
K1EQUP1.4
K2EQUP1.5
K3EQUP1.6
K4EQUP1.7
;=================================================
ORG0000H
JMPMAIN
ORG000BH
AJMPINT_T0
;--------------------------------------------------
MAIN:
MOVSP,#30H
MOVTMOD,#01H;T0,方式1
MOVTIMER_L,#00H;50ms定时值
MOVTIMER_H,#4CH
MOVTIMER_COUN,#00H;中断计数
MOVIE,#82H;EA=1,ET0=1
LCALLREAD_E2
;LCALLRE_18B20
MOV20H,#00H
SETBBEEP
SETBRELAY
MOV7FH,#0AH;熄灭符
CALLRESET;复位与检测DS18B20
JNBFLAG1,MAIN1;FLAG1=0,DS18B20不存在
JMPSTART
MAIN1:
CALLRESET
JBFLAG1,START
LCALLBEEP_BL;DS18B20错误,报警
JMPMAIN1
START:
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#044H;发出温度转换命令
CALLWRITE
CALLRESET
MOVA,#0CCH;跳过ROM匹配
CALLWRITE
MOVA,#0BEH;发出读温度命令
CALLWRITE
CALLREAD;读温度数据
CALLCONVTEMP
CALLDISPBCD
CALLDISP1
CALLSCANKEY
LCALLTEMP_COMP
JMPMAIN1
;=====================================================
;DS18B20复位与检测子程序
;FLAG1=1OK,FLAG1=0ERROR
;======================================================
RESET:
SETBDATA_LINE
NOP
CLRDATA_LINE
MOVR0,#64H;主机发出延时600微秒的复位低脉冲
MOVR1,#03H
RESET1:
DJNZR0,$
MOVR0,#64H
DJNZR1,RESET1
SETBDATA_LINE;然后拉高数据线
NOP
MOVR0,#25H
RESET2:
JNBDATA_LINE,RESET3;等待DS18B20回应
DJNZR0,RESET2
JMPRESET4;延时
RESET3:
SETBFLAG1;置标志位,表示DS1820存在
JMPRESET5
RESET4:
CLRFLAG1;清标志位,表示DS1820不存在
JMPRESET6
RESET5:
MOVR0,#064H
DJNZR0,$;时序要求延时一段时间
RESET6:
SETBDATA_LINE
RET
;===========================================================
;
;===========================================================
WRITE:
MOVR2,#8;一共8位数据
CLRCY
WR1:
CLRDATA_LINE;开始写入DS18B20总线要处于复位(低)状态
MOVR3,#09
DJNZR3,$;总线复位保持18微妙以上
RRCA;把一个字节DATA分成8个BIT环移给C
MOVDATA_LINE,C;写入一个BIT
MOVR3,#23
DJNZR3,$;等待46微妙
SETBDATA_LINE;重新释放总线
NOP
DJNZR2,WR1;写入下一个BIT
SETBDATA_LINE
RET
;============================================================
;从DS18B20中读出温度低位、高位和报警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ:
MOVR4,#4;将温度高位和低位从DS18B20中读出
MOVR1,#26H;存入26H、27H、28H、29H
RE00:
MOVR2,#8
RE01:
CLRC
SETBDATA_LINE
NOP
NOP
CLRDATA_LINE;读前总线保持为低
NOP
NOP
NOP
SETBDATA_LINE;开始读总线释放
MOVR3,#09;延时18微妙
DJNZR3,$
MOVC,DATA_LINE;从DS18B20总线读得一个BIT
MOVR3,#23
DJNZR3,$;等待46微妙
RRCA;把读得的位值环移给A
DJNZR2,RE01;读下一个BIT
MOV@R1,A
INCR1
DJNZR4,RE00
RET
;--------------------------------------------
;200ms对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSHACC
PUSHPSW
MOVTL0,TIMER_L
MOVTH0,TIMER_H
INCTIMER_COUN
MOVA,TIMER_COUN
CJNEA,#04H,INT_END
MOVTIMER_COUN,#00H
CPLFLAG2
INT_END:
POPPSW
POPACC
RETI
;==========================================================
;重新对DS18B20初始化
;将设定的温度报警值写入DS18B20
;==========================================================
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
;====================================================
;功能键扫描子程序
;====================================================
SCANKEY:
MOVP1,#0F0H
JBK1,SCAN_K2
CALLBEEP_BL
SCAN_K1:
CALLALERT_TL
CALLALERT_PLAY
JBK1,SCAN_K1
CALLBEEP_BL
SCAN_K11:
CALLALERT_TH
CALLALERT_PLAY
JBK1,SCAN_K11
CALLBEEP_BL
SCAN_K2:
JBK2,SCAN_K3
CALLBEEP_BL
SCAN_K3:
JBK3,SCAN_K4
CALLBEEP_BL
LCALLRESET_ALERT
LCALLRE_18B20
LCALLWRITE_E2
SCAN_K4:
JBK4,SCAN_END
CALLBEEP_BL
SCAN_END:
RET
;================================================
;设置温度报警值
;================================================
RESET_ALERT:
CALLALERT_TL
CALLALERT_PLAY
JNBK3,$;K3为位移键
SETBTR0
RESET_TL:
CALLALERT_PLAY
JNBFLAG2,R_TL01
mov75H,7fh;送入熄灭符
mov76H,7fh
CALLALERT_PLAY
JMPR_TL02
R_TL01:
CALLALERT_TL
mov75h,7Eh;送设定值
mov76h,7Dh
CALLALERT_PLAY;显示设定值
R_TL02:
JNBK1,K011A
JNBK2,K011B
JNBK3,RESET_TH
JMPRESET_TL
K011A:
INCTEMP_TL
MOVA,TEMP_TL
CJNEA,#120,K012A;没有到设定上限值,转
MOVTEMP_TL,#0
K012A:
CALLTL_DEL
JMPRESET_TL
K011B:
DECTEMP_TL
MOVA,TEMP_TL
CJNEA,#00H,K012B;没有到设定下限值,转
MOVTEMP_TL,#119
K012B:
CALLTL_DEL
JMPRESET_TL
;-------------------------------------------------------
RESET_TH:
CALLBEEP_BL
JNBK3,$
RESET_TH1:
CALLALERT_PLAY
JNBFLAG2,R_TH01
mov75H,7fh;送入熄灭符
mov76H,7fh
CALLALERT_PLAY
JMPR_TH02
R_TH01:
CALLALERT_TH
mov75h,7Eh;
mov76h,7Dh
CALLALERT_PLAY
R_TH02:
JNBK1,K021A
JNBK2,K021B
JNBK3,K002
JMPRESET_TH1
K021A:
INCTEMP_TH
MOVA,TEMP_TH
CJNEA,#120,K022A;没有到设定上限值,转
MOVTEMP_TH,#0
K022A:
CALLTH_DEL
JMPRESET_TH1
K021B:
DECTEMP_TH;减1
MOVA,TEMP_TH
CJNEA,#00H,K022B;没有到设定下限值,转
MOVTEMP_TH,#119
K022B:
CALLTH_DEL
JMPRESET_TH1
K002:
CALLBEEP_BL
CLRTR0;关闭中断
RET
;-----------------------------------------------------
;键延时子程序
;多次调用报警值显示程序来延时
;-----------------------------------------------------
TL_DEL:
;报警低值延时
MOVR2,#0AH
TL_DEL1:
CALLALERT_TL
CALLALERT_PLAY
DJNZR2,TL_DEL1
RET
TH_DEL:
;报警高值延时
MOVR2,#0AH
TH_DEL1:
CALLALERT_TH
CALLALERT_PLAY
DJNZR2,TH_DEL1
RET
;====================================================
;实时温度值与设定报警温度值TH、TL比较子程序
;当实际温度大于TH的设定值时,显示“H”,继电器关闭。
;当实际温度小于TH的设定值时,显示“O”,继电器吸合。
;当实际温度小于TL的设定值时,显示“L”。
;闪动显示标记符H、L、O
;====================================================
TEMP_COMP:
SETBTR0;启动中断
MOVA,TEMP_TH
SUBBA,TEMP_ZH;减数>被减数,则
JCCHULI1;借位标志位C=1,转
MOVA,TEMP_ZH
SUBBA,TEMP_TL;减数>被减数,则
JCCHULI2;借位标志位C=1,转
JNBFLAG2,T_COMP1;FLAG2=0,显示标记字符
MOV74H,#0AH;熄灭符
LCALLDISP1
JMPT_COMP2
T_COMP1:
MOV74H,#00H
LCALLDISP1;显示"O"
T_COMP2:
CLRRELAY;继电器吸合
CLRTR0;关闭中断
RET
;---------------------------------------------
;超温处理
;---------------------------------------------
CHULI1:
SETBRELAY;继电器关闭
JNBFLAG2,CHULI10
MOV74H,#0AH;熄灭符
LCALLDISP1
JMPCHULI11
CHULI10:
MOV74H,#0DH
LCALLDISP1;显示"H"
;CALLBEEP_BL;蜂鸣器响
CHULI11:
CLRTR0;关闭中断
RET
;---------------------------------------------
;欠温处理
;---------------------------------------------
CHULI2:
;欠温处理
JNBFLAG2,CHULI20
MOV74H,#0AH;熄灭符
LCALLDISP1
JMPCHULI21
CHULI20:
MOV74H,#0CH
LCALLDISP1;显示"L"
;CALLBEEP_BL;蜂鸣器响
CHULI21:
CLRTR0;关闭中断
RET
;------------------------------------------------------------
;把DS18B20暂存器里的温度报警值拷贝到EEROM
;------------------------------------------------------------
WRITE_E2:
CALLRESET
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#48H;温度报警值拷贝到EEROM
LCALLWRITE
RET
;--------------------------------------------------------------
;把DS18B20EEROM里的温度报警值拷贝回暂存器
;-------------------------------------------------------------
READ_E2:
CALLRESET
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0B8H;温度报警值拷贝回暂存器
CALLWRITE
RET
;*****************************************************
;处理温度BCD码子程序
;****************************************************
CONVTEMP:
MOVA,TEMPH;判温度是否零下
ANLA,#80H
JZTEMPC1;温度零上转
CLRC
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH;-
CPLA
ADDCA,#00H
MOVTEMPH,A;TEMPHCHI=符号位
MOVTEMPHC,#0BH
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;组合后的值存入TEMP_ZH
LCALLHEX2BCD1
MOVTEMPL,A
ANLA,#0F0H
SWAPA
ORLA,TEMPHC;TEMPHCLOW=十位数BCD
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH
SWAPA;TEMPLCHI=个位数BCD
ORLA,TEMPLC
MOVTEMPLC,A
MOVA,R7
JZTEMPC12
ANLA,#0FH
SWAPA
MOVR7,A
MOVA,TEMPHC;TEMPHCHI=百位数BCD
ANLA,#0FH
ORLA,R7
MOVTEMPHC,A
TEMPC12:
RET
;-----------------------------------------------------------
;小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB:
DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB06H,07H,08H,08H,09H,09H
;===========================================================
;显示区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
;***************************************************************
;温度显示子程序
;***************************************************************
;显示数据在70H-73H单元内,用4位共阳数码管显示,P0口输出段码数据,
;P2口作扫描控制,每个LED数码管亮2MS时间再逐位循环。
DISP1:
MOVR1,#70H;指向显示数据首址
MOVR5,#7FH;扫描控制字初值
PLAY:
MOVP0,#0FFH
MOVA,R5;扫描字放入A
MOVP2,A
MOVA,@R1;取显示数据到A
MOVDPTR,#TAB;取段码表地址
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
MOVA,R5
JBACC.6,LOOP5;小数点处理
CLRP0.7
LOOP5:
LCALLDL_MS;显示2MS
INCR1;指向下一个地址
MOVA,R5;放回R5内
JNBACC.3,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 温度 控制 数码管 显示 汇编 非常 详细