基于DS18B20的温度测试系统 具有多种按键功能.docx
- 文档编号:6232237
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:21
- 大小:17.55KB
基于DS18B20的温度测试系统 具有多种按键功能.docx
《基于DS18B20的温度测试系统 具有多种按键功能.docx》由会员分享,可在线阅读,更多相关《基于DS18B20的温度测试系统 具有多种按键功能.docx(21页珍藏版)》请在冰点文库上搜索。
基于DS18B20的温度测试系统具有多种按键功能
实验二基于DS18B20芯片的温度测试系统
程序清单
INC_TEMPEQUP3.6;增大温度值
DEC_TEMPEQUP3.7;减小温度值
SEC_TEMPEQUP3.5;选择增大还是减小
DS18EQUP1.0;温度采集器入口
H_TEMP_CALL_LIGHTEQUP1.1;温度过高的指示灯,同时接继电器
L_TEMP_CALL_LIGHTEQUP1.2;温度过低的指示灯,同时接继电器
SINGEQUP2.5;蜂鸣器,用不同的叫声来表示温度过高和温度过低
TEMP_H8EQU40H;采集的温度数据高8位
TEMP_L8EQU39H;采集的温度数据低8位
TEMP_THEQU38H;保存设立的温度上限值
TEMP_TLEQU37H;保存设立的温度下限值
INT_PART1EQU33H;存放TEMP_L8中的高4位
INT_PART2EQU32H;存放TEMP_H8中的低4位(其实有效的是低3位)
INT_PARTEQU30H;实际测试的温度整数部分的数值
BEYONDEQU29H.0;将进位C存入BEYOND
FLAG1EQU29H.1;DS18B20是否存在的标志位
ACT_TEMPEQU27H;存放实际测试得到的温度的整数部分
SET_TEMP_THEQU25H;温度上限值的整数部分,用于比较
SET_TEMP_TLEQU23H;温度下限值的整数部分,用于比较
ORG0000H
MAIN:
MOVR0,#00H;用于统计SEC_TEMP按键按下的次数
MOVTEMP_TH,#00
MOVTEMP_TL,#00;设置的初始温度上、下限值
KEY_START_TEST:
JBSEC_TEMP,R0_JUDGE_N0
ACALLDELAY10MS
JBSEC_TEMP,R0_JUDGE_N0;防止抖动
AJMPKEY_TEST
R0_JUDGE_N0:
CJNER0,#0,R0_JUDGE_N1
AJMPKEY_START_TEST
R0_JUDGE_N1:
CJNER0,#1,R0_JUDGE_N2
MOVP0,#006H
CLRP2.3
ACALLDELAY1MS
SETBP2.3
MOVP0,#07FH
CLRP2.2
ACALLDELAY1MS
SETBP2.2
MOVP0,#05BH
CLRP2.1
ACALLDELAY1MS
SETBP2.1
MOVP0,#03FH
CLRP2.0
ACALLDELAY1MS
SETBP2.0
AJMPKEY_START_TEST
R0_JUDGE_N2:
CJNER0,#2,R0_JUDGE_N3
AJMPTH_JUDGE
R0_JUDGE_N3:
CJNER0,#3,R0_JUDGE_N_END
AJMPTL_JUDGE
R0_JUDGE_N_END:
MOVR0,#0
AJMPWENDU_TEST;进入温度测试程序
KEY_TEST:
JNBSEC_TEMP,KEY_TEST;按键释放
AJMPNEXT1
NEXT1:
INCR0
CJNER0,#1,TH_JUDGE
AJMPKEY_START_TEST
TH_JUDGE:
CJNER0,#2,TL_JUDGE
JBINC_TEMP,TH_TEMP_JUDGE_DEC
ACALLDELAY10MS
JBINC_TEMP,TH_TEMP_JUDGE_DEC
AJMPTH_JUDGE_NEXT1
TH_JUDGE_NEXT1:
JNBINC_TEMP,TH_JUDGE_NEXT1
AJMPTH_INC_PART
TH_TEMP_JUDGE_DEC:
JBDEC_TEMP,TH_SET_DISP
ACALLDELAY10MS
JBDEC_TEMP,TH_SET_DISP
AJMPTH_JUDGE_NEXT2
TH_JUDGE_NEXT2:
JNBDEC_TEMP,TH_JUDGE_NEXT2
AJMPTH_DEC_PART
TL_JUDGE:
CJNER0,#3,END_JUDGE
MOVR4,TEMP_TH
CJNER4,#00H,TL_JUDGE_FIRST
AJMPTL_ERROR_SET_DISP_FIRST_FIRST
TL_JUDGE_FIRST:
JBINC_TEMP,TL_TEMP_JUDGE_DEC
ACALLDELAY10MS
JBINC_TEMP,TL_TEMP_JUDGE_DEC
AJMPTL_JUDGE_NEXT1
TL_JUDGE_NEXT1:
JNBINC_TEMP,TL_JUDGE_NEXT1
AJMPTL_INC_PART
TL_TEMP_JUDGE_DEC:
JBDEC_TEMP,TL_SET_DISP
ACALLDELAY10MS
JBDEC_TEMP,TL_SET_DISP
AJMPTL_JUDGE_NEXT2
TL_JUDGE_NEXT2:
JNBDEC_TEMP,TL_JUDGE_NEXT2
AJMPTL_DEC_PART
END_JUDGE:
MOVR0,#00H
AJMPWENDU_TEST;进入温度测试程序
TH_INC_PART:
MOVA,TEMP_TH
INCA
CJNEA,#100,TH_INC_PART_NEXT
MOVA,#00H
AJMPTH_INC_PART_NEXT
TH_INC_PART_NEXT:
MOVTEMP_TH,A
AJMPKEY_START_TEST
TH_DEC_PART:
MOVA,TEMP_TH
CJNEA,#00H,TH_DEC_PART_FIRST
AJMPKEY_START_TEST
TH_DEC_PART_FIRST:
DECA
AJMPTH_DEC_PART_NEXT
TH_DEC_PART_NEXT:
MOVTEMP_TH,A
AJMPKEY_START_TEST
TH_SET_DISP:
MOVP0,#076H
CLRP2.3
ACALLDELAY1MS
SETBP2.3
MOVP0,#040H
CLRP2.2
ACALLDELAY1MS
SETBP2.2
MOVDPTR,#TAB
MOVA,TEMP_TH
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP2.1
ACALLDELAY1MS
SETBP2.1
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRP2.0
ACALLDELAY1MS
SETBP2.0
AJMPKEY_START_TEST
TL_ERROR_SET_DISP_FIRST_FIRST:
AJMPTL_ERROR_SET_DISP_FIRST
TL_SET_DISP:
MOVP0,#038H
CLRP2.3
ACALLDELAY1MS
SETBP2.3
MOVP0,#040H
CLRP2.2
ACALLDELAY1MS
SETBP2.2
MOVDPTR,#00H
MOVDPTR,#TAB
MOVA,TEMP_TL
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP2.1
ACALLDELAY1MS
SETBP2.1
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRP2.0
ACALLDELAY1MS
SETBP2.0
AJMPKEY_START_TEST
TL_INC_PART:
MOVA,TEMP_TL
INCA
CJNEA,TEMP_TH,TL_INC_PART_NEXT;保证此时设立的温度下限值小于刚才设立的温度上限值1度
MOVA,#00H
AJMPTL_INC_PART_NEXT
TL_INC_PART_NEXT:
MOVTEMP_TL,A
AJMPKEY_START_TEST
TL_DEC_PART:
MOVA,TEMP_TL
DECA
CJNEA,#255,TL_DEC_PART_NEXT
MOVA,TEMP_TH
DECA;保证此时设立的温度下限值小于刚才设立的温度上限值1度
AJMPTL_DEC_PART_NEXT
TL_DEC_PART_NEXT:
MOVTEMP_TL,A
AJMPKEY_START_TEST
TL_ERROR_SET_DISP_FIRST:
MOVR1,#0FAH
MOVR2,#0FAH
TL_ERROR_SET_DISP:
;温度设置错误
MOVP0,#038H
CLRP2.3
ACALLDELAY1MS
SETBP2.3
MOVP0,#040H
CLRP2.2
ACALLDELAY1MS
SETBP2.2
MOVP0,#079H
CLRP2.1
ACALLDELAY1MS
SETBP2.1
MOVP0,#079H
CLRP2.0
ACALLDELAY1MS
SETBP2.0
DJNZR1,TL_ERROR_SET_DISP
AJMPR2_CICLE
R2_CICLE:
MOVP0,#038H
CLRP2.3
ACALLDELAY1MS
SETBP2.3
MOVP0,#040H
CLRP2.2
ACALLDELAY1MS
SETBP2.2
MOVP0,#079H
CLRP2.1
ACALLDELAY1MS
SETBP2.1
MOVP0,#079H
CLRP2.0
ACALLDELAY1MS
SETBP2.0
DJNZR2,R2_CICLE
AJMPMAIN
WENDU_TEST:
AJMPGET_TEMP
GET_TEMP:
;准备开始温度转换并读取温度
ACALLDSRESET
JNBFLAG1,GET_TEMP
MOVA,#0CCH;跳过ROM匹配
ACALLTEMPWRITEBYTE
JNBFLAG1,GET_TEMP
MOVA,#44H;发出温度转换命令
ACALLTEMPWRITEBYTE;启动DS18B20进行温度转换,结果存入内部9字节的RAM中
ACALLDSRESET;准备读温度前先复位
JNBFLAG1,GET_TEMP
MOVA,#0CCH;跳过ROM匹配
ACALLTEMPWRITEBYTE
MOVA,#0BEH
ACALLTEMPWRITEBYTE;读暂存器中的数据
AJMPGET_TEMP_BIT
GET_TEMP_BIT:
;读取温度的值
MOVR2,#8
MOVR3,#8
MOVTEMP_H8,#00H
MOVTEMP_L8,#00H
AJMPGET_TEMP_L8_BIT
GET_TEMP_L8_BIT:
SETBDS18
NOP
NOP
CLRDS18
NOP
NOP
NOP
NOP
NOP
NOP
SETBDS18
NOP
NOP
NOP
NOP
MOVC,DS18
RRCA
LCALLDELAY30US
DJNZR2,GET_TEMP_L8_BIT
MOVTEMP_L8,A;读取的温度的低8位
GET_TEMP_H8_BIT:
SETBDS18
NOP
NOP
CLRDS18
NOP
NOP
NOP
NOP
NOP
NOP
SETBDS18
NOP
NOP
NOP
NOP
MOVC,DS18
RRCA
LCALLDELAY30US
DJNZR3,GET_TEMP_H8_BIT
MOVTEMP_H8,A;读取的温度的高位
AJMPTEMP_DEAL;进入温度数值处理子程序
TEMP_DEAL:
MOVA,TEMP_L8
ANLA,#0F0H
SWAPA
MOVINT_PART1,A
AJMPTEMP_DEAL2
TEMP_DEAL2:
MOVINT_PART2,TEMP_H8
MOVA,INT_PART2
SWAPA
ADDA,INT_PART1
AJMPTEMP_DEAL3
TEMP_DEAL3:
MOVINT_PART,A
AJMPTEMP_COMPARE
TEMP_COMPARE:
MOVA,INT_PART
MOVACT_TEMP,A
MOVA,TEMP_TH
MOVSET_TEMP_TH,A
MOVA,TEMP_TL
MOVSET_TEMP_TL,A
AJMPTEMP_TH_COMPARE
TEMP_TH_COMPARE:
MOVA,ACT_TEMP
MOVR0,SET_TEMP_TH
SUBBA,R0
MOVBEYOND,C
JNBBEYOND,TH_TELL
AJMPTEMP_TL_COMPARE
TEMP_TL_COMPARE:
MOVA,SET_TEMP_TL
MOVR0,ACT_TEMP
SUBBA,R0
MOVBEYOND,C
JNBBEYOND,TL_TELL
AJMPNO_TELL
TH_TELL:
CLRP1.1;温度过高指示灯
AJMPH_TELL_DISP;实现温度过高报警、蜂鸣器鸣叫和实际测量的温度的显示
H_TELL_DISP:
CLRP1.1;温度过高指示灯
MOVP0,#077H
SETBSING
CLRP2.3
ACALLDELAY5MS
SETBP2.3
MOVP0,#040H
CLRSING
CLRP2.2
ACALLDELAY5MS
SETBP2.2
MOVA,ACT_TEMP
MOVB,#10
DIVAB
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
SETBSING
CLRP2.1
ACALLDELAY5MS
SETBP2.1
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRSING
CLRP2.0
ACALLDELAY5MS
SETBP2.0
SETBP1.1
SETBSING
AJMPWENDU_TEST;重新读取温度
TL_TELL:
CLRP1.2;温度过低指示灯
AJMPL_TELL_DISP;实现温度过低报警、蜂鸣器鸣叫和实际测量温度的显示
L_TELL_DISP:
CLRP1.2;温度过低指示灯
MOVP0,#077H
SETBSING
CLRP2.3
ACALLDELAY5MS
SETBP2.3
MOVP0,#040H
CLRSING
CLRP2.2
ACALLDELAY5MS
SETBP2.2
MOVA,ACT_TEMP
MOVB,#10
DIVAB
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
SETBSING
CLRP2.1
ACALLDELAY5MS
SETBP2.1
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRSING
CLRP2.0
ACALLDELAY5MS
SETBP2.0
SETBP1.2
SETBSING
AJMPWENDU_TEST;重新读取温度
NO_TELL:
AJMPNO_TELL_WENDU_SHOW;不报警,直接显示实际测量的温度值
NO_TELL_WENDU_SHOW:
MOVP0,#077H
CLRP2.3
ACALLDELAY5MS
SETBP2.3
MOVP0,#040H
CLRP2.2
ACALLDELAY5MS
SETBP2.2
MOVDPTR,#TAB
MOVA,INT_PART
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP2.1
ACALLDELAY5MS
SETBP2.1
MOVA,B
MOVCA,@A+DPTR
CLRP2.0
MOVP0,A
ACALLDELAY5MS
SETBP2.0
AJMPWENDU_TEST
DLY:
MOVR6,#2
D1_DLY:
MOVR7,#248
DJNZR7,$
DJNZR6,$
RET
TAB:
DB03FH;0
DB006H;1
DB05BH;2
DB04FH;3
DB066H;4
DB06DH;5
DB07DH;6
DB007H;7
DB07FH;8
DB06FH;9
DSRESET:
SETBDS18;DS18B20复位子程序
NOP
CLRDS18
MOVR0,#64H;主机发出延时600微秒的复位低脉冲
MOVR1,#03H
RESET1:
DJNZR0,$
MOVR0,#64H
DJNZR1,RESET1
SETBDS18;然后拉高数据线
NOP
MOVR0,#25H
RESET2:
JNBDS18,RESET3;等待DS18B20回应
DJNZR0,RESET2
JMPRESET4;延时
RESET3:
SETBFLAG1;置标志位,表示DS1820存在
JMPRESET5
RESET4:
CLRFLAG1;清标志位,表示DS1820不存在
JMPRESET6
RESET5:
MOVR0,#064H
DJNZR0,$;时序要求延时一段时间
RESET6:
SETBDS18
RET
TEMPWRITEBYTE:
MOVR2,#8;一共8位数据
CLRC
AJMPWR1
WR1:
CLRDS18
ACALLDELAY15US
RRCA
MOVDS18,C
ACALLDELAY15US
ACALLDELAY15US
ACALLDELAY15US
SETBDS18
DJNZR2,WR1
SETBDS18
RET
DELAY10MS:
;误差0us
MOVR7,#01H
DL1_10MS:
MOVR6,#26H
DL0_10MS:
MOVR5,#82H
DJNZR5,$
DJNZR6,DL0_10MS
DJNZR7,DL1_10MS
RET
DELAY30US:
;误差0us
MOVR6,#03H
DL0_30US:
MOVR5,#03H
DJNZR5,$
DJNZR6,DL0_30US
RET
DELAY1MS:
;误差0us
MOVR7,#01H
DL1_1MS:
MOVR6,#8EH
DL0_1MS:
MOVR5,#02H
DJNZR5,$
DJNZR6,DL0_1MS
DJNZR7,DL1_1MS
RET
DELAY15US:
;误差0us
MOVR5,#06H
DJNZR5,$
RET
DELAY5MS:
;误差0us
MOVR6,#13H
DL0_5MS:
MOVR5,#82H
DJNZR5,$
DJNZR6,DL0_5MS
RET
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于DS18B20的温度测试系统 具有多种按键功能 基于 DS18B20 温度 测试 系统 具有 多种 按键 功能