?? b11-8.asm
字號:
;PROGRAM NAME B11-8.ASM
MS10 EQU 9217 ;APPROXIMATELY 10MS INTERRUPR
INTR_CNT EQU 30H ;CNT STORIAGE
BUFFER EQU 31H ;DISPLAY BUFFER
BINARY EQU 32H ;BINARY DATA STORIAGE
;
CNTH_L EQU 33H
CNTH_H EQU 34H ;COUNTER FOR DUTY HI
CNTT_L EQU 35H
CNTT_H EQU 36H ;COUNTER FOR DUTY HI+LO
;
SMT160 REG P3.2 ;TEMP SENSOR
SCOPE REG P3.3 ;CHECK BY SCOPE
BUZZER REG P3.4
CHKPUL REG P3.5 ;CHECK BY SCOPE
LED REG P3.7
KEY REG P3.7
;
ORG 0000H
JMP START
ORG 0003H ;[DISABLE] EXTERNAL INT0 INTERRUPT
RETI
ORG 000BH ;[ENABLE] TIMER0 OVERFLOW INTERRUPT
JMP T0_ISR
;
ORG 0013H
RETI ;[DISABLE] EXTERNAL INT1 INTERRUPT
ORG 001BH
RETI ;[DISABLE] TIMER1 OVERFLOW INTERRUPT
ORG 0023H
RETI ;[DISABLE] SERIAL INTERRUPT
;
ORG 30H
START MOV R0,#00H
DJNZ R0,$ ;DELAY A WHILE
MOV SP,#60H
MOV P1,#FFH
MOV P3,#FFH
MOV INTR_CNT,#00H
CLR BUZZER ;P3.4=0,BUZZER OFF
CLR LED ;P3.7=0,LED OFF
CALL SET_TMR0
MOV BINARY,#00H ;BINARY DATA FOR DISPLAY
ACALL CONV ;CONVERT BINARY TO BCD
$READ CALL READ_TEMP
CALL DELAY
CALL DELAY
CALL DELAY
SJMP $READ
;
;MEASURE PULSE
READ_TEMP
SETB SCOPE
MOV R2,#00H ;DUMMY
MOV R3,#00H ;DUMMY
MOV R4,#00H ;HIGH DUTY
MOV R5,#00H
MOV R6,#00H ;TOTAL TIME
MOV R7,#00H
;
MOV R0,#5 ;CYCLE COUNT=5
$HI JB SMT160,$HI
$LO JNB SMT160,$LO
;
;LOW TO HIGH TRANSITION
CLR EA
SETB CHKPUL
LOOPH INC R4
INC R6
CJNE R4,#00H,$1
INC R5
$1 CJNE R6,#00H,$2
INC R7
$2 JB SMT160,LOOPH
LOOPL INC R6
INC R2
CJNE R6,#00H,$1
INC R7
$1 CJNE R2,#00H,$2
INC R3
$2 JNB SMT160,LOOPL
DJNZ R0,LOOPH
CLR CHKPUL
SETB EA
;
MOV CNTH_L,R4
MOV CNTH_H,R5
MOV CNTT_L,R6
MOV CNTT_H,R7
;
MOV R4,CNTH_L
MOV R5,CNTH_H
MOV R7,#00H ;(07H 06H 05H 04H)=DUTY HI
MOV R6,#00H
;
MOV 0FH,#00H ;(0FH 0EH 0DH 0CH)=212 CONSTANT
MOV 0EH,#00H
MOV 0DH,#00H
MOV 0CH,#212
CALL MUL_4BYTE ;RESULT IN (07H 06H 05H 04H)
;
MOV 0FH,#00H
MOV 0EH,#00H
MOV 0CH,CNTT_L
MOV 0DH,CNTT_H
CALL DIV_4BYTE ;(7)(6)(5)(4)/=(F)(E)(D)(C)
MOV A,04H ;GET LOWER BYTE ONLY
SUBB A,#68 ;A=(212*HI)/(HI+LO)-68
MOV BINARY,A
CALL CONV
CLR SCOPE
RET
;
;
CONV MOV A,BINARY
MOV B,#10
DIV AB ;A=A/10,B=A MOD 10
ANL A,#0FH ;A=A AND 0FH
JNZ $1
MOV A,#0FH ;IF A=00H THEN A=0FH LEADING BLANK
$1 SWAP A
ORL A,B ;A AS BCD FORM
MOV BUFFER,A ;SAVE AT BUFFER
RET
;
DELAY MOV R7,#00H
$1 MOV R6,#00H
DJNZ R6,$
DJNZ R7,$1
RET
;
T0_ISR
MOV TH0,#(65536-MS10) / 256 ;RELOAD TH0
MOV TL0,#(65536-MS10) .MOD. 256
PUSH A
PUSH PSW
PUSH 00H
;
MOV A,BUFFER
ANL A,#0FH ;GET LOW NIBBLE
SETB ACC.5 ;BIT5=1
MOV P1,A ;SHOW 1 DIGIT
MOV R0,#30H
DJNZ R0,$ ;DELAY
;inter-blanking
CLR ACC.4
CLR ACC.5
MOV P1,A ;ALL DIGIT BLANK
MOV R0,#04H
DJNZ R0,$ ;DELAY
;
MOV A,BUFFER
ANL A,#F0H ;GET HIGH NIBBLE
SWAP A ;SWAP A
SETB ACC.4 ;BIT4=1
MOV P1,A ;SHOW ANOTHER DIGIT
MOV R0,#30H
DJNZ R0,$ ;DELAY
;
CLR ACC.4
CLR ACC.5
MOV P1,A ;ALL DIGIT BLANK
;
;INTR_CNT+1
INC INTR_CNT
MOV A,INTR_CNT
CJNE A,#100,$T0_END
MOV INTR_CNT,#00H
$T0_END POP 00H
POP PSW
POP A
RETI
;
SET_TMR0
MOV A,#01H ;TIMER MODE 1
MOV TMOD,A
MOV TH0,#(65536-MS10) / 256 ;RELOAD TH0
MOV TL0,#(65536-MS10) .MOD. 256
CLR TF0 ;CLEAR TIMER0 FLAG
SETB TR0 ;TIMER0 START COUNT
SETB ET0 ;ENABLE TIMER0 INTERRUPT
SETB EA ;ENABLE SYSTEM INTERRUPT
RET
;
;ROUTINES FOR AT2051 KIT
;
;FUNCTION NAME : CLEAR_INTERNAL_DATA_MEMORY
;FUNCTION : CLEAR 4 BYTES DATA MEMORY 08H,09H,0AH,0BH
;
CLEAR_INTERNAL_DATA_MEMORY
MOV R0,#08H ;DATA MEMORY ADDR
MOV R2,#04H ;COUNT
$1 CLR A
MOV @R0,A
INC R0
DJNZ R2,$1
RET
;
;FUNCTION NAME : DATA_ADD_4BYTE
;FUNCTION : ADD 4 BYTES IN DATA MEMORY
;(R0+3)(R0+2)(R0+1)(R0)=(R0+3)(R0+2)(R0+1)(R0)+(R1+3)(R1+2)(R1+1)(R1)
;
DATA_ADD_4BYTE
MOV R2,#04H
CLR C
$1 MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,$1
RET
;
;
;FUNCTION NAME : DATA_SUBTRACT
;FUNCTION : SUBTRACT 4 BYTES,RESULT IN DATA MEMORY
;(R0+3)(R0+2)(R0+1)(R0)=(R0+3)(R0+2)(R0+1)(R0)-(R1+3)(R1+2)(R1+1)(R1)
;
DATA_SUBTRACT
MOV R2,#04H
CLR C
$1 MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,$1
RET
;
;FUNCTION NAME : DATA_COMPLEMENT
;FUNCTION : COMPLEMENT 4 BYTES IN (07)(06)(05)(04)
;
DATA_COMPLEMENT
MOV R0,#04
MOV R2,#04H ;COUNT
SETB C ;CY=1
$1 MOV A,@R0
CPL A
ADDC A,#00H ;A=A+CY
MOV @R0,A
INC R0
DJNZ R2,$1
RET
;
;
;FUNCTION NAME : INTERNAL_DATA_COMPARE
;FUNCTION : COMPARE 2 BLOCKS INTERNAL DATA MEMORY (R2) TIMES
;
INTERNAL_DATA_COMPARE
$1 MOV A,@R0
MOV B,@R1
CJNE A,B,$2
DEC R0
DEC R1
DJNZ R2,$1
$2 RET
;
;FUNCTION NAME : ACC_COMPARE
;FUNCTION : COMPARE ACC WITH (R0) IN DATA MEMORY (R2) TIMES
;
ACC_COMPARE
$1 MOV B,@R0
CJNE A,B,$2
INC R0
DJNZ R2,$1
CLR A
SJMP $3 ;IF FOUND THEN A=0
$2 MOV A,#01H ;ELSE A=1
$3 RET
;
;FUNCTION NAME :MUL_4BYTE
;FUNCTION : UNSIGNED 4 BYTE MULTIPLY
;(07H)(06H)(05H)(04H)=(07H)(06H)(05H)(04H) X (0FH)(0EH)(0DH)(0CH)
;WORKING AREA DATA MEMORY : (0BH),(0AH),(09H),(08H)
;
MUL_4BYTE
LCALL CLEAR_INTERNAL_DATA_MEMORY
MOV R3,#33 ;SHIFT COUNT
CLR C
$1 MOV R1,#0BH
MOV R2,#08H
$2 MOV A,@R1
RRC A
MOV @R1,A
DEC R1
DJNZ R2,$2
JNC $3
CLR C
MOV R0,#08H
MOV R1,#0CH
LCALL DATA_ADD_4BYTE
$3 DJNZ R3,$1
RET
;
;FUNCTION NAME :DIV_4BYTE
;FUNCTION : UNSIGNED 4 BYTE DIVIDE
;(07H)(06H)(05H)(04H)=(07H)(06H)(05H)(04H) / (0FH)(0EH)(0DH)(0CH)
;WORKING AREA DATA MEMORY :(0BH),(0AH),(09H),(08H)
;
DIV_4BYTE
LCALL CLEAR_INTERNAL_DATA_MEMORY
MOV R3,#32 ;SHIFT COUNT
CLR C
$1 MOV R1,#04H
MOV R2,#08H
$2 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,$2
MOV R0,#0BH
MOV R1,#0FH
MOV R2,#04H
LCALL INTERNAL_DATA_COMPARE
JC $3
MOV R0,#08H
MOV R1,#0CH
LCALL DATA_SUBTRACT
$3 CPL C
DJNZ R3,$1
MOV R1,#04H
MOV R2,#04H
$4 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,$4
RET
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -