📄 gpstime1.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GPS时钟系统 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;用W78E516B单片机
;本程序接收GPS的$GPGGA信息中的时间数据,采用12MHZ晶振,4800波特率接收
;使用资源:R0、R1、R3、R5、R6、R7,定时器T2(作波特率发生器),20H单元
;显示缓冲单元在70H—75H,70H—71H显示秒,72H—73H显示分,74H—75H显示时
;时间接收数据在7AH—7BH(秒)、7CH—7DH(分)、7EH—7FH(时)
;
;定时器T2定义
T2CON EQU 0C8H ; T2 控制寄存器
T2MOD EQU 0C9H ;
TL2 EQU 0CCH ; T2 计数寄存器低字节
TH2 EQU 0CDH ; T2 计数寄存器高字节
TR2 EQU 0CAH ; T2 启动位
RCAP2L EQU 0CAH ; T2 计数重栽寄存器低字节
RCAP2H EQU 0CBH ; T2 计数重栽寄存器高字节
SFLAG BIT 00H ;信息头标志OK
G1FLAG BIT 01H ;G1 OK
PFLAG BIT 02H ;P OK
G2FLAG BIT 03H ;G2 OK
G3FLAG BIT 04H ;G3 OK
AFLAG BIT 05H ;A OK
DFLAG BIT 06H ;, OK
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
LJMP INTS
ORG 002BH
RETI
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
start: MOV PSW, #00H ; 设第0组寄存器
MOV SP, #50H ; 设置堆栈指针
MOV SCON, #01010000B ; 串口工作方式 1 (8 BIT UART) 允许接收
MOV T2CON, #00110000B ; T2CON
MOV A,#0B2H
MOV TL2, A ;设置波特率 ( 4800)
MOV RCAP2L, A ;
MOV A,#0FFH
MOV TH2, A ;
MOV RCAP2H, A ;
START1: MOV R0, #70H ;清70-7F内存单元
MOV R7, #10H
CLEARDISP: MOV @R0, #00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H, #00H ;清标志单元
MOV R0,#7FH ;GPS数据在78-7F内
MOV R3,#06H ;接收6个数据
SETB ES ; 允许串口中断
MOV IP, #00H ; 低优先级
SETB REN ; 启动串口接收
CLR TI ; 清串口发送中断标志位
CLR RI ; 清串口接收中断标志位
SETB TR2 ; 启动定时计数器 2
SETB EA ; 开放所有中断
start2: LCALL DISPLAY
SJMP Start2
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
DISPLAY: MOV R1,#70H
MOV R5,#0FEH
PLAY: MOV A,R5
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.5,ENDOUT
RL A
MOV R5,A
AJMP PLAY
ENDOUT: MOV P2,#0FFH
MOV P0,#0FFH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断接收程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTS: JBC RI,RXINTS
CLR TI
LJMP INTSOUT
;
RXINTS: MOV A,SBUF
JB DFLAG,DF ;是$GPGGA,转AF接收时间数据
JB AFLAG,AF ;判断是否是","
JB G3FLAG,G3F ;判断是否是A
JB G2FLAG,G2F ;判断是否是第三个G
JB PFLAG,PF ;判断是否是第二个G
JB G1FLAG,G1F ;判断是否是P
JB SFLAG,SF ;判断是否是第一个G
XRL A,#24H ;判断是否是“$”
JZ SYES
MOV 20H,#00H ;不是$,清所有标志
LJMP INTSOUT
SYES: SETB SFLAG ;是$,设标志
LJMP INTSOUT
;
;
SF: XRL A,#47H ;是第一个“G”吗?
JZ G1YES ;是G,转G1yes
MOV 20H,#00H
LJMP INTSOUT
G1YES: SETB G1FLAG
INTSOUT: RETI
;
G1F: XRL A,#50H ;是“P”吗?
JZ PYES ;是P,转Pyes
MOV 20H,#00H
LJMP INTSOUT
PYES: SETB PFLAG
LJMP INTSOUT
PF: XRL A,#47H ;是第二个“G”吗?
JZ G2YES ;是G,转G2yes
MOV 20H,#00H
LJMP INTSOUT
G2YES: SETB G2FLAG
LJMP INTSOUT
;
G2F: XRL A,#47H ;是第三个“G”吗?
JZ G3YES ;是G,转G3yes
MOV 20H,#00H
LJMP INTSOUT
G3YES: SETB G3FLAG
LJMP INTSOUT
;
G3F: XRL A,#41H ;是“A”吗?
JZ AYES ;是A,转Ayes
MOV 20H,#00H
LJMP INTSOUT
AYES: SETB AFLAG
LJMP INTSOUT
AF: XRL A,#2CH ;是“,”吗?
JZ DYES ;是",",转Dyes
MOV 20H,#00H
LJMP INTSOUT
DYES: SETB DFLAG
LJMP INTSOUT
;接收GPS时间数据,共6个字节,在7A-7F单元
DF: MOV @R0,A
DEC R0
DJNZ R3,INTSOUT
MOV R3,#06H ;数字ASCⅡ码转换成数字
MOV R0,#7AH
DF1: MOV A,@R0
CLR C
SUBB A,#30H
MOV @R0,A
INC R0
DJNZ R3,DF1
MOV A,7FH ;格林时转换成北京时间(时加8)
MOV B,#10
MUL AB
ADD A,7EH
ADD A,#08H
CLR C
CJNE A,#18H,DF2 ;是否大于24
DF2: JC DF3
SUBB A,#18H ;大于24减24
DF3: MOV B,#10 ;时十位、个位恢复为BCD码
DIV AB
MOV 7FH,A
MOV 7EH,B
MOV 70H,7AH ;将收到数据移入显示单元
MOV 71H,7BH
MOV 72H,7CH
MOV 73H,7DH
MOV 74H,7EH
MOV 75H,7FH
MOV R3,#06H
MOV R0,#7FH
MOV 20H,#00H
LJMP INTSOUT
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -