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

📄 gps.lst

📁 《51单片机应用开发案例精选配套源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  GPS                                                                  06/23/2007 11:02:10 PAGE     1


MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN GPS.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE GPS.asm SET(SMALL) DEBUG EP

LOC  OBJ            LINE     SOURCE

  00B5                 1     RS EQU P3.5 
  00B6                 2     RW EQU P3.6 
  00B7                 3     E EQU P3.7
                       4     
0000                   5     ORG 0000H
0000 8023              6     JMP START                    ; 程序开始
0023                   7     ORG 0023H                 
0023 21D3              8     JMP Serial_RX_ISR              ; 串口中断向量
                       9     
0025                  10     START:
0025 758160           11         MOV SP,#60H              ; 设置堆栈
0028 120057           12         LCALL Init                 ; 进行有关的初始化
                      13     
002B 7920             14         MOV R1,#20H              ; 初始化内存空间 
002D 7A30             15         MOV R2,#30H
002F                  16     CLR_CYC:
002F 7700             17         MOV @R1,#0
0031 DAFC             18         DJNZ R2,CLR_CYC
                      19         
0033 7C00             20         MOV R4,#0
0035 D200             21         SETB 20H.0                ; 将GPS工作状态位设为1,表示正在搜索中
0037 120186           22         LCALL LCD_INIT          ; 刷新启动进行LCD
                      23     
003A                  24     MAIN:
003A A200             25         MOV C,20H.0
003C 4011             26         JC WAIT                     ; 20H.0 为 1时,进入等待
003E 120070           27         LCALL COUNT_NS           ; 计算纬度
0041 1200CB           28         LCALL COUNT_EW           ; 计算经度
0044 120124           29         LCALL DISPLAY_NS          ; 显示纬度
0047 12014D           30         LCALL DISPLAY_EW         ; 显示经度
004A 1201CA           31         LCALL DELAY1              ; 延时
004D 80EB             32         JMP MAIN
004F                  33     WAIT:
004F 120174           34         LCALL DISPLAY_SEARCH     ; 显示搜索状态
0052 1201CA           35         LCALL DELAY1              ; 延时
0055 80E3             36         JMP MAIN
                      37     
0057                  38     Init:
                      39     ;---------------------------------
                      40     ;     程序初始化,包括串口、定时器T1、中断的初始化
                      41     ;---------------------------------
0057 759890           42           MOV SCON,#10010000B      ; 串口控制寄存器初始化
005A 438780           43           ORL PCON,#10000000B      ; 把SMOD位置1
005D D2AF             44           SETB EA                   ; 中断允许总控制位使能
005F D2AC             45           SETB ES                   ; 串口中断使能
0061 D2BC             46           SETB PS                   ; 把串口中断设为高优先级
0063 1166             47           CALL Timer1_Init           ; 进行定时器T1的初始化
0065 22               48           RET
0066                  49     Timer1_Init:
                      50     ;-------------------------
                      51     ;     定时器T1作为串口的波特率发生器
                      52     ;     (2^SMOD)*fosc/32*12*(256-th1)=9600
                      53     ;-------------------------
0066 758920           54           MOV TMOD,#00100000B     ; 定时器T1工作在方式2
0069 758840           55           MOV TCON,#01000000B     ; 定时器T1使能
006C 758DFA           56           MOV TH1,#0FAH           ; 设定定时器T1的初始值
006F 22               57           RET
                      58     
A51 MACRO ASSEMBLER  GPS                                                                  06/23/2007 11:02:10 PAGE     2

0070                  59     COUNT_NS:
                      60     ;----------------------------------
                      61     ;- 计算纬度的值,并将纬度的十位,个位,十分位分别放入相应的内存空间
                      62     ;----------------------------------
0070 E537             63           MOV A,55                ; 读取纬度的最高位数据               
0072 5480             64           ANL A,#80H              ; 测试符号位,1为北纬,0为南纬
0074 600E             65           JZ S                     ; 跳到南纬的处理
0076 900245           66           MOV DPTR,#TABLE2
0079 7400             67           MOV A,#0                
007B 93               68           MOVC A,@A+DPTR         
007C F53D             69           MOV 61,A                ; 将N所对应的代码写进内存61
                      70           
007E E537             71           MOV A,55
0080 557F             72           ANL A,7FH               ; 去掉最高位
0082 800A             73           JMP NEXT
                      74     
0084                  75     S:    
0084 900245           76           MOV DPTR,#TABLE2
0087 7401             77           MOV A,#1
0089 93               78           MOVC A,@A+DPTR
008A F53D             79           MOV 61,A                ; 将S对应的代码写进内存61
008C E537             80           MOV A,55
008E                  81     NEXT:
008E 75F05A           82           MOV B,#90                
0091 A4               83           MUL AB                  ; 最高字节乘以90
0092 85F025           84           MOV 37,B                 ; 结果的高位存在内存37
0095 F526             85           MOV 38,A                 ; 结果的低位存在内存38
                      86     
0097 E538             87           MOV A,56                ; 读取次高字节
0099 75F05A           88           MOV B,#90        
009C A4               89           MUL AB                  ; 次高字节乘以90
009D E526             90           MOV A,38                 ; 读取纬度高字节乘以90所得结果的低字节
009F 35F0             91           ADDC A,B                ; 用纬度次高字节乘以90所得结果的高字节修正上述数据
00A1 500A             92           JNC NEXT1
00A3 8525F0           93           MOV B,37                 ; 读取纬度高字节乘以90所得结果的高字节
00A6 05F0             94           INC B                    ; 修正上述数据
00A8 85F025           95           MOV 37,B                ; 纬度计算结果高位存在37
00AB F526             96           MOV 38,A                ; 纬度计算结果低位存在38
00AD                  97     NEXT1:
                      98           ; 处理整数部分,将整数的十位部分和个位部分分别储存
00AD 33               99           RLC A                   ; 将低位的最高位左移到C中
00AE E525            100           MOV A,37                ; 处理高位
00B0 23              101           RL A                     ; 高位乘2
00B1 3400            102           ADDC A,#0               ; 加上低位的最高位,这就是纬度的整数部分
                     103           
00B3 75F00A          104           MOV B,#10           
00B6 84              105           DIV AB                 ; 整数部分除以10,得到十位部分和个位部分 
00B7 F53E            106           MOV 62,A               ; 十位部分
00B9 85F03F          107           MOV 63,B               ; 个位部分
                     108           ;  以下处理小数部分
00BC E526            109           MOV A,38               ; 读入纬度的低字节部分   
00BE 547F            110           ANL A,#7FH             ; 去掉最高位得到小数部分
00C0 75F00A          111           MOV B,#10              ; 小数部分乘以10
00C3 A4              112           MUL AB
00C4 33              113           RLC A                  ; 以下将小数部分乘以10的结果除以2^7,去商作为第一位小数
00C5 E5F0            114           MOV A,B
00C7 33              115           RLC A
00C8 F540            116           MOV 64,A       
00CA 22              117           RET
                     118     
00CB                 119     COUNT_EW:
                     120     ;----------------------------------
                     121     ;- 计算经度的值,并将经度的十位,个位,十分位分别放入相应的内存空间
                     122     ;----------------------------------
00CB E53B            123           MOV A,59                   ; 读取经度的最高位数据  
00CD 5480            124           ANL A,#80H                 ; 测试符号位,1为西经,0为东经
A51 MACRO ASSEMBLER  GPS                                                                  06/23/2007 11:02:10 PAGE     3

00CF 600C            125           JZ EAST                    ; 跳到东经的处理
00D1 900245          126           MOV DPTR,#TABLE2
00D4 7403            127           MOV A,#3
00D6 93              128           MOVC A,@A+DPTR
00D7 F541            129           MOV 65,A                   ; 将W所对应的代码写进内存61
                     130             
00D9 E537            131           MOV A,55
00DB 557F            132           ANL A,7FH                  ; 去掉最高位
00DD                 133     EAST:    
00DD 900245          134           MOV DPTR,#TABLE2
00E0 7402            135           MOV A,#2
00E2 93              136           MOVC A,@A+DPTR
00E3 F541            137           MOV 65,A                ; 将E对应的代码写进内存65
00E5 E537            138           MOV A,55
00E7                 139     NEXT2:
00E7 75F0B4          140           MOV B,#180
00EA A4              141           MUL AB                  ; 最高字节乘以180
00EB 85F027          142           MOV 39,B                ; 结果的高位存在内存39
00EE F528            143           MOV 40,A                ; 结果的低位存在内存40
                     144     
00F0 E53C            145           MOV A,60                ; 读取次高字节
00F2 75F0B4          146           MOV B,#180
00F5 A4              147           MUL AB                  ; 次高字节乘以180
00F6 E528            148           MOV A,40                ; 读取经度度高字节乘以180所得结果的低字节
00F8 35F0            149           ADDC A,B                ; 用经度次高字节乘以180所得结果的高字节修正上述数据
00FA 500A            150           JNC NEXT3
00FC 8527F0          151           MOV B,39                ; 读取经度高字节乘以180所得结果的高字节
00FF 05F0            152           INC B                   ; 修正上述数据
0101 85F027          153           MOV 39,B                ; 经度计算结果高位存在39
0104 F528            154           MOV 40,A                ; 经度计算结果低位存在40
0106                 155     NEXT3:
                     156           ; 处理整数部分,将整数的十位部分和个位部分分别储存
0106 33              157           RLC A              ; 将低位的最高位左移到C中
0107 E525            158           MOV A,37           ; 处理高位
0109 23              159           RL A               ; 高位乘2
010A 3400            160           ADDC A,#0          ; 加上低位的最高位,这就是经度的整数部分
                     161           
010C 75F00A          162           MOV B,#10           
010F 84              163           DIV AB             ; 整数部分除以10,得到十位部分和个位部分 
0110 F542            164           MOV 66,A           ; 十位部分
0112 85F043          165           MOV 67,B           ; 个位部分
                     166           ;  以下处理小数部分
0115 E528            167           MOV A,40           ; 读入经度度的低字节部分          
0117 547F            168           ANL A,#7FH         ; 去掉最高位得到小数部分
0119 75F00A          169           MOV B,#10          ; 小数部分乘以10
011C A4              170           MUL AB
011D 33              171           RLC A              ; 以下将小数部分乘以10的结果除以2^7,取商作为第一位小数
011E E5F0            172           MOV A,B
0120 33              173           RLC A
0121 F544            174           MOV 68,A       
                     175          
0123 22              176           RET      
0124                 177     DISPLAY_NS:
                     178     ;------------------
                     179     ;- 显示纬度
                     180     ;------------------
0124 3186            181           CALL LCD_INIT
0126 759080          182           MOV P1,#80H         ; 显示位置 
0129 319E            183           ACALL ENABLE        ; 传送命令
012B 759001          184           MOV P1,#01H         
012E 319E            185           CALL ENABLE
                     186           
0130 783D            187           MOV R0,#61          ; 显示N或S 
0132 E6              188           MOV A,@R0
0133 31B4            189           CALL WRITE2       
0135 08              190           INC R0
A51 MACRO ASSEMBLER  GPS                                                                  06/23/2007 11:02:10 PAGE     4

0136 90023B          191           MOV DPTR,#TABLE1
                     192     
0139 E6              193           MOV A,@R0           ; 显示纬度的十位
013A 93              194           MOVC A,@A+DPTR
013B 31B4            195           CALL WRITE2
013D 08              196           INC R0
                     197           
013E E6              198           MOV A,@R0           ; 显示纬度的个位
013F 93              199           MOVC A,@A+DPTR
0140 31B4            200           CALL WRITE2
0142 08              201           INC R0
                     202     
0143 742E            203           MOV A,#2EH          ; 显示小数点 .
0145 31B4            204           CALL WRITE2
0147 08              205           INC R0
                     206     
0148 E6              207           MOV A,@R0           ; 显示纬度的十分位
0149 93              208           MOVC A,@A+DPTR
014A 31B4            209           CALL WRITE2
                     210           
014C 22              211           RET
014D                 212     DISPLAY_EW:
                     213     ;------------------
                     214     ;- 显示经度
                     215     ;------------------
014D 759080          216           MOV P1,#80H        ; 显示位置 
0150 319E            217           ACALL ENABLE 
0152 7590C0          218           MOV P1,#0C0H       ; 写入显示起始地址(第二行第一个位置)
0155 319E            219           CALL ENABLE       ; 调用写入命令子程序
                     220                 
0157 7841            221           MOV R0,#65         ; 显示E或W      
0159 E6              222           MOV A,@R0
015A 31B4            223           CALL WRITE2
015C 08              224           INC R0
015D 90023B          225           MOV DPTR,#TABLE1
                     226     
0160 E6              227           MOV A,@R0           ; 显示经度的十位

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -