📄 b13-10.asm
字号:
;PROGRAM NAME B13-10.ASM
BPS9600 EQU FDH
OUT_CNT EQU 8
MS10 EQU 9217 ;APPROXIMATELY 10MS INTERRUPR
;
INTR_CNT EQU 30H ;CNT STORIAGE
BUFFER EQU 31H ;DISPLAY BUFFER
BINARY EQU 32H ;BINARY DATA STORIAGE
ASCBUF EQU 33H ;ASCII TEMPERATURE DATA BUFFER(8 BYTES)
TX_CNT EQU 3BH ;TRANSMIT BYTE COUNT
;
CNTH_L EQU 3CH
CNTH_H EQU 3DH ;COUNTER FOR DUTY HI
CNTT_L EQU 3EH
CNTT_H EQU 3FH ;COUNTER FOR DUTY HI+LO
SIN_BUF EQU 40H ;8 BYTE
;
EE_ID EQU 2FH ;ID READ FROM 24LC16
BEEP EQU 2EH ;BUZZER ON TIME
SIN_CNT EQU 2DH ;SERIAL INPUT COUNT
;
SCLK REG P1.7 ;SERIAL CLOCK
SDA REG P1.6 ;SERIAL DATA
SMT160 REG P3.2 ;TEMP SENSOR
CH1 REG P3.3 ;CHECK BY SCOPE,SIO_ISR
BUZZER REG P3.4
CH2 REG P3.5 ;CHECK BY SCOPE,T0_ISR
LED REG P3.7
KEY REG P3.7
;
SAMPLING REG 20H.0
TX_START REG 20H.1
;
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
JMP SIO_ISR ;[ENABLE] 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
MOV SIN_CNT,#00H
CLR TX_START
MOV TX_CNT,#00H
CLR BUZZER ;P3.4=0,BUZZER OFF
CLR LED ;P3.7=0,LED OFF
CALL SET_TMR0
MOV BUFFER,#FFH ;BLANK DISPLAY
CLR SAMPLING
CALL CHECK_EE
CALL READ_ID
;
$WAIT JNB SAMPLING,$WAIT
JB TX_START,$WAIT
CALL READ_TEMP
CLR SAMPLING
SJMP $WAIT
;
SIO_ISR SETB CH1
PUSH A
PUSH PSW
PUSH 00H
PUSH 01H
JNB RI,$CHK_TI
CLR RI
;
;CHECK COMMAND STRING
MOV A,#SIN_BUF ;A=40H
ADD A,SIN_CNT ;A=40H+(SIN_CNT)
MOV R0,A
MOV A,SBUF
MOV @R0,A
INC SIN_CNT ;SIN_CNT+1
CJNE A,#0AH,$CHK_TI
;
;"IDx?" COMMAND CHECK
MOV R0,#SIN_BUF
CJNE @R0,#'I',$ERR_C
;1ST BYTE
INC R0
CJNE @R0,#'D',$ERR_C
;2ND BYTE
INC R0
MOV A,EE_ID
ADD A,#'0' ;CONVERT TO ASCII CODE
MOV B,A
MOV A,@R0
CJNE A,B,$ERR_C
;3RD BYTE(CHECK ID)
INC R0
CJNE @R0,#'?',$ERR_C
;3RD BYTE('?' CHECK)
INC R0
CJNE @R0,#0DH,$ERR_C
;4TH BYTE(CARRIAGE RETURN)
INC R0
CJNE @R0,#0AH,$ERR_C
;5TH BYTE(LINE FEED)
;ALL CODES ARE CORRECT!!
$OK MOV R0,#SIN_BUF
MOV R1,#8
$1 MOV @R0,#00H
DJNZ R1,$1 ;CLEAR SIN_BUFFFER
MOV SIN_CNT,#00H ;CLEAR SIN_CNT
;
SETB TX_START
MOV TX_CNT,#00H ;TX_CNT=0
SETB TI
SETB LED ;LED ON
;
$ERR_C MOV SIN_CNT,#00H
;
$CHK_TI JNB TI,$NO_TX
JNB TX_START,$NO_TX
CLR TI
MOV A,TX_CNT
MOV R0,#ASCBUF
ADD A,R0
MOV R0,A
MOV A,@R0
MOV SBUF,A
INC TX_CNT ;TX_CNT=TX_CNT+1
MOV A,TX_CNT
CJNE A,#OUT_CNT,$ISRE
CLR TX_START ;STOP TX
MOV TX_CNT,#00H
CLR LED ;LED OFF
$ISRE
$NO_TX POP 01H
POP 00H
POP PSW
POP A
CLR CH1
RETI
;
T0_ISR SETB CH2
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
MOV A,INTR_CNT
JNZ $NEXT
SETB SAMPLING ;IF A=0 OR A=50 THEN SAMPLING=1
SJMP $INC
$NEXT CJNE A,#50,$INC
SETB SAMPLING
$INC INC INTR_CNT
MOV A,INTR_CNT
CJNE A,#100,$T0_END
MOV INTR_CNT,#00H
;CHECK BUZZER
$T0_END MOV A,BEEP
JZ $NOBEEP
DEC BEEP
SETB BUZZER
SJMP $END
$NOBEEP CLR BUZZER
$END POP 00H
POP PSW
POP A
CLR CH2
RETI
;
;MEASURE PULSE
READ_TEMP
CLR EA
$HI JB SMT160,$HI
$LO JNB SMT160,$LO
;LOW TO HIGH TRANSITION
H_ONLY MOV DPTR,#0000H
MOV R0,#10 ;READ COUNT
$0 INC DPTR
JB SMT160,$0
$1 JNB SMT160,$1 ;SKIP LO
DJNZ R0,$0
MOV R4,DPL
MOV R5,DPH
;
H_L MOV DPTR,#0000H
MOV R0,#10
$HI JB SMT160,$HI
$LO JNB SMT160,$LO
$0 INC DPTR
JB SMT160,$0
$1 INC DPTR
JNB SMT160,$1
DJNZ R0,$0
MOV R6,DPL
MOV R7,DPH
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
TEST CALL CONV ;DATA IN BUFFER
CALL ASC_CONV
RET
;
;
ASC_CONV
MOV ASCBUF ,#'T'
MOV A,EE_ID
ADD A,#'0' ;ID=ID+'0'
MOV ASCBUF+1,A
MOV ASCBUF+2,#'='
MOV A,BUFFER
SWAP A
ANL A,#0FH
ADD A,#'0'
MOV ASCBUF+3,A ;SAVE DIGIT1
MOV A,BUFFER
ANL A,#0FH
ADD A,#'0'
MOV ASCBUF+4,A ;SAVE DIGIT2
MOV ASCBUF+5,#'C'
MOV ASCBUF+6,#0DH ;CARRIAGE RETURN
MOV ASCBUF+7,#0AH ;LINE FEED
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
;
SET_TMR0
MOV A,#21H ;TIMER1 MODE2,TIMER0 MODE1
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
MOV SCON,#50H ;8BIT DATA OUTPUT
MOV TH1,#BPS9600 ;BAUD RATE 9600BPS
SETB TR1 ;TIMER1 START COUNT
SETB ET0 ;ENABLE TIMER0 INTERRUPT
SETB ES ;ENABLE SERIAL 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -