ORG 1000H
AJUMP MAIN ;转跳到主程序
ORG 00BH ;中断地址
AJUMP SERVER ;中断调用
MAIN: MOV TMOD , 40H ;初始值
MOV TH0 , #5BH ;设置计时值
MOV TL0 , #20H
MOV TH1 , #00H ;设置计数值
MOV TL1 , #00H
MOV R0 , #10 ;设置1s时间
MOV A , #00H ;清空累加器
MOV 4000H , #05H ;存放最大值5米
MOV 4001H , #01H ;存放最小值1米
MOV 3000H , #00H ;清空显示数据
DATE1 ACALL DATE2 ;调用显示程序
MOV A , 3000H ;取位数据
SUBB A , 4000H ;与最大值比较
JC MIN ;当小于最大值,在于最小值比较
SET P1.1 ;发送高电平控制水泵
CLR P1.0 ;开启发射装置
ACALL D1MS
CLR P1.1 ;停止发送
SET P1.0 ;关闭发射装置
AJUMP HEAR ;等待1s中断
MIN: SUB A 4001H ;与最小值比较
JC HEAR ;等待采集数据
SET P1.1 ;关闭水泵
CLR P1.0 ;开启发射装置
ACALL D1MS
CLR P1.1 ;停止发送
SET P1.0 ;关闭发射装置
HEAR: AJMP HEAR ;等待1s中断
AJMP DATE1 ;重新取数据
********TO中断程序(T0计时器,T1计数器)******
SERVER: PUSH A
PUSH B
PUSH DPL
PUSH DPH ;保护现场
CLR TR0
CLR ET0 ;关中断
DEC R0
JNZ R0 T2 ;是否到了1S,否则跳到T2
CLR TR1
CLR ET1 ;停止计数
MOV A , TH1 ;将高八位的计数值存放A中
MOV B , TL1 ;将低八位的计数值存放B中
MOV 5001H ,B
CZ A , F0 ;判断是否大于256
MOV 5000H , #25
F0: MOV B , #10
MOV A , 5001H
DIV AB
ADDC A, 5000H
MOV 3000H , A ;存放水位值
MOV TL1 , #00H
MOV TH1 , #00H ;计数值清零
SETB TR1
SETB ET1 ;启动计数
T2: MOV TH0, #5BH ;设置计时值
MOV TL0 #20H
SETB TR0
SETB ET0 ;开计时中断
POP A
POP B
POP DPL
POP DPH ;恢复现场
RETI ;转到显示程序
********显示程序*********
DATE2: MOV A , 3000H ;取水位数据
MOV B , #10 ;分离整数和最小值
DIV AB ;整数放A,小数放B
ACALL CHAIAO ;调用查表
ADD A , #80H ;加小数点代码
MOV P2 , A ;显示整数的数值
MOV A , B ;取小数值
ACALL CHABIAO ;调用查表
MOV P0 , A ;显示小数的数值
RET ;返回
TABLE: DB 3FH, 06H, 5BH, 4FH, 66H ;0,1,2,3,4,
DB 6DH, 7DH, 07H, 7FH, 6FH ;5.6.7.8.9
CHABIAO: PUSH DPH ;保护现场
PUSH DPL
MOV DPTR , #TABLE
MOVC A, @A+DPTR
POP DPL
POP DPH ;恢复现场
RET
D1MS: MOV R7, #80 ;延时1MS子程序
DJNZ R7, $
RET
END