DS18B20温度控制数码管显示汇编非常详细.docx
《DS18B20温度控制数码管显示汇编非常详细.docx》由会员分享,可在线阅读,更多相关《DS18B20温度控制数码管显示汇编非常详细.docx(22页珍藏版)》请在冰豆网上搜索。
DS18B20温度控制数码管显示汇编非常详细
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
转换命令
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
CALLAL