4.2、总程序
TEMPER_L EQU 29H; 用于保存读出温度的低8位 TEMPER_H EQU 28H; 用于保存读出温度的高8位 FLAG1 EQU 38H; DS18B20标志位 FLAG2 EQU 01H; 设定状态标志位 ORG 0000H
AJMP START; ORG 0030H
START:MOV 2FH,#25; SETB P2.1 ; CLR FLAG2 mov sp,#60h;
duqu:LCALL GET_TEMPER ; LCALL DISP ; MOV A,29H; CJNE A,2FH,LL1; 等
CLR P2.0; SJMP ANJIAN
MAIN: MOV a,2FH ; MOV b,#10 ; div ab
ORL A,#00110000B
MOV 41H,a ; MOV 42H,b ; MOV A,42H
ORL A,#00110000B; MOV 42H,A MOV a,2FH
转入主程序 设定高于25度为温度过高 调用读温度子程序并初始化DS18B20
调用显示当前温度 将现场实际温度传递给A 比较当前的温度与设定的温度是否相
开启电风扇 存储的温度25度
取出十位和个位 十位 个位 转化成ASCII码 26
MOV b,#100 ; div ab
ORL A,#00110000B
MOV 40H,a ;
LL1:SETB P2.0; 关闭电风扇 ANJIAN:
LCALL DISP
; 读取当前按键的值
MOV A,P3
ANL A,#0FH ; 屏蔽高位
sheding:CJNE A,#0CH,jia ; 加减按键一起按就进入温度设定状态 ACALL DELAY100 ; 消除键抖动
CJNE A,#0CH,jia ; 加减按键一起按就进入温度设定状态 setb flag2 ; 启动设定 sjmp duqu
jia: CJNE A,#0EH,jian ; 加处理 ACALL DELAY100 ; 消除键抖动 CJNE A,#0EH,jian ; 加处理
JNB FLAG2,DUQU ; 在加减键没有同时按下的时候,只按加按键时不执
行任何功能,并跳到读取当前温度
MOV A,2FH INC A
; 先读取原先设定的温度值
; 原先设定的温度值加1,
; 将当前设定的温度值保存
MOV 2FH,A
SJMP BAOCUN
jian: CJNE A,#0DH,duqu ; 减处理 ACALL DELAY100 ; 消除键抖动 CJNE A,#0DH,duqu ; 减处理
JNB FLAG2,DUQU ; 在加减键没有同时按下的时候,只按
加按键时不执行任何功能,并跳到读取当前温度
MOV A,2FH
; 先读取原先设定的温度值
27
DEC A ; 原先设定的温度值减1,当设定的温度值不能超过-25
MOV 2FH,A
; 保存当前设定的温度
baocun:CJNE A,#0CH,TUICHU; 加减按键一起按就保存温度设定状态 并退出设定
ACALL DELAY100 ; 消除键抖动
CJNE A,#0CH,TUICHU; 退出设定
CLR flag2 ;
SJMP QUIT
TUICHU:CPL P2.1; LCALL DELAY100 LCALL DELAY100 LCALL DELAY100 LCALL DELAY100 LCALL DELAY100
SJMP BAOCUN
QIUT:LCALL DISP
LJUMP MAIN
DISP: JNB FLAG2,DQ
MOV A,2FH;
SJMP XS
DQ:mov a,29H; XS: mov b,#10 ; div ab
MOV DPTR,#WORDTAB MOVC A,@A+DPTR
MOV P0,A
加减按键一起按就保存温度设定状态 并关闭设定 等待退出设定状态 显示设定温度值 显示当前温度值 取出十位和个位 28
CLR P2.7; 开启个位数码管显示
SETB P2.6
SETB P2.5 LCALL DELAY100 SETB P2.7 MOV A,B
MOV DPTR,#WORDTAB MOVC A,@A+DPTR MOV P0,A
CLR P2.6; SETB P2.7 SETB P2.5 LCALL DELAY100 SETB P2.6
RET
GET_TEMPER: LCALL INIT_1820; JB FLAG1,TSS2
RET ;
INIT_1820: SETB P3.2 NOP CLR P3.2
MOV R0,#06BH;
MOV R1,#03H
TSR1: DJNZ R0,TSR1 MOV R0,#6BH
DJNZ R1,TSR1
开启十位数码管显示 先复位DS18B20 主机发出延时537微秒的复位低脉冲29
SETB P3.2; 然后拉高数据线 NOP NOP NOP
MOV R0,#25H
TSR2: JNB P3.2,TSR3; DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ;
LJMP TSR5
TSR4: CLR FLAG1 ;
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6 ; TSR7: SETB P3.2
RET
WRITE_1820: MOV R2,#8;
CLR C
WR1: CLR P3.2 MOV R3,#5 DJNZ R3,$
RRC A
等待DS18B20回应 置标志位,表示DS1820存在 清标志位,表示DS1820不存在 时序要求延时一段时间
一共8位数据 30