📄 gps.asm
字号:
;*******************************************************
; *
;*******************************************************
;特殊寄存器定义区
S1CON EQU 0D8H
CR2 BIT S1CON.7
ENS1 BIT S1CON.6
STA BIT S1CON.5
STO BIT S1CON.4
SI BIT S1CON.3
AA BIT S1CON.2
CR1 BIT S1CON.1
CR0 BIT S1CON.0
S1DAT EQU 0DAH ;接收和发送数据
S1IST EQU 0DCH ;用于硬件I2C总线的硬件设定、使能、启动,结束
S1ADR EQU 0DBH ;I2C用于存放本机从地址
S1STA EQU 0D9H ;指示I2C总线的操作状态码,高五位有效
S0CON EQU 98H;
FE BIT S0CON.7;
CCON EQU 0C0H;
CF BIT CCON.7;
CR BIT CCON.6;
CCF4 BIT CCON.4;
CCF3 BIT CCON.3;
CCF2 BIT CCON.2;
CCF1 BIT CCON.1;
CCF0 BIT CCON.0;
CMOD EQU 0C1H;
CCAPM0 EQU 0C2H;
CCAPM1 EQU 0C3H;
CCAPM2 EQU 0C4H;
CCAPM3 EQU 0C5H;
CCAPM4 EQU 0C6H;
CL EQU 0E9H;
CCAP0L EQU 0EAH;
CCAP1L EQU 0EBH;
CCAP2L EQU 0ECH;
CCAP3L EQU 0EDH;
CCAP4L EQU 0EEH;
CH EQU 0F9H;
CCAP0H EQU 0FAH;
CCAP1H EQU 0FBH;
CCAP2H EQU 0FCH;
CCAP3H EQU 0FDH;
CCAP4H EQU 0FEH;
AUXR EQU 8EH
AUXR1 EQU 0A2H;
WDTRST EQU 0A6H;
T2CON EQU 0C8H;
T2MOD EQU 0C9H
TCLK BIT T2CON.4;
RCLK BIT T2CON.5;
IPH EQU 0B7H
;--------------------------------------------------
BASTL0 EQU 099H ;TL0= 99H
BASTH0 EQU 0F1H ;TH0=0F1H 11.059M 晶振 CT2 2MS 定时
;-------------------------------------------------
RXBITG BIT 40H ;开始接收GPS数据
RXGPSOKBIT BIT 42H ;接收到一幀GPS数据
TXGPSOKBIT BIT 43H ;打包结束标志
;---------------------------------------------------------
;0000H-0400H
GPSLON EQU 00A0H ;经度(8个字节ASC)
GPSLAT EQU 00A8H ;纬度(8个字节ASC)
GPSSPD EQU 00B0H ;速度(4个字节ASC)
GPSDEG EQU 00B4H ;方向(4个字节ASC)
GPSHGH EQU 00B8H ;高度(8个字节ASC)
GPSTIME EQU 00C0H ;时间(12个字节ASC)
GPSTIMED EQU 00D0H ;时间(12个字节ASC) 北京时间
Port1_RxBUFF EQU 0200H ;GPS接收缓冲区的起始地址(共256个字节)绝对地址
TXGPSBUFF EQU 0300H ;经过打包过后的有效GPS数据发送首地址
;---------------------------------------------------------
GPS_START EQU 32H ;GPS起始地址相对地址
Port1_Rx_PN EQU 41H ;GPS接收缓冲区的指针
RXBUF EQU 54H ;接收缓冲区
TXBUF EQU 6CH ;串口数据发送缓冲区
C10MS EQU 55H ;用于10MS定时
C20MS EQU 56H ;用于10MS定时
C100MS EQU 57H ;用于100MS 定时
C500MS EQU 58H ;用于500MS定时
C1000MS EQU 59H ;用于1000MS,1S 定时
DPL1 EQU 60H ;
DPH1 EQU 61H
;---------------------------------------------------------
;*************************************************************************
ORG 0000h
LJMP MAINFUN ;R0..R7 <--> 00H..07H , 10H..17H
ORG 000BH ;内部时钟中断0
LJMP CT0ST ;R0..R7 <--> 08H..0FH
ORG 0023H
LJMP TXRX
;===================串口中断服务程序模块========================
;****************************************************************
;程 序 名 : TXRX *
;功 能: 串口中断服务程序 *
;占用寄存器: ACC, B, DPTR *
;工作寄存器: RXBUF, Port0_Rx_PN, Port1_Rx_PN,Port1_Rx_PN *
;位标志变量: RXBITG,RXBITF,RXGPSOKBIT,RXFC201OKBIT *
;缓 冲 区 : Port0_RxBuff,Port1_RxBuff,Port2_RxBuff *
;子程序编号: *
;****************************************************************
;----------------------串口中断子程序----------------------------
TXRX:
JB RI,UARTREVDATA ;接收中断,JMP
CLR TI ;发送中断,返回
CLR F0
RETI
;******************
;串口接收程序 *
;******************
UARTREVDATA:
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
CLR RI
LCALL WDOG
MOV RXBUF,SBUF
JB RXGPSOKBIT,RXEXIT
LCALL WDOG
MOV A,RXBUF
JB RXBITG,RXGPS1
XRL A,#'$'
JNZ RXGPSE
SETB RXBITG
MOV Port1_Rx_PN,#00H ;复位GPS缓冲区的指针
MOV DPTR,#Port1_RxBuff
MOV A,#'$'
MOVX @DPTR,A
INC Port1_Rx_PN
RXGPSE:
LJMP RXEXIT
RXGPS1: MOV DPTR,#Port1_RxBuff
CLR C
MOV A,DPL
ADD A,Port1_Rx_PN
MOV DPL,A
MOV A,#0
ADDC A,DPH
MOV DPH,A
MOV A,RXBUF
MOVX @DPTR,A
INC Port1_Rx_PN
MOV A,Port1_Rx_PN
CJNE A,#200,RXGPS2 ;a>=200:c=0;<200;c=1
RXGPS2: JNC RXGPS3 ;C=0转
LJMP RXEXIT
RXGPS3: MOV A,RXBUF
XRL A,#0AH
JZ RXGPSEND
LJMP RXEXIT
RXGPSEND:
SETB RXGPSOKBIT
CLR RXBITG
LJMP RXEXIT
RXEXIT:
POP DPL
POP DPH
POP B
POP ACC
POP PSW
RETI
;================定时中断服务程序模块区==========================
;****************************************************************
;程 序 名 : CT0ST *
;功 能: 定时中断服务程序 *
;占用寄存器: ACC, B, DPTR *
;工作寄存器: RXBUF, Port0_Rx_PN, Port1_Rx_PN,Port2_Rx_PN *
;位标志变量: RXBITG,RXBITF,RXGPSOKBIT,RXFC201OKBIT *
;缓 冲 区 : Port0_RxBuff,Port1_RxBuff,Port2_RxBuff *
;子程序编号: *
;****************************************************************
;-------------定时中断主程序----------------------
DONE_DONE:LJMP DONE
CT0ST:
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
CLR TR0 ;2MS
;------------用于10MS定时---------
CT0ST1: DJNZ C10MS,DONE_DONE
MOV C10MS,#5
JNB RXGPSOKBIT,CT0ST2
LCALL UNPAKGPS ;对接收到的GPS数据进行解析
LCALL PAGGPSDATA
CLR RXGPSOKBIT ;清除标志位,准备接收下一幀GPS数据
CT0ST2:
DJNZ C20MS,DONE_DONE
MOV C20MS,#2
JNB TXGPSOKBIT,DONE
LCALL TXGPSDATA
DONE:
MOV TL0, #BASTL0
MOV TH0, #BASTH0 ;CT0 2MS
SETB TR0
POP PSW
POP DPL
POP DPH
POP B
POP ACC
RETI
;*****************************************************
;功能说明:解析GPS数据 *
;函数名 :UNPAKGPS *
;所用的寄存器:R0,R1,R2,R3,R4 *
;入口参数:PORT1_RXBUFF,GPS_START *
;出口参数:GPSLAT,GPSLON,GPSSPD,GPSHGH,GPSDEG,GPSTIME*
;子程序编号: *
;*****************************************************
UNPAKGPSEX:LJMP UNPAKGPSE
UNPAKGPS:
MOV GPS_START,#00H
MOV DPTR,#PORT1_RXBUFF
UNPAKGPS1: ;判断帧头
CLR C
MOV A,GPS_START
SUBB A,#180
JNC UNPAKGPSEX
MOVX A,@DPTR
XRL A,#'$' ;判断$
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
MOVX A,@DPTR
XRL A,#'G' ;判断G
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
MOVX A,@DPTR
XRL A,#'P' ;判断P
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
MOVX A,@DPTR
XRL A,#'R' ;判断R
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
MOVX A,@DPTR
XRL A,#'M' ;判断M
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
MOVX A,@DPTR
XRL A,#'C' ;判断C
INC DPTR
INC GPS_START
JNZ UNPAKGPS1
INC DPTR
INC GPS_START
UNPAKGPS2:;-----------------------取数据
;$GPRMC[5],010622[12],V,2307.5097[24],N,11322.0545[37],E,000.0[45],000.0[51],101002[58],
;解析出时间数据[HHMMSS]
MOV R4,#6
MOV R0,DPL ;保存接收缓冲区数据指针
MOV R1,DPH ;
MOV DPTR,#(GPSTIME+6)
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
;---------------------------------取出日期 DDMMYY
MOV R4,#6
MOV A,GPS_START
CLR C
ADD A,#58
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#GPSTIME
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
;---------------------------------取出速度
MOV R4,#3
MOV A,GPS_START
CLR C
ADD A,#45
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#GPSSPD
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
MOV A,GPS_START
CLR C
ADD A,#49
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV DPL,A
MOV A,#0
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
MOV DPTR,#(GPSSPD+3)
MOVX @DPTR,A
;---------------------------------取出方位角
MOV R4,#3
CLR C
MOV A,GPS_START
ADD A,#51
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#GPSDEG
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
MOV A,#30H
MOV DPTR,#(GPSDEG+3)
MOVX @DPTR,A
;---------------------------------取出纬度
MOV R4,#4
MOV A,GPS_START
CLR C
ADD A,#20
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#GPSLAT
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
MOV R4,#4
MOV A,GPS_START
CLR C
ADD A,#25
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#(GPSLAT+4)
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
;----------------------------------取出经度
MOV R4,#4
MOV A,GPS_START
CLR C
ADD A,#33
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#GPSLON
MOV R2,DPL
MOV R3,DPH
LCALL RAMTORAM
MOV R4,#4
MOV A,GPS_START
CLR C
ADD A,#38
MOV DPTR,#PORT1_RXBUFF
ADD A,DPL
MOV R0,A
MOV A,#0
ADDC A,DPH
MOV R1,A
MOV DPTR,#(GPSLON+4)
MOV R2,DPL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -