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

📄 车载终端汇编程序.asm

📁 车载终端汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
org 0000h
ajmp 0200h

org 0023h
sjmp 040h

org 0040h     ;串口中断程序
mov ie,#00h     
mov dpl,#80h
mov dph,#00h
r_gsm:jnb ri,r_gsm
      mov a,sbuf
      clr ri
      cjne a,#0ah,r_gsm ;找到换行键
      mov r1,#02h
r_gsm1:jnb ri,r_gsm1
       mov a,sbuf
       cjne a,#3eh,r_gsm10
       ljmp trans_sm4
r_gsm10:movx @dptr,a
       inc dptr
       clr ri
       cjne a,#0dh,r_gsm1 ;找到回车键
       djnz r1,r_gsm2
       ljmp save_sm
r_gsm2:jnb ri,$
       clr ri
       mov r0,#0fah    ;延时后再判断是否还有信号。
r_gsm3:nop
       nop
       djnz r0,r_gsm3
       mov dpl,#0b0h
       mov dph,#00h
       jnb ri,r_gsm4
       jb ri,r_gsm1 
r_gsm4:mov ie,#90h
       reti

org 0200h
      mov tl1,#0fdh   ;主程序初始化
      mov th1,#0fdh
      mov tl0,#0b0h
      mov th0,#3ch
      mov pcon,#00h
      mov tmod,#21h
      mov ie,#00h
      mov scon,#50h
      setb tr1
      setb tr0
w_at:lcall w_at1
      lcall delay
      lcall judge_gsm
      lcall w_at2
      lcall delay
      lcall judge_gsm
      lcall init8251
      lcall r_gps
      lcall do_gps
      ljmp time
      
w_at1:mov ie,#00h
      mov a,#61h  ;写入at指令1:at 
      mov sbuf,a
      jnb ti,1
      clr ti
      mov a,#74h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#0dh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov ie,#90h
      ret           ;返回主程序

w_at2:mov ie,#00h
      mov a,#61h  ;写入at指令2:at+cnmi=2,2,0,0,0 
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#74h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#2bh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#63h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#6eh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#6dh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#69h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#3dh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#32h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#2ch
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#32h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#2ch
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#30h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#2ch
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#30h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#2ch
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#30h
      mov sbuf,a
      jnb ti,$
      clr ti
      mov a,#0dh
      mov sbuf,a
      jnb ti,$
      clr ti
      mov ie,#90h
      ret           ;返回主程序

delay:mov r0,#64h
      mov r1,#20h
delay1:djnz r0,delay1
       mov r0,#64h
       djnz r1,delay1
       ret

judge_gsm:mov dpl,#80h
          mov dph,#00h
          movx a,@dptr
          cjne a,#4fh,judge_gsm1
          ret 
judge_gsm1:ljmp w_at   

init8251:mov r6,#00h
         mov r7,#00h    ;接收数据在外部RAM中的存放地址0000H
         mov r0,#4fh   ;接收1F个数据
         mov r1,#03h
         mov r2,#0ffh
         mov dptr,#2001h 
init8:mov a,#00h    ;8251回到指令格式
      movx @dptr,a
      mov a,#00h     ;8251回到指令格式
      movx @dptr,a
delay80:djnz r2,delay80
        mov r2,#0ffh     
        mov a,#00h    ;8251回到指令格式    
        movx @dptr,a
delay81:djnz r2,delay81     
        mov r2,#0ffh
        mov a,#40h      ;8251回到指令格式
        movx @dptr,a   
delay82:djnz r2,delay82     
        mov r2,#0ffh
        mov A,#4eh      ;送8251方式字
        movx @dptr,a
delay83:djnz r2,delay83     
        mov r2,#0ffh
        mov a,#16h     ;送8251命令字,允许接收
        movx @dptr,a
delay84:djnz r2,delay84     
        djnz r1,init8
        ret
        
r_gps:mov r7,#00h
      mov r6,#00h
      mov dptr,#2001h
wait80:movx a,@dptr  ;读状态口
     anl a,#02h
     jz  wait80        ;如RXRDY=0,则等待
     mov dptr,#2000h ;RXRDY=1,已接收到一个字节
     movx a,@dptr    ;读入一个字
     cjne a,#0ah,r_gps
r_gps1:mov dptr,#2001h
wait81:movx a,@dptr  ;读状态口
     anl a,#02h
     jz  wait81        ;如RXRDY=0,则等待
     mov dptr,#2000h ;RXRDY=1,已接收到一个字节
     movx a,@dptr    ;读入一个字
     cjne a,#4dh,r_gps1     
r_gps2:mov dptr,#2001h
wait82:movx a,@dptr  ;读状态口
     anl a,#02h
     jz  wait82        ;如RXRDY=0,则等待
     mov dptr,#2000h ;RXRDY=1,已接收到一个字节
     movx a,@dptr    ;读入一个字
     cjne a,#43h,r_gps1  ;找到$GPRMC数据串
loop81:mov dptr,#2001h
wait83:movx a,@dptr  ;读状态口
     anl a,#02h
     jz  wait83        ;如RXRDY=0,则等待
     mov dptr,#2000h ;RXRDY=1,已接收到一个字节
     movx a,@dptr    ;读入一个字
     mov dph,r6   ;取存储数据区地址指针
     mov dpl,r7
     movx @dptr,a   ;接收数据在外部RAM中的存放地址0000H
     inc dptr        ;指针加1
     mov r6,dph    ;指针放回到15H、00H
     mov r7,dpl
     djnz r0,loop81    ;R0不等于0,继续
     ret
     
do_gps:mov dptr,#0000h
do_time:movx a,@dptr
        inc dptr
        cjne a,#2ch,do_time ;找到时间段
        mov r0,#00h
        mov r1,#00h
        mov r2,#00h
  hour:movx a,@dptr
       clr c
       subb a,#30h  ;把十位ascii码变成数字
       mov b,#0ah   ;十位乘以10
       mul ab
       mov r0,a   ;把结果放入r0
       inc dptr
       movx a,@dptr
       clr c
       subb a,#30h  ;把个位ascii码变成数字
       add a,#08h   
       add a,r0
       jnz hour0  ;结果为零时,赋值#7fh
       mov a,#7fh
 hour0:mov r1,dpl
       mov r2,dph      
       mov dptr, #0104h
       movx @dptr,a
minute:mov dpl,r1  
       mov dph,r2
       inc dptr
       movx a,@dptr
       clr c
       subb a,#30h  ;把十位ascii码变成数字
       mov b,#0ah   ;十位乘以10
       mul ab
       mov r0,a   ;把结果放入r0
       inc dptr
       movx a,@dptr
       clr c
       subb a,#30h  ;把个位ascii码变成数字  
       add a,r0 
       jnz minute0   ;结果为零时,赋值#7fh
       mov a,#7fh
minute0:mov r1,dpl
        mov r2,dph
        mov dptr, #0105h
        movx @dptr,a
second:mov dpl,r1  
       mov dph,r2
       inc dptr
       movx a,@dptr
       clr c
       subb a,#30h  ;把十位ascii码变成数字
       mov b,#0ah   ;十位乘以10
       mul ab
       mov r0,a   ;把结果放入r0
       inc dptr
       movx a,@dptr
       clr c
       subb a,#30h  ;把个位ascii码变成数字  
       add a,r0 
       jnz second0   ;结果为零时,赋值#7fh
       mov a,#7fh
second0:mov r1,dpl
        mov r2,dph
        mov dptr, #0106h
        movx @dptr,a            
   Hbit:mov dpl,r1  
        mov dph,r2
        inc dptr
do_Hbit:movx a,@dptr
        inc dptr
        cjne a,#2ch,do_Hbit ;找到有效标志段
        movx a,@dptr
        mov r0,#40h
        cjne a,#56h,Hbit_a
        mov r0,#60h 
 Hbit_a:mov a,r0
        mov r1,dpl
        mov r2,dph
        mov dptr,#0107h
        movx @dptr,a
latitude:mov dpl,r1  
         mov dph,r2
         inc dptr
do_lati:movx a,@dptr
        inc dptr
        cjne a,#2ch,do_lati ;找到纬度段         
latitude0:movx a,@dptr
          mov 62h,a     ;把数据放入(62h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 63h,a     ;把数据放入(63h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz latitude01  ;结果为零时,赋值#7fh
          mov a,#7fh        
latitude01:mov r1,dpl
           mov r2,dph
           mov dptr, #0108h
           movx @dptr,a      
latitude1:mov dpl,r1  
          mov dph,r2
          inc dptr
          movx a,@dptr
          mov 64h,a     ;把数据放入(64h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 65h,a     ;把数据放入(65h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz latitude11  ;结果为零时,赋值#7fh
          mov a,#7fh
latitude11:mov r1,dpl
        mov r2,dph
        mov dptr, #0109h
        movx @dptr,a
latitude2:mov dpl,r1  
          mov dph,r2
          inc dptr
          inc dptr
          movx a,@dptr
          mov 66h,a     ;把数据放入(66h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 67h,a     ;把数据放入(67h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz latitude21  ;结果为零时,赋值#7fh
          mov a,#7fh
latitude21:mov r1,dpl
           mov r2,dph
           mov dptr, #010ah
           movx @dptr,a                
latitude3:mov dpl,r1  
          mov dph,r2
          inc dptr
          movx a,@dptr
          mov 68h,a     ;把数据放入(68h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 69h,a     ;把数据放入(69h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz latitude31  ;结果为零时,赋值#7fh
          mov a,#7fh
latitude31:mov r1,dpl
           mov r2,dph
           mov dptr, #010bh
           movx @dptr,a
           nop
           nop
longitude:mov dpl,r1  
          mov dph,r2
          inc dptr
          inc dptr
do_longi:movx a,@dptr
         inc dptr
         cjne a,#2ch,do_longi ;找到经度段
longitude00:movx a,@dptr
            mov 6ah,a     ;把数据放入(6ah),以便进行校验码的计算。
            jz longitude0
            mov r3,#64h  ;经度大于100度时,百位数据的处理
            mov r1,dpl
            mov r2,dph
            mov dptr,#0107h
            movx a,@dptr
            add a,#02h    ;百位数据对Hbit的影响
            movx @dptr,a
            mov dpl,r1
            mov dph,r2
longitude0:inc dptr
          movx a,@dptr
          mov 6bh,a     ;把数据放入(6bh),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          add a,r3
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 6ch,a     ;把数据放入(6ch),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          cjne a,#80h,longitude01  ;结果为80h时,赋值#7eh
          mov r1,dpl     ;80h对Hbit的影响
          mov r2,dph
          mov dptr,#0107h
          movx a,@dptr
          add a,#02h    
          movx @dptr,a
          mov dpl,r1
          mov dph,r2
          mov a ,#7eh          
          jnz longitude02
longitude01:jnz longitude02 ;结果为00h时,赋值#7fh
            mov r1,dpl     ;00h对Hbit的影响
            mov r2,dph
            mov dptr,#0107h
            movx a,@dptr
            add a,#02h    
            movx @dptr,a
            mov dpl,r1
            mov dph,r2
            mov a,#7fh        
longitude02:mov r1,dpl
            mov r2,dph
            mov dptr, #010ch
            movx @dptr,a   
longitude1:mov dpl,r1  
          mov dph,r2
          inc dptr
          movx a,@dptr
          mov 6dh,a     ;把数据放入(6dh),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 6eh,a     ;把数据放入(6eh),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz longitude11  ;结果为零时,赋值#7fh
          mov a,#7fh
longitude11:mov r1,dpl
            mov r2,dph
            mov dptr, #010dh
            movx @dptr,a
longitude2:mov dpl,r1  
          mov dph,r2
          inc dptr
          inc dptr
          movx a,@dptr
          mov 6fh,a     ;把数据放入(6fh),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 70h,a     ;把数据放入(70h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz longitude21  ;结果为零时,赋值#7fh
          mov a,#7fh
longitude21:mov r1,dpl
            mov r2,dph
            mov dptr, #010eh
            movx @dptr,a
longitude3:mov dpl,r1  
          mov dph,r2
          inc dptr
          movx a,@dptr
          mov 71h,a     ;把数据放入(71h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把十位ascii码变成数字
          mov b,#0ah   ;十位乘以10
          mul ab
          mov r0,a   ;把结果放入r0
          inc dptr
          movx a,@dptr
          mov 72h,a     ;把数据放入(72h),以便进行校验码的计算。
          clr c
          subb a,#30h  ;把个位ascii码变成数字  
          add a,r0 
          jnz longitude31  ;结果为零时,赋值#7fh
          mov a,#7fh
longitude31:mov r1,dpl
            mov r2,dph
            mov dptr, #010fh

⌨️ 快捷键说明

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