📄 车载终端汇编程序.asm
字号:
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 + -