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

📄 mjl[1][1].asm.txt

📁 这个程序需要在DOS系统下运行
💻 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 + -