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
|