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
|