⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20070206nmea_a.asm

📁 接受GPS数据
💻 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 + -