📄 adc_lpc915.a51
字号:
timer0_L data 2Ah
P_RX_H DATA 2BH
P_RX_E DATA 2CH
P_TX_H DATA 2DH
P_TX_E DATA 2EH ;R1
UART_BUF_S DATA 2FH ;BIT 变量只能在地址20H到2fH http://www.keil.com/support/docs/1903.htm
REC_CH BIT UART_BUF_S.0
TX_END BIT UART_BUF_S.1
REC_OVERWRITE BIT UART_BUF_S.2
TX_FULL BIT UART_BUF_S.3
CONTINUE_ADC BIT UART_BUF_S.4
RX_BUF DATA 30H
TX_BUF DATA 34H
GREEN_LED BIT P0.3
;IR DATA USING R0~R4 IN SET 1
_UCFG1 EQU FOSC OR (WDSE SHL 4) OR (BOE SHL 5) OR (RPD SHL 6) OR (WDTE SHL 7)
_UCFG2 EQU 0
CSEG AT 0FF00H
DB _UCFG1 ; place UCFG Bytes in hex file
DB _UCFG2
DB BOOTVEC
DB BOOTSTAT
CSEG AT 0FF04H
DB SEC0
DB SEC1
DB SEC2
DB SEC3
DB SEC4
DB SEC5
DB SEC6
DB SEC7
CSEG AT 0
JMP STARTUP1
CSEG AT 3 ;EXT0
RETI
; LJMP INT_EXT0
CSEG AT 0xB ;timer0
Ljmp int_timer0
RETI
CSEG AT 0x13
RETI
CSEG AT 0x1B ;time1
; INC TIME_T ;INC NOT CHANGE FLAGS
RETI
CSEG AT 0x23 ;Rx/Tx INT OR Rx ONLY SEE SSTAT.5
; RETI
LJMP UART_Rx_Tx
CSEG AT 0x2B
RETI
CSEG AT 0x33
RETI
; LJMP I2C_INT
CSEG AT 0x3B
RETI
CSEG AT 0x43
RETI
CSEG AT 0x4B
RETI
CSEG AT 0x53
RETI
CSEG AT 0x5B
RETI
CSEG AT 0x63
RETI
CSEG AT 0x6B
RETI
CSEG AT 0x73 ; ADC
LJMP INT_ADC
RETI
CSEG AT 0x7B
RETI
; DSEG AT 040H
; o_buf data 040H ;20 data
; d1_buf data 054H ;16 data
; out_data data 064H ;ADC out data
CSEG AT 080H
STARTUP1:
CLR GREEN_LED
MOV SP,#8 ;SET0
CALL INT_PRIORITY_SET
CALL UART_INIT
CALL ADC_INIT
call timer0_init
; JNB REC_CH,START_1
; CALL GET_CH
; CALL WRITE_CH
PC_COMMAND:
JNB REC_CH,$
CALL GET_CH
CJNE A,#01H,PC_C_1
;START ADC HERE
; MOV ADMODA,#10H ;SINGLE CONVERSION MODE
CLR CONTINUE_ADC
setb ET0
JMP PC_COMMAND
PC_C_1:
CJNE A,#0H,PC_C_2
;STOP ADC HERE
CLR ET0
MOV ADCON1,#44H ; CLEAR ADCI1 AND START
JMP PC_COMMAND
PC_C_2:
CJNE A,#02,PC_C_3
;SET ADC 9600 HERE
; MOV ADMODA,#10H ;SINGLE CONVERSION MODE
CLR CONTINUE_ADC
mov timer0_H,#0E8H ;9600 at 11.0592MHz 110592./9.6/2=576,TL0 +6 =6H
mov timer0_L,#6H ;9600 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_3:
CJNE A,#03,PC_C_4
;SET ADC 19200 HERE
CLR CONTINUE_ADC
mov timer0_H,#0F7H ;19200 at 11.0592MHz 110592./19.2/2=288,TL0 +6 =6H
mov timer0_L,#6H ;19200 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_4:
CJNE A,#04,PC_C_5
;SET ADC 38400 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FCH ;38400 at 11.0592MHz 110592./38.4/2=144,TL0 +6 =16H
mov timer0_L,#16H ;38400 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_5:
CJNE A,#05,PC_C_6
;SET ADC 57600 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FDH ;57600 at 11.0592MHz 110592./57.6/2=96,TL0 +6 =6H
mov timer0_L,#6H ;57600 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_6:
CJNE A,#06,PC_C_7
;SET ADC 57600 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FDH ;57600 at 11.0592MHz 110592./57.6/2=96,TL0 +6 =6H
mov timer0_L,#6H ;57600 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_7:
CJNE A,#07,PC_C_8
;SET ADC 115200 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FEH ;115200 at 11.0592MHz 110592./115.2/2=48,TL0 +6 =16H
mov timer0_L,#16H ;115200 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_8:
CJNE A,#08,PC_C_9
;SET ADC 153600 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FEH ;138240 at 11.0592MHz 110592./138.24/2=40,TL0 +6 =1EH
mov timer0_L,#1EH ;138240 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_9:
CJNE A,#09,PC_C_10
;SET ADC 153600 HERE
CLR CONTINUE_ADC
mov timer0_H,#0FFH ;153600 at 11.0592MHz 110592./153.6/2=36,TL0 +6 =2H
mov timer0_L,#2H ;153600 at 11.0592MHz
setb ET0
JMP PC_COMMAND
PC_C_10:
CJNE A,#10H,PC_C_11
;SET ADC CONTINUE HERE
; MOV ADMODA,#20H ;SINGLE CONVERSION MODE
SETB CONTINUE_ADC
MOV ADMODA,#10H ;SINGLE CONVERSION MODE
MOV ADCON1,#45H ;START ADC
JMP PC_COMMAND
;BIT1:0=01 Immediate Start mode,BIT2 ENADC1,BIT3 ADCI1 CLEAR IN INT,BIT6 ENADCI1
PC_C_11:
JMP PC_COMMAND
INT_PRIORITY_SET:
; MOV IP0H,#1 ;IE0
MOV IP0H,#2 ;TIMER0
MOV IP0,#2 ;TIMER0
; MOV IP0H,#8 ;TIME1
; MOV IP0,#3 ;IE0,TIMER0
; MOV IP0,#0BH ;IE0,TIMER0,TIME1
RET
timer0_init: ;7.373MHz/
; mov timer0_H,#0FCH ;38400 at 11.0592MHz 110592./38.4/2=144,TL0 +6 =16H
; mov timer0_L,#16H ;38400 at 11.0592MHz
; mov timer0_H,#0FDH ;57600 at 11.0592MHz 110592./57.6/2=96,TL0 +6 =6H
; mov timer0_L,#6H ;57600 at 11.0592MHz
; mov timer0_H,#0FEH ;115200 at 11.0592MHz 110592./115.2/2=48,TL0 +6 =16H
; mov timer0_L,#16H ;115200 at 11.0592MHz
; mov timer0_H,#0FFH ;197486 at 11.0592MHz 110592./197.486/2=28,TL0 +6 =0AH
; mov timer0_L,#0AH ;197486 at 11.0592MHz
mov timer0_H,#0FEH ;115200 at 11.0592MHz 110592./115.2/2=48,TL0 +6 =16H
mov timer0_L,#16H ;115200 at 11.0592MHz
MOV TMOD,#20H
MOV TH0,timer0_H
; MOV TL0,timer0_OFF_L
setb TR0
; setb ET0
setb EA
ret
;ADC_START:
; MOV ADCON1,#45H
; ;BIT1:0=01 Immediate Start mode,BIT2 ENADC1,BIT3 ADCI1 CLEAR IN INT,BIT6 ENADCI1
; RET
ADC_INIT:
MOV ADINS,#10H ;AIN10
MOV ADMODA,#10H ;SINGLE CONVERSION MODE
; MOV ADMODB,#60H;BIT 7:5 + 1 = DIVISOR NOW IS 4 ,BIT 3 DAC MODE
; ;ADC CLOCK = 11.0592/4 = 2.7648MHz ADC TIME = 13*1/F = 4.7 uS
MOV ADMODB,#40H;BIT 7:5 + 1 = DIVISOR NOW IS 3, BIT 3 DAC MODE
;ADC CLOCK = 11.0592/3 = 3.6864MHz ADC TIME = 13*1/F = 3.52 uS
CLR CONTINUE_ADC
SETB EAD
RET
UART_INIT:
ANL P1M1,#11111100B
ANL P1M2,#11111100B
MOV SSTAT,#0 ; Rx / Tx INT
MOV SCON,#50H ;SM0 & REN
MOV BRGCON,#0 ;must CLR BRGCON.0 TO ENABLE SET BRGR1&BRGR0
; MOV BRGR1,#2H ;9600 at 7.373MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
; MOV BRGR0,#0F0H
; MOV BRGR1,#1H ;19200 AT 7.373MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
; MOV BRGR0,#70H
; MOV BRGR1,#2H ;19200 AT 11.0592MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
; MOV BRGR0,#30H
; MOV BRGR1,#0H ;115200 AT 11.0592MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
; MOV BRGR0,#50H
; MOV BRGR1,#0H ;460800 AT 11.0592MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
; MOV BRGR0,#8H
MOV BRGR1,#0H ;115200 AT 11.0592MHz BRGR1,BRGR0=(CCLK/BAND RADE)-16
MOV BRGR0,#50H
MOV BRGCON,#3
MOV P_RX_H,#LOW RX_BUF
MOV P_RX_E,#LOW RX_BUF
MOV P_TX_H,#LOW TX_BUF
; MOV P_TX_E,#LOW TX_BUF
MOV R1,#LOW TX_BUF
SETB TX_END
CLR REC_CH
CLR REC_OVERWRITE
CLR TX_FULL
SETB ES ;ENABLE UART INT
SETB EA ;ENABLE INTERUPT
RET
GET_CH: ;RETURN IN A,ERR RETURN C
JB REC_CH,GET_C_0
SETB C
JMP GET_C_END
GET_C_0:
PUSH 0
MOV R0,P_RX_H
MOV A,@R0
MOV R0,A
INC P_RX_H
MOV A,P_RX_H
CJNE A,#LOW TX_BUF,GET_C_1
MOV P_RX_H,#LOW RX_BUF
MOV A,P_RX_H
GET_C_1:
CJNE A,P_RX_E,GET_C_E1
CLR REC_CH
GET_C_E1:
MOV A,R0
CLR REC_OVERWRITE
POP 0
GET_C_END:
RET
WRITE_CH: ;DATA IN A ,IF FAULT SET C
JNB TX_FULL, WRITE_C_1
SETB C
JMP WRITE_C_END
WRITE_C_1:
MOV @R1,A
INC R1
CJNE R1,#80H,WRITE_C_2
MOV R1,#LOW TX_BUF
WRITE_C_2:
XCH A,R1
CJNE A,P_TX_H,WRITE_C_3
SETB TX_FULL
WRITE_C_3:
XCH A,R1
CLR C
JNB TX_END,WRITE_C_END
CLR TX_END
MOV SBUF,A
WRITE_C_END:
RET
int_timer0: ;************************ INT_TIMER0 ****************
push psw
MOV TL0,timer0_L
MOV TH0,timer0_H
MOV ADCON1,#45H ;START ADC
;BIT1:0=01 Immediate Start mode,BIT2 ENADC1,BIT3 ADCI1 CLEAR IN INT,BIT6 ENADCI1
pop psw
RETI
UART_Rx_Tx:
PUSH PSW
PUSH 0
PUSH ACC
CLR RS0 ; NEED IT WHEN USING R0~R7
; CLR RS1
JNB RI,UART_TX
CLR RI
MOV R0,P_RX_E
MOV @R0,SBUF
SETB REC_CH
INC P_RX_E
MOV R0,P_RX_E
CJNE R0,#LOW TX_BUF,UART_RX_1
MOV P_RX_E,#LOW RX_BUF
UART_RX_1:
MOV A,P_RX_E
CJNE A,P_RX_H,UART_END
SETB REC_OVERWRITE
INC P_RX_H
MOV R0,P_RX_H
CJNE R0,#LOW TX_BUF,UART_END
MOV P_RX_H,#LOW RX_BUF
JMP UART_END
UART_TX:
CLR TI
CLR TX_FULL
INC P_TX_H
UART_TX_1:
MOV A,P_TX_H
CJNE A,#80H,UART_TX_2
MOV P_TX_H,#LOW TX_BUF
MOV A,P_TX_H
UART_TX_2:
CJNE A,1,UART_TX_3;1:R1 : P_TX_E
SETB TX_END
JMP UART_END
UART_TX_3:
MOV R0,P_TX_H
MOV SBUF,@R0
UART_END:
POP ACC
POP 0
POP PSW
RETI
INT_ADC:
PUSH PSW
PUSH ACC
ANL ADCON1,#0F7H; CLEAR ADCI1
JNB TX_FULL, INT_WRITE_C_1
MOV ADCON1,#44H ; CLEAR ADCI1 AND START
CLR ET0
MOV ADMODA,#10H ;SINGLE CONVERSION MODE
JMP INT_ADC_END
INT_WRITE_C_1:
MOV A,AD1DAT0
JNB CONTINUE_ADC,INT_ADC_NO_CONTINUE
MOV ADCON1,#45H
INT_ADC_NO_CONTINUE:
MOV @R1,A
INC R1
CJNE R1,#80H,INT_WRITE_C_2
MOV R1,#LOW TX_BUF
INT_WRITE_C_2:
XCH A,R1
CJNE A,P_TX_H,INT_WRITE_C_3
SETB TX_FULL
INT_WRITE_C_3:
XCH A,R1
JNB TX_END,INT_WRITE_C_END
CLR TX_END
MOV SBUF,A
INT_WRITE_C_END:
INT_ADC_END:
POP ACC
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -