TEMPUTER EQU 29H;温度存储单元
TEMPH EQU 27H;温度上限标志位
TEMPL EQU 26H;温度下限标志位
SIGN EQU 5BH;按键S1按下次数标志位,为1时设置下限,为2时设置上限
S1 BIT P1.0;定义S1按键为温度上下限进入按键
S2 BIT P1.1;定义S2按键为温度上下限加一按键
S3 BIT P1.2;定义S3按键为温度上下限减一按键
S4 BIT P1.3;定义S4按键为温度上下限退出按键
ORG 0000H
LJMP
ORG 0030H
MOV 26H,#25;温度下限初值
MOV 27H,#99;温度上限初值
MOV SIGN,#00H
MOV 37H,#2
MOV 36H,#5
MOV 38H,#0;上电复位后显示初值
LCALL DISPLAY
;;;主程序;;;
MAIN0: JB S1,NET1;判断S1是否按下,按下则顺序执行,否则跳转
LCALL D12MS;消抖动
JB S1,NET1;再次判断S1是否按下
JNB S1,$;等待S1抬起
INC SIGN;S1标志位加1
MOV A,SIGN
CJNE A,#1,TIAO;S1标志位与1比较,相等顺序执行,不等则跳转
LCALL TIAOTL
TIAO: CJNE A,#2,NET1;S1标志位与2比较,相等顺序执行,不等则跳转
MOV SIGN,#0;S1标志位置0
LCALL DISPLAY
LCALL TIAOTH
;;;温度比较子程序;;;
NET1: MOV A,TEMPUTER
CLR C
SUBB A,TEMPH
JNC BJ;当测试温度高于上限时报警
MOV A,TEMPUTER
CLR C
SUBB A,TEMPL
JC BJ;当测试温度低于下限时报警
LCALL GET_TEMPER
LJMP MAIN0
;;;报警子程序;;;
BJ: CLR P2.1
LCALL DISPLAY
LCALL D12MS
LCALL DISPLAY
LCALL D12MS
LCALL DISPLAY
LCALL D12MS
LCALL GET_TEMPER
LJMP MAIN0
;;;得出温度总子程序;;;
GET_TEMPER: SETB P2.0
LCALL INIT_18B20
JB 20H.1,TSS2;检测DS18B20是否再线
RET
TSS2:SETB P2.1
MOV A,#0CCH;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#44H;发出温度转换命令
LCALL WRITE_18B20
LCALL INIT_18B20
MOV A,#0CCH;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH;发出读取温度命令
LCALL WRITE_18B20
LCALL READ_18B20
RET
;;;DS18B20初始化子程序;;;
INIT_18B20:SETB P2.0
NOP
NOP
CLR P2.0
MOV R1,#03H
TSR1: MOV R0,#6BH
DJNZ R0,$
DJNZ R1,TSR1;主机发置位脉冲持续600us左右
SETB P2.0;主机释放总线,P1.0口改为输入口
NOP
NOP
NOP
MOV R0,#25H
NOP
NOP
NOP
NOP
TSR2: JNB P2.0,TSR3;DS18B20数据线应变低,如果没变低,说明没准备好,需重来
DJNZ R0,TSR2;DS18B20等待64us
LJMP TSR4
TSR3: SETB 20H.1;不存在则置标志位
LJMP TSR5;不存在则重来
TSR4: CLR 20H.1;存在则清标志位
LJMP TSR7
TSR5: MOV R0,#6BH;重装初值
MOV R1,#03H
TSR6: DJNZ R0,TSR6
MOV R0,#6BH
DJNZ R1,TSR6
TSR7: SETB P2.0
LCALL DISPLAY
RET
;;;写DS18B20子程序;;;
WRITE_18B20:MOV R2,#8;设置写位个数
CLR C
WR1: CLR P2.0;写开始
NOP
NOP
DJNZ R3,$;保持整个写过程持续60us
SETB P2.0
NOP
DJNZ R2,WR1;8位完否,没完则返回
SETB P2.0
LCALL DISPLAY
RET
;;;读取温度子程序;;;
READ_18B20:MOV R4,#2
MOV R1,#36H
RE00: MOV R2,#8
RE01: CLR C
SETB P2.0
NOP
NOP
CLR P2.0
NOP
NOP
NOP
SETB P2.0
NOP
NOP
MOV C,P2.0;主机按位读入DS18B20的数据
MOV R3,#35
RE20: DJNZ R3,RE20;保证读数据过程持续60us
RRC A;数据送入A
DJNZ R2,RE01; 读完整个转换值
MOV @R1,A;A中数据送数据缓冲区
DEC R1
MOV P0,A
SETB P2.5;开个位显示
LCALL D12MS
CLR P2.5;关个位显示
MOV A,37H需要完整内容的请联系QQ752018766,本文免费,转发请注明源于www.751com.cn
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6;开十位显示
LCALL D12MS
CLR P2.6;关十位显示
MOV A,38H
MOVC A,@A+DPTR
MOV P0,A
SETB P2.7;开百位显示
LCALL D12MS
CLR P2.7;关百位显示
RET
;;;温度转换子程序;;;
TEMPER_COV: MOV A,#
ANL A,36H;舍去小数位
SWAP A
MOV 37H,A
MOV A,36H
JNB ACC.3,TEMPER_COV1;四舍五入
INC 37H
TEMPER_COV1: MOV A,35H
ANL A,#07H;舍去温度中标志位
SWAP A
ADD A,37H
MOV 37H,A;把转换后温度放入37H中
LCALL BIN_BCD
RET
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页