📄 mjl[1][1].asm.txt
字号:
;数据存储在了30H-35H中
;程序开始
ORG 0000H
FLG bit 00H ;接受字符标志位
START: AJMP MAIN
ORG 0023H ;串行中断的入口地址
LCALL GPS
HERE: AJMP $ ;等待中断
MAIN: MOV SP, #70H
ANL TMOD, #0FH ;定时器T1工作
ORL TMOD, #20H ;设置定时器T1工作在方式2
MOV SCON, #50H ;串行口工作在方式1,REN=1(允许串行中断数据接收)
MOV R5, #00H ;对帧头接收字节个数计数器清零
CLR FLG ;对帧头接收标志清零
MOV TH0, #0FAH ;定时器T1计数初值
MOV TL0, #0FAH ;计数重装值
SETB ES ;打开串行中断
SETB EA ;打开总中断
HERE0: AJMP $ ;等待中断
;GPS接收的中断程序
GPS: JB FLG, GPS10
GPS01: CJNE R5, #00H, GPS02 ;判断R5是否为0,若是,则接收第1个字节
;否则跳入GPS02
MOV A, SBUF
CJNE A, #024H, RET0 ;判断是否是'$',若是则继续接收字符
;否则跳入RET0
INC R5 ;将接收字节个数加1
LJMP RET0 ;程序返回中断
GPS02: CJNE R5, #01, GPS03 ;判断R5是否为1,若是,则接收第2个字节
;否则跳入GPS02
MOV A, SBUF
CJNE A, #047H, Start0 ;判断是否是'G',若是则继续接收字符
;否则跳入Start0
INC R5
LJMP RET0 ;程序返回中断
GPS03: CJNE R5, #02, GPS04 ;判断R5是否为2,若是,则接收第3个字节
;否则跳入GPS04
MOV A, SBUF
CJNE A, #050H, Start0 ;判断是否是'P',若是则继续接收字符
;否则跳入Start0
INC R5
LJMP RET0 ;程序返回中断
GPS04: CJNE R5, #03, GPS05 ;判断R5是否为3,若是,则接收第4个字节
;否则跳入GPS05
MOV A, SBUF
CJNE A, #052H, Start0 ;判断是否是'R',若是则继续接收字符
;否则跳入Start0
INC R5
LJMP RET0 ;程序返回中断
GPS05: CJNE R5, #04, GPS06 ;判断R5是否为4,若是,则接收第个5字节
;否则跳入GPS06
MOV A, SBUF
CJNE A, #04DH, Start0 ;判断是'M',若是则继续接收字符
;否则跳入Start0
INC R5
LJMP RET0 ;程序返回中断
GPS06: CJNE R5, #05, GPS07 ;判断R5是否为5,若是,则接收第6个字节
;否则跳入GPS07
MOV A, SBUF
CJNE A, #043H, Start0 ;判断是否是'C',若是则继续接收字符
;否则跳入Start0
INC R5
LJMP RET0 ;程序返回中断
GPS07: CJNE R5, #06, Start0 ;判断R5是否为6,若是,则接收第7个字节
;否则跳入Start0
MOV A, SBUF
CJNE A, #02CH, Start0 ;判断是否是',',若是则继续接收字符
;否则跳入Start0
SETB FLG ;置FLG为1,表示'$GPRMC,'已经接收完毕
MOV R5, #00H ;将帧头接收计数器清零
MOV R0, #30H ;接收数据的地址给DPTR
LJMP RET0 ;程序返回中断
Start0: MOV R5, #00H
GPS10: SETB TR1
MOV R6, #06H ;数据接收的循环次数
SIN1: JNB RI, $ ;等待接收数据
CLR RI ;请接收中断标志位
MOV A, SBUF
MOV @R0, A ;保存数据
INC R0
DJNZ R6, SIN1 ;若数据没接收完转到SIN1
CLR TR1
ACALL CHULI ;调用处理子程序
ACALL DISP ;调用显示子程序
LJMP RET0 ;返回中断
RET0: RETI
;小时加8的程序处理
CHULI: MOV R1, #06H ;进行转换的数据个数
ZHH: MOV A, @R0
SUBB A, #30H ;把ASCII码转换成BCD码
MOV @R0, A
DJNZ R1, ZHH ;若数据没有转换完,则跳入ZHH继续转换
ACALL DAAD8
CJNE R2, #24H, LOOP0 ;判断时间是否大于24h,若是大于24h跳入LOOP0
;若等于24h,则将24h清零
AJMP CLR0
LOOP0: JNC J24
J24: MOV A, R2
SUBB A, #24H ;小时减24h
MOV @R0, A
RET
CLR0: CLR A ;清缓冲单元字程序
MOV @R0, A ;十位数缓冲单元清0
INC R0
MOV @R0, A ;个位数缓冲单元清0
RET
DAAD8: MOV A, @R0 ;加8子程序,十位数送A
INC R0
SWAP A ;十位数占高4位
ORL A, @R1 ;个位数占低4位
ADD A, #08H ;加8
DA A ;十进制调整
MOV R2, A ;全值暂存R2中
ANL A, #0FH ;屏蔽十位数,取出个位数
MOV @R0, A ;个位值送显示缓冲单元
MOV A, R2
DEC R0
ANL A, #0F0H ;屏蔽个位数,取出十位数
SWAP A ;使十位数占低4位
MOV @R1, A ;十位数送显示缓冲单元
RET ;返回
;MAX7219数字显示电路
DISP: MOV SP, #60H ;设置堆栈指针
MOV R1, #08H
MOV R0, #30H ;显示缓冲单元首地址
LCALL INI1 ;调用初始化子程序
LCALL DIS1 ;调用显示子程序
SJMP $
;
INI1: MOV A, #0BH ;MAX7219初始化子程序
MOV R4, #07H ;扫描宽度
LCALL WRIT
MOV A, #0AH ;选择码亮度
MOV R4, #08H
LCALL WRIT
MOV A, #09H ;选择译码方式
MOV R4, #0FFH
LCALL WRIT
MOV A, #0CH ;亮度设置
MOV R4, #01H
LCALL WRIT
RET
;
DIS1: MOV A, @R0 ;把显示数据装入MAX7219的子程序
MOV R0, A
LOOP: MOV R5, #2
LCALL LOOP2
LCALL LOOP3
DJNZ R5, LOOP
LCALL LOOP2
RET
LOOP2: MOV R3, #2
DIS: MOV A, @R0
MOV R4, A
MOV A, R1
LCALL WRIT
INC R0
INC R1
DJNZ R3, DIS
RET
LOOP3: MOV A, #02H
MOV R4, A
MOV A, R1
LCALL WRIT
INC R0
INC R1
RET
;
WRIT: ACALL SEND
MOV A, R4
ACALL SEND
CLR P3.4 ;LOAD
NOP
SETB P3.4 ;产生上升沿
NOP
RET
;
SEND: MOV R6, #08H
LOOP1: NOP
NOP
CLR P1.1 ;CLK
RLC A
MOV P1.0, C ;数据放上数据线 DIN
NOP
NOP
SETB P1.1 ;产生上升沿
DJNZ R6, LOOP1
RET
END
尹利文:
这个程序需要在DOS系统下运行,要接收GPS的"$GPRMC,"后面的时间,
时间共6位,时分秒的显示.越快越好,着急用.谢谢!
马金荔
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -