- ;基于18B20的51單片機溫度控制器匯編程序
- DQ EQU P3.0 ;1820數據端
- ST EQU P1.1 ;設置鍵
- UP EQU P1.2 ;加一鍵
- DN EQU P1.0 ;減一鍵
- RISE EQU P2.0 ;加溫位
- DEL_V EQU 30H ;延時值
- WAIT_V EQU 31H ;
- LOOP_V EQU 32H ;循環次數
- TEM_L EQU 33H ;低位讀數
- TEM_H EQU 34H ;高位讀數
- TEM_L1 EQU 35H ;顯示值1
- TEM_L2 EQU 36H ;顯示值2
- TEM_H1 EQU 37H ;顯示值3
- TEM_H2 EQU 38H ;顯示值4
- DAT EQU 39H ;將學入1820的數據
- R_DAT EQU 40H ;從1820讀出的值
- SET_T1 EQU 41H ;溫度設定值高位
- SET_T2 EQU 42H ;溫度設定值中位
- SET_T3 EQU 43H ;溫度設定值低位
- HIGH1 EQU 44H ;高溫上限
- HIGH2 EQU 45H
- HIGH3 EQU 46H
- LOW1 EQU 47H ;低溫下限
- LOW2 EQU 48H
- LOW3 EQU 49H
- SET_N EQU 50H ;設置狀態的閃爍次數
- DIS_V EQU 51H ;需要顯示的值
- WARN EQU 52H ;低溫報警極限
- CTER1 EQU 54H ;
- CTER2 EQU R3
- FLAG EQU R2 ;顯示標志
- CONTER EQU 53H ;閃爍頻率調節值
- SCLK EQU P1.3 ;74164時鐘輸入
- IO EQU P3.3 ;74164數據輸入
- SET_F BIT 00H ;設置標志
- FLASH BIT 01H ;閃爍標志
- FIRST BIT 02H ;首次標志
- WARN_F BIT P0.2 ;報警位
- WARN_N EQU R1 ;報警位被置低的次數
- ADD_L BIT P0.0 ;加溫位(加溫LED)
- DOWN_L BIT P0.1 ;降溫位(降溫LED)
- ORG 0000H
- AJMP MAIN
- ORG 000BH
- LJMP INT
- ORG 0100H
- MAIN: MOV FLAG,#0
- SETB FIRST
- CLR SET_F
- SETB P3.7
- SETB WARN_F
- MOV WARN_N,#0
- MOV CONTER,#140
- MOV TMOD,#01H
- MOV TH0,#0FCH
- MOV TL0,#18H
- MOV CTER1,#1
- MOV CTER2,#123
- SETB EA
- SETB ET0
- CLR TR0
- MOV SET_T1,#3
- MOV SET_T2,#6
- MOV SET_T3,#0
- MOV HIGH1,#3
- MOV HIGH2,#6
- MOV HIGH3,#5
- MOV LOW1,#3
- MOV LOW2,#5
- MOV LOW3,#5
- MOV WARN,#33H
- ;LCALL ADOPT
- LCALL RESET ;先轉換一次
- MOV DAT,#0CCH
- LCALL WRITE
- MOV DAT,#44H
- LCALL WRITE
- LCALL DELAY1S
- AGAIN: CLR TR0
- LCALL READ_T ;讀溫度
- SETB TR0
- LCALL WORK ;進行數值處理
- LCALL JUDGE ;判斷溫度是否超界
- INC CTER1 ;防止誤判寄存器1
- JB FIRST,CON13
- LCALL CONFIG ;判斷溫度是否低于報警值
- CON13: JB ST,CON
- LCALL K_DEL
- JB ST,CON
- JNB ST,$
- MOV SET_N,#20
- SETB SET_F
- LCALL SET_T ;進行溫度值設置
- CLR SET_F
- CON: LCALL DELAY1S
- AJMP AGAIN
- ;*******************************
- CONFIG: MOV A,TEM_H2
- SWAP A
- ORL A,TEM_L1
- SUBB A,WARN
- JNC NORMAL
- INC WARN_N ;防止誤報警
- CJNE WARN_N,#5,NORMAL
- MOV WARN_N,#0
- CLR WARN_F
- NORMAL: RET
- ;********************************
- JUDGE: MOV A,HIGH1 ;判斷溫度是否出界
- CJNE A,TEM_H2,JUDGE1
- AJMP JUDGE2
- JUDGE1: CLR C
- SUBB A,TEM_H2
- JNC JUDGE3
- AJMP DOWN_T
- JUDGE2: MOV A,HIGH2
- CJNE A,TEM_L1,JUDGE4
- AJMP JUDGE5
- JUDGE4: CLR C
- SUBB A,TEM_L1
- JNC JUDGE3
- AJMP DOWN_T
- JUDGE5: MOV A,HIGH3
- CJNE A,TEM_L2,JUDGE6
- AJMP JUDGE3
- JUDGE6: CLR C
- SUBB A,TEM_L2
- JNC JUDGE3
- DOWN_T: CLR RISE
- CLR DOWN_L
- SETB ADD_L
- SETB WARN_F
- MOV A,CTER2
- CJNE A,CTER1,FALSE
- CLR FIRST
- FALSE: MOV CTER2,CTER1
- INC CTER2
- RET
- JUDGE3: MOV A,TEM_H2
- CJNE A,LOW1,JUDGE7
- AJMP JUDGE8
- JUDGE7: CLR C
- SUBB A,
- LOW1
- JNC JUDGE9
- AJMP ADD_T
- JUDGE8: MOV A,TEM_L1
- CJNE A,LOW2,JUDGE10
- AJMP JUDGE11
- JUDGE10:CLR C
- SUBB A,LOW2
- JNC JUDGE9
- AJMP ADD_T
- JUDGE11:MOV A,TEM_L2
- CJNE A,LOW3,JUDGE12
- AJMP JUDGE9
- JUDGE12:CLR C
- SUBB A,LOW3
- JNC JUDGE9
- ADD_T: SETB RISE
- SETB DOWN_L
- CLR ADD_L
- JUDGE9: RET
- ;********************************
- SET_T: ;MOV TEM_H1,#0 ;溫度設置子程序
- MOV TEM_H2,SET_T1
- MOV TEM_L2,SET_T3
- MOV TEM_L1,SET_T2
- JNB SET_F,SET_OK
- JB ST,CON1
- LCALL K_DEL
- JB ST,CON1
- JNB ST,$
- SET_OK: LCALL ADOPT
- SETB WARN_F
- SETB FIRST
- RET
- CON1: JB UP,CON2
- LCALL K_DEL
- JB UP,CON2
- MOV SET_N,#20
- JNB UP,$
- MOV A,SET_T3
- ADD A,#5
- CJNE A,#0AH,CON3
- MOV SET_T3,#0
- AJMP CON4
- CON3: MOV SET_T3,#5
- AJMP SET_T
- CON4: MOV A,SET_T2
- INC A
- CJNE A,#0AH,CON5
- MOV SET_T2,#0
- AJMP CON6
- CON5: MOV SET_T2,A
- AJMP SET_T
- CON6: MOV A,SET_T1
- INC A
- CJNE A,#0AH,CON7
- MOV SET_T1,#0
- MOV SET_T2,#0
- MOV SET_T3,#0
- AJMP SET_T
- CON7: MOV SET_T1,A
- CON2: JB DN,SET_T
- LCALL K_DEL
- JB DN,SET_T
- MOV SET_N,#20
- JNB DN,$
- MOV A,SET_T3
- ADD A,#5
- CJNE A,#0AH,CON8
- MOV SET_T3,#0
- AJMP SET_T
- CON8: MOV SET_T3,#5
- CON9: MOV A,SET_T2
- DEC A
- CJNE A,#0FFH,CON10
- MOV SET_T2,#9
- AJMP CON11
- CON10: MOV SET_T2,A
- AJMP SET_T
- CON11: MOV A,SET_T1
- DEC A
- CJNE A,#0FFH,CON12
- MOV SET_T1,#9
- MOV SET_T2,#9
- MOV SET_T3,#5
- AJMP SET_T
- CON12: MOV SET_T1,A
- AJMP SET_T
- ;*******************************
- ADOPT: MOV A,SET_T3 ;計算高溫和低溫下限子程序
- ADD A,#5
- CJNE A,#0AH,CO3
- MOV HIGH3,#0
- AJMP CO4
- CO3: MOV HIGH3,#5
- MOV HIGH2,SET_T2
- MOV HIGH1,SET_T1
- AJMP CO9
- CO4: MOV A,SET_T2
- INC A
- CJNE A,#0AH,CO5
- MOV HIGH2,#0
- AJMP CO6
- CO5: MOV HIGH2,A
- MOV HIGH1,SET_T1
- AJMP CO9
- CO6: MOV A,SET_T1
- INC A
- CJNE A,#0AH,CO7
- MOV HIGH1,#9
- MOV HIGH2,#9
- MOV HIGH3,#9
- AJMP CO9
- CO7: MOV HIGH1,A
- CO9: MOV A,SET_T3
- ADD A,#5
- CJNE A,#0AH,CO8
- MOV LOW3,#0
- MOV LOW1,SET_T1
- MOV LOW2,SET_T2
- AJMP CO13
- CO8: MOV LOW3,#5
- MOV A,SET_T2
- DEC A
- CJNE A,#0FFH,CO10
- MOV LOW2,#9
- AJMP CO11
- CO10: MOV LOW2,A
- MOV LOW1,SET_T1
- AJMP CO13
- CO11: MOV A,SET_T1
- DEC A
- CJNE A,#0FFH,CO12
- MOV LOW1,#0
- MOV LOW2,#0
- MOV LOW3,#0
- AJMP CO13
- CO12: MOV LOW1,A
- CO13: MOV A,LOW1 ;計算報警溫度
- SWAP A
- ORL A,LOW2
- DEC A
- MOV WARN,A
- ANL A,#0FH
- CJNE A,#0FH,CO14
- MOV A,WARN
- SUBB A,#6
- MOV WARN,A
- CO14: MOV A,WARN
- DEC A
- MOV WARN,A
- ANL A,#0FH
- CJNE A,#0FH,CO15
- MOV A,WARN
- SUBB A,#6
- MOV WARN,A
- CO15: RET
- ;*******************************
- WORK: MOV A,TEM_L ;將讀出的值進行處理得到顯示值
- ANL A,#0FH
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR
- MOV TEM_L2,A
- LOOP4: MOV A,TEM_L
- ANL A,#0F0H
- ORL A,TEM_H
- SWAP A
- MOV B,#100
- DIV AB
- MOV TEM_H1,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOV TEM_H2,A
- MOV TEM_L1,B
- RET
- ;*****************************
- RESET: SETB DQ
- NOP
- NOP
- CLR DQ
- MOV DEL_V,#55
- LCALL DELAY
- SETB DQ
- MOV WAIT_V,#18
- LOOP1: MOV DEL_V,#6
- LCALL DELAY
- JNB DQ,R_
- OK
- DJNZ WAIT_V,RESET
- R_OK: ;SETB TR0
- MOV DEL_V,#50 ;4444
- LCALL DELAY
- ;CLR TR0
- RET
- ;********************************
- WRITE: MOV A,DAT
- MOV LOOP_V,#8
- LOOP2: SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- RRC A
- MOV DQ,C
- MOV DEL_V,#7
- LCALL DELAY
- DJNZ LOOP_V,LOOP2
- SETB DQ
- NOP
- NOP
- NOP
- RET
- ;**********************************
- READ: MOV LOOP_V,#8
- LOOP3: SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- SETB DQ
- NOP
- NOP
- MOV C,DQ
- RRC A
- MOV DEL_V,#7
- LCALL DELAY
- DJNZ LOOP_V,LOOP3
- MOV R_DAT,A
- RET
- ;***********************************
- READ_T: LCALL RESET
- MOV DAT,#0CCH
- LCALL WRITE
- MOV DAT,#0BEH
- LCALL WRITE
- LCALL READ
- MOV TEM_L,R_DAT
- LCALL READ
- MOV TEM_H,R_DAT
- LCALL RESET
- MOV DAT,#0CCH
- LCALL WRITE
- MOV DAT,#044H
- LCALL WRITE
- RET
- ;***********************************
- DELAY: MOV R6,DEL_V
- DEL1: MOV R7,#5
- DJNZ R7,$
- DJNZ R6,DEL1
- RET
- ;**********************************
- DELAY1S:MOV R5,#10
- DEL3: MOV R6,#200
- DEL2: MOV R7,#200
- DJNZ R7,$
- DJNZ R6,DEL2
- DJNZ R5,DEL3
- RET
- ;**********************************
- K_DEL: MOV R6,#100
- DEL4: MOV R7,#50
- DJNZ R7,$
- DJNZ R6,DEL4
- RET
- ;***********************************
- INT: PUSH ACC
- MOV TH0,#0F8H
- MOV TL0,#1FH
- CJNE FLAG,#0,NEXT
- MOV FLAG,#1
- MOV A,TEM_L1
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- ANL A,#7FH
- MOV DIS_V,A
- SETB P3.4
- LCALL ENABLE
- CLR P3.5
- AJMP DISPLAY
- NEXT: CJNE FLAG,#1,NEXT2
- MOV FLAG,#2
- MOV A,TEM_L2
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV DIS_V,A
- SETB P3.5
- LCALL ENABLE
- CLR P3.6
- AJMP DISPLAY
- NEXT2: MOV FLAG,#0
- MOV A,TEM_H2
- CJNE A,#0,DIS
- MOV A,#10
- DIS: MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV DIS_V,A
- SETB P3.6
- LCALL ENABLE
- CLR P3.4
- DISPLAY:JNB SET_F,NOTOVER
- JB FLASH,N_FLA
- ORL P3,#70H
- N_FLA: DJNZ CONTER,NOTOVER
- MOV CONTER,#140
- CPL FLASH
- DJNZ SET_N,NOTOVER
- CLR SET_F
- NOTOVER:POP ACC
- RETI
- ;*****************************
- ENABLE: CLR SCLK
- MOV A,DIS_V
- MOV R4,#8
- ENAB1: RRC A
- CLR SCLK
- NOP
- NOP
- MOV IO,C
- NOP
- NOP
- SETB SCLK
- DJNZ R4,ENAB1
- RET
- ;*****************************
- ORG 0900H
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
- TAB1: DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
- END
復制代碼 |