📄 shxj1.asm
字号:
NOP ;等待延时
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB AD0EN ;使能ADC0,再采集
CLR AD0INT ;清除转换中断
SETB AD0BUSY ;Start ADC0
JNB AD0INT,$ ;此处硬件清除UART0中断使能
MOV A,ADC0L
MOV DEEP_BUF6,A ;low 8 bits of depth data save to DEEP_BUF6
MOV A,ADC0H
ANL A,#0FH ;save high 4 bits only
MOV DEEP_BUF7,A ;4 high bits save to DEEP_BUF7
CLR AD0INT
CLR AD0EN
RET
;----------------------------------------------------//所采集数据转换为BCD码\\----------------------------------------------------------
CONV: MOV R1,#DEEP_BUF1 ;change binary code into BCD code
MOV R3,#16
CLR A
MOV R2,#3
CONV1: MOV @R1,A ;to clear
INC R1
DJNZ R2,CONV1
CONV2: MOV R0,#DEEP_BUF6
MOV R2,#2
CONV3: MOV A,@R0
RLC A ;circle shift to the left throug carry bit
MOV @R0,A
INC R0
DJNZ R2,CONV3
MOV R1,#DEEP_BUF1
MOV R2,#3
CONV4: MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
INC R1
DJNZ R2,CONV4
DJNZ R3,CONV2
; _______________
;-----------------------------------------------------|转换为ASCII码|-----------------------------------------------------------
; ^^^^^^^^^^^^^^^
CONV5: MOV A,DEEP_BUF2 ;Change BCD into ASCII
MOV DEEP_BUF4,A ;DEEP_BUF1 ~ DEEP_BUF5 save the final depth data,xxx.x m
MOV A,DEEP_BUF1
MOV DEEP_BUF5,A
MOV A,DEEP_BUF4
SWAP A
ANL A,#0FH
ADD A,#30H
MOV DEEP_BUF1,A
MOV A,DEEP_BUF4
ANL A,#0FH
ADD A,#30H
MOV DEEP_BUF2,A
MOV A,DEEP_BUF5
SWAP A
ANL A,#0FH
ADD A,#30H
MOV DEEP_BUF3,A
MOV A,DEEP_BUF5
ANL A,#0FH
ADD A,#30H
MOV DEEP_BUF5,A
MOV DEEP_BUF4,#2EH
MOV DEEP_BUF6,#0DH
MOV DEEP_BUF7,#0AH RET
;----------------------------------------------------------------------------------------------------------------
DAR: CLR EA ;;-----------读深度校准数据
MOV FLSCL,#01H ;允许软件写/擦除FLASH
MOV PSCTL,#0101B ;禁止扇区擦除,写允许,指向128字节扇区
CLR A
MOV DPTR,#0000H
MOVC A,@A+DPTR
MOV DEEP_ADJ1,A
CLR A
MOV DPTR,#0001H
MOVC A,@A+DPTR
MOV DEEP_ADJ2,A
MOV PSCTL,#00B
MOV FLSCL,#00H
RET
;------------------------------------------------atmosphere air pressure DEEP ADJUST----------------------------------------
DEEP_ADJ: MOV R3,#10H ;1US;---------------------A/D CONVERTION SUB_PROGRAM
MOV R5,#0H ;1US
MOV R6,#0H ;1US
MOV DEEP_ADJ1,#00H
MOV DEEP_ADJ2,#00H
CLR C
AD1: SETB AD0EN
LCALL GETADS ;2US call one AD convertion
MOV A,R5
ADD A,DEEP_BUF6 ;1US
MOV R5,A ;1US
MOV A,R6 ;1US
ADDC A,DEEP_BUF7 ;1US overflow carry
MOV R6,A ;1US
DJNZ R3,AD1 ;sampling 16 times and sum(quite to shift to left 4 bits),2US
CLR AD0EN
MOV A,R5 ;1US,sum 25US deal with low 8 bits
ANL A,#0F0H ;1US reserve the high half byte
SWAP A ;1US high half byte swap to low half byte
MOV R5,A ;1US
MOV A,R6 ;1US deal with high 8 bits
ANL A,#0FH ;1US
SWAP A ;1US
ORL A,R5 ;1US combinate into low 8 bits
MOV R5,A ;1US
MOV A,R6 ;1US
SWAP A ;1US
ANL A,#0FH ;1US
MOV R6,A ;calculate the average(quite to shift to right 4 bits),1US
MOV DEEP_ADJ2,R5
MOV DEEP_ADJ1,R6
LCALL DAS
RET
DAS: CLR EA ;-----------------保存深度调整数据
MOV FLSCL,#01H ;允许软件写/擦除FLASH
MOV PSCTL,#0101B ;禁止扇区擦除,写允许,指向128字节扇区
CLR A
MOV DPTR,#0002H ;保存页地址
MOVC A,@A+DPTR
MOV PAGE_ADR1,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV PAGE_ADR2,A
MOV PSCTL,#0111B ;允许擦除FLASH
MOV R0,#00H ;CLR FLASH
MOV A,#0FFH
MOVX @R0,A
MOV PSCTL,#0101B ;禁止扇区擦除
MOV R0,#00H
MOV A,DEEP_ADJ1 ;保存DEEP_ADJ1,DEEP_ADJ2
MOVX @R0,A
MOV A,DEEP_ADJ2
INC R0
MOVX @R0,A
INC R0
MOV A,PAGE_ADR1 ;保存PAGE_ADR1,PAGE_ADR2
MOVX @R0,A
INC R0
MOV A,PAGE_ADR2
MOVX @R0,A
MOV PSCTL,#00B
MOV FLSCL,#00H
RET
; @ @ @ @ @ @ @ @ @ @@
;---------------------------------------------@发送与接收中断判断@@@@----@@------:)------------QQQQ....MWMWMWMWMWMWMWMWMWMWMWMWMW-------
; @ @ @ @ @ @ @ @ @ @@
DETERMINE: CLR EA ;关总中断
PUSH PSW
PUSH DPL
PUSH DPH
PUSH ACC
;JBC TI,RETURN ;判断是接收中断还是发送中断,若发送中断则结束中断继续发送深度数据,若接收中断
JB RI,RECIEVE ;RI=1,跳转,开始接收数据
RETURN: MOV REC_COUNT,#1 ;RI=0,数据接收计数器复位
MOV R0,#CTRL1 ;存储地址缓存复位
POP ACC
POP DPH
POP DPL
POP PSW
SETB EA
RETI ;退出中断
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX接收数据XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
RECIEVE: JB RI,REC001 ;RI=1,开始接收
LCALL DELAY1 ;调用延时子程序,等待RI置位
JNB RI,$ ;这里主要为后面的接收跳转提供一个查询等待时间,以保证接收数据不错位
;此处要求上位机发送数据的间隔大于500毫秒,否则无法跳出(情况出现在接收变倍1和2命令时)
REC001: MOV A,REC_COUNT ;接收数据计数器存入累加器
CJNE A,#1,T1 ;接收到的不是第一个数据
MOV A,SBUF0 ;接收到的是第一个数据
CLR RI
CJNE A,#23H,T2 ;接收到的第一个数据不是#,返回判断
STORAGE: MOV R0,#CTRL1 ;接收到的第一个数据是#,存入控制命令存储区
MOV @R0,A
INC R0 ;地址缓存加1
INC REC_COUNT ;接收数据计数器加1
LJMP RECIEVE ;跳回判断下一个接收数据
T1: CJNE A,#5,T3 ;接收到的数据不是第五个,跳转
MOV A,SBUF0 ;接收到的数据是第五个
CLR RI
CJNE A,#0AH,T2 ;第五个数据不是0A,跳转
MOV @R0,A ;第五个数据是0A,存入控制命令存储区
MOV R0,#CTRL1 ;五个数据接收完毕,地址缓存复位
MOV REC_COUNT,#1 ;接收数据计数器复位
LCALL COMPARE1 ;调用控制命令扫描子程序
T2: LJMP RETURN ;调用返回
T3: MOV A,SBUF0 ;接收第2-4个数据
CLR RI
MOV @R0,A
INC R0
INC REC_COUNT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -