📄 20070206nmea_a.asm
字号:
ORG 0000H ;NMEA接收程序,红灯亮起表示定位,包括字头$和字尾*加DELAY2延时10000微秒程序
CLR P2.1 ;打开GPS模块供电控制场效应管
LJMP MAIN ;跳入主程序
ORG 000BH ;中断入口地址
LJMP INT0 ;跳入中断
MAIN: SETB P3.2 ;设置中断既GPS接收口P3.2为高,准备接收NMEA数据
MOV SP,#60H ;设置堆嵌指针为地址60H
MOV DPTR,#0000H
CLR P2.2
MAIN1: MOV C4H,#41H ;设置PMR为4时钟周期为一个机器周期,启动内部RAM
CPL P2.3 ;取反P2.3
LCALL DELAY ;调用延时子程序
CLR IT0 ;设置中断0为低电平触发,注意只有设置中断0为低电平出发才能正确检测出NMEA数据的第一个字节的第一位数据既起始位0低电平
SETB EX0 ;打开中断0的使能位
SETB EA ;打开全局中断
LJMP MAIN1 ;跳回主程序循环等待中断0
DELAY: MOV R3,#5 ;延时程序,共延时2500微秒
D1: MOV R4,#100
D0: MOV R5,#100
DJNZ R5,$
DJNZ R4,D0
DJNZ R3,D1
RET
INT0: CLR EX0 ;中断0服务程序,进入后先关闭中断0的使能位
PUSH 03H ;保护R3,防止延时程序DELAY被中断后数据不正确
PUSH 04H ;保护R4
PUSH 05H ;保护R5
D15: LCALL GPSDELAY ;调用接收NMEA的一个完整字节的子程序,共10个位,包括起始位,8个数据位及一个停止位
CJNE A,#41H,D17 ;如果接收的一个字节的8位数据等于ASCII的$则继续下面的程序,如果不是就再次接收一个字节来判断
SETB P2.2
D17: CJNE A,#56H,D14
CLR P2.2
D14: CJNE A,#2AH,D15
LCALL DELAY2 ;调用延时10000微秒的子程序,此子程序把NMEA字符*后的几个没用的字符跳过
POP 05H ;还原R5
POP 04H ;还原R4
POP 03H ;还原R3
RETI
DELAY1: MOV R1,#0FFH ;延时208.3334微秒的子程序,用来等待NMEA的一个位的数据
MOV R2,#0A2H
DJNZ R1,$
DJNZ R2,$
RET
GPSDELAY: NOP
D6: MOV R0,#8 ;设置每桢为8位数据
D10: MOV C,P3.2 ;取P3.2的值到C
JC D10 ;判断启始位是否为0,不为0就再次取P3.2的值,直到等于0
D5: LCALL DELAY1 ;调用数据接收延时子程序
MOV C,P3.2 ;再次取P3.2的值到C,此值为接收到的一个NMEA字节的第一位数据
RRC A ;带C右移A,把第一位数据防进A
DJNZ R0,D5 ;判断8次数据接收完后继续下面的程序
LCALL DELAY1 ;调用数据接收延时子程序
MOV C,P3.2 ;把停止位放进C
JNC D6 ;如果C没有接收到停止位1则再次接收8个数据来寻找停止位,直到找到停止位和启始位为一桢的准确(N,8,1)数据传输格式
RET
DELAY2: MOV R3,#200 ;延时10000微秒跳过没用NMEA字符
D16: MOV R4,#100
DJNZ R4,$
DJNZ R3,D16
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -