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

📄 final.asm

📁 汇编语言编写的串口服务器 适用于51系列单片机
💻 ASM
📖 第 1 页 / 共 3 页
字号:
mov R6,A

mov DPH,20h
mov DPL,21h

call pac_send

mov R0,#0D4h
mov R1,#64h
mov R2,#4
lop1058:
mov A,@R0
mov @R1,A
inc R0
inc R1
djnz R2,lop1058



ret

ping_reply:
;--------------
mov DPH,2Ah
mov DPL,2Bh
clr A
movx @DPTR,A
inc DPTR
movx @DPTR,A
inc DPTR
movx A,@DPTR
add A,#8        ;校验和+8
movx @DPTR,A
inc DPTR
movx A,@DPTR
addc A,#0
movx @DPTR,A
mov A,DPL
clr C
subb A,#11
mov DPL,A
mov A,DPH
subb A,#0
mov DPH,A
mov 2Ah,DPH
mov 2Bh,DPL
mov R0,#0D0h         ;对方ip
mov R1,#4
Loopa:
movx A,@DPTR
mov @R0,A
inc R0
inc DPTR
djnz R1,loopa
mov R0,#0D0h
mov R1,#4
loopb:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopb

mov DPH,2AH
mov DPL,2BH
mov R0,#60h
mov R1,#4
loopc:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopc

mov A,DPL
clr C
subb A,#30
mov DPL,A
mov A,DPH
subb A,#0
mov DPH,A
mov 2AH,DPH
mov 2BH,DPl
mov R0,#0AAh
mov R1,#6
loopd:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopd

mov R0,#056h
mov R1,#6
loope:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loope

mov DPH,2AH
mov DPL,2BH

mov A,R7
add A,#34
mov R7,A
mov A,R6
addc A,#0
mov R6,A
call pac_send
ret


ping_return:
;----------
inc DPTR
inc dPTR
inc DPTR
movx A,@DPTR
cjne A,#12h,ret1539
inc DPTR
movx A,@DPTR
cjne A,#34h,ret1539
inc DPTR
movx A,@DPTR
mov B,A
mov A,#2Fh
clr C
subb A,B
mov B,#8
div AB
mov B,A                ;时间 ?ms

mov R0,#0CAh
mov @R0,#1
mov DPTR,#s19
mov R0,#11
call cout

mov A,2BH
clr C
subb A,#8
mov DPL,A
mov A,2Ah
subb A,#0
mov DPH,A

mov R0,#0C0H
mov R1,#4
l1569:
movx A,@DPTR
mov @R0,A
inc R0
inc DPTR
djnz R1,l1569
mov R0,#0C0H
mov R2,#4
call i_to_S
mov A,#':'
call com_send
mov A,#' '
call com_send
mov DPTR,#s21
mov R0,#5
call cout
mov R2,B
mov R0,#2
mov R2,#1
call i_to_s
mov DPTR,#s22
mov R0,#7
call cout
mov R0,#5Eh          ;TTL
mov R2,#1
call i_to_s
mov A,#0Dh
call com_send
mov A,#0Ah
call com_send

ret1539:
ret


;------------ICMP----------




;**********UDP*********
udp_rec:
;----------
mov 28h,DPH       ;UDP部分开始处
mov 29h,DPL

inc DPTR
inc DPTR
movx A,@DPTR
cjne A,68H,L1455
inc DPTR
movx A,@DPTR
cjne A,69H,L1455
sjmp L1453
;端口号不对
L1455:

ret

L1453:
inc DPTR
movx A,@DPTR
cjne A,06h,exit1162
inc DPTR
movx A,@DPTR
cjne A,07h,exit1162
inc DPTR
movx A,@DPTR
inc DPTR
jnz  L1166
movx A,@DPTR
jz  L1168          ;no checksum
L1166:


mov A,DPL
clr C
subb A,#17
mov DPL,A
jnc L1176
dec dPH
L1176:
mov A,R6
movx @DPTR,A
inc DPTR
mov A,R7
movx @DPTR,A
mov A,DPL
clr C
subb A,#3
mov DPL,A
jnc L1188
dec dPH
L1188:
clr A
movx @DPTR,A

mov A,R7
add A,#12
mov R3,A
mov A,R6
addc A,#0
mov R2,A

call checksum
mov A,R4
jnz exit1162
mov A,R5
jnz exit1162
;校验无误

L1168:
mov DPH,28h
mov DPL,29h
mov A,DPL
add A,#08
mov DPL,A
jnc L1213
dec DPH
L1213:
mov A,R7
clr C
subb A,#8      ;得到数据长度
mov R7,A
mov A,R6
subb A,#0
mov R6,A

call buffer_send      ;将数据直接发到串口上

exit1162:
ret
;***********UDP*********


tcp_rec:
;-------

ret


;************************net***************************
net_initial:
;----------------------------------

;-----------initial_start------------------
reset:
setb T0
call delay
clr T0

mov DPTR,#8000h
mov A,#21h
movx @DPTR,A
call delay


;reg0A=00    --RBCR0
mov DPL,#0ah
mov A,#00h
movx @DPTR,A
;reg0B=00    --RBCR1
mov DPL,#0bh
mov A,#00h
movx @DPTR,A
;reg0C=0xE0   --RCR
mov DPL,#0ch
mov A,#0E0h
movx @DPTR,A
;reg0d=0XE2  ---TCR
mov DPL,#0dh
mov A,#0E2h
movx @DPTR,A
;reg01=0x4C   --PSTART
mov DPL,#01h
mov A,#4ch
movx @DPTR,A
;reg02=0x80   --PSTOP
mov DPL,#02h
mov A,#80h
movx @DPTR,A
;reg03=0x4C   --BNRY
mov DPL,#03h
mov A,#4Ch
movx @DPTR,A
;reg04=0x40   --TPSR
mov DPL,#04h
mov A,#40h
movx @DPTR,A
;reg07=0xFF   ---ISR
mov DPL,#07h
mov A,#0FFh
movx @DPTR,A
;reg0F=0x00   ----IMR
mov DPL,#0fh
mov A,#00h
movx @DPTR,A
;reg0e=0xC8   ---DCR
mov DPL,#0eh
mov A,#0C8h
movx @DPTR,A




;page(1)
mov DPTR,#8000h
movx A,@DPTR
anl  A,#3Bh
mov B,#40h  ;0100 0000
orl A,B
movx @DPTR,A

;mac:56H-5Bh
mov DPL,#01h
mov A,56H
movx @DPTR,A
inc DPl
mov A,57H
movx @DPTR,A
inc DPl
mov A,58H
movx @DPTR,A
inc DPl
mov A,59H
movx @DPTR,A
inc DPl
mov A,5AH
movx @DPTR,A
inc DPl
mov A,5Bh
movx @DPTR,A



mov DPL,#07H
;Curr=0x4D    ---Curr
mov A,#4Dh
movx @DPTR,A

;mar=00-41-00-80-00-00-00-00
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#41h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#80h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
;---------------------

;page(0)
mov DPL,#00h
movx A,@DPTR
anl  A,#3Bh
movx @DPTR,A

;reg0c=0xcc    --RCR
mov DPL,#0ch
mov A,#0cch     ;---- 接收广播和多播
movx @DPTR,A
;reg0d=0xE0  ---TCR
mov DPL,#0dh
mov A,#0E0h
movx @DPTR,A
;reg07=0xFF      中断状态清零
mov DPl,#07h
mov A,#0FFh
movx @DPTR,A
;reg0F=0x11   中断屏蔽设置
mov DPl,#0Fh
mov A,#11h      ;只开接收中断
movx @DPTR,A

;reg00=0x22
mov DPl,#00h
mov A,#22h
movx @DPTR,A
call delay
ret
;-----------------------initial_End-----------------------------------


delay:
;----------------延时约0.5s ----------
mov R2,#05h
lp2:
mov R1,#241
lp1:
mov R0,#255
loop0:
nop
djnz R0,loop0
djnz R1,lp1
djnz R2,lp2
ret
;------------------------

pac_send:
;----------------*********************-------------------
;--------------从XRAM 中复制一段数据,写入8019  长度:R6,R7 位置 DPTR
clr EX0
mov 46h,R6
mov 47h,R7
PUSH 20H
PUSH 21H
mov 20H,DPH
mov 21h,DPL
PUSH DPH
PUSH DPL
mov A,R6
jnz c35
mov A,R7
subb A,#60
jNC  c35
mov  R7,#60
c35:
mov DPTR,#8008h
clr A
movx @DPTR,A
inc dpl
mov A,#40h   ;<----dma页面
movx @DPTR,A
inc dpl
mov A, R7  ; <----------length
movx @DPTR,A
inc dpl
mov A,R6
movx @DPTR,A

mov DPTR,#8004h
mov A,#40h
movx @DPTR,A
inc dpl
mov A,R7    ;<----=-------length
movx @DPTR,A
inc dpl
mov A,R6
movx @DPTR,A

mov dpl,#0
mov A,#12h
movx @DPTR,A

inc R6
lp101:
mov dpH,20h
mov dpl,21h
movx A,@DPTR
inc DPTR
mov 20h,DPH
mov 21h,DPL
mov DPTR,#8010h
movx @DPTR,A
djnz R7,lp101
djnz R6,lp101

mov dpl,#0
mov A,#22h
movx @DPTR,A
;--------------数据包写入完成

;--------------------发送数据包-------------------
l000p:
mov dpl,#0
mov A,#3Eh         ;<-------注意是3EH,11EH时会有错误,不能写入新的包.
movx @DPTR,A

l00p:
movx A,@DPTR       ;<--------此处约等待1ms,视数据包大小而有所改变
ANL A,#04h
jnz l00p
mov DPL,#04h
movx A,@DPTR
ANL A,#01h
jz l000p

POP DPL
POP DPH
POP 21H
POP 20H
mov R6,46h
mov R7,47h
setb EX0
ret
;---------------------


pac_receive:
;----------------------------------------
;收取数据包
;(BNRY+1==CURR)? return:receive&continue

mov DPTR,#8003h
movx A,@DPTR     ;BNRY
;if (BNRY==0x7F) BNRY=0x4C; else BNRY++
mov B,A
inc B
mov A,B
cjne A,#80h,L1426      ;if bnry==80h , bnry=4ch
mov B,#4Ch
L1426:
;page(1)
mov DPL,#0
mov A,#62h
movx @DPTR,A
;CURR
mov DPL,#07
movx A,@DPTR

clr C
subb A,B
jnz  L1251
LJMP Empty     ;没有新的数据包了
L1251:
;page(0)
mov dpl,#0
mov A,#22h
movx @DPTR,A

mov dpl,#08h    ;DMA起始地址
clr A
movx @DPTR,A
inc dpl
mov A,B         ;<-----BNRY+1
movx @DPTR,A
inc dpl         ;DMA 字节数
mov A,#18         ;先读出前18个字节
movx @DPTR,A
inc dpl
clr A
movx @DPTR,A
mov dpl,#0
mov A,#0Ah        ;DMA read
movx @DPTR,A

mov R0,#0A0h      ;前18字节读出放入0A0-0B1H
mov R1,#18
mov DPTR,#8010h
loop325:
movx A,@DPTR
mov @R0,A
inc R0
djnz R1,loop325

mov dpl,#0
mov A,#22h       ;DMA complete
movx @DPTR,A

mov R0,#0BFh     ;收到的帧数
mov A,@R0
add A,#1
mov @R0,A
dec R0
jnc L1891
mov A,@R0
add A,#1
mov @R0,A
dec R0
jnc L1891
mov A,@R0
inc A
mov @R0,A
L1891:

mov R0,#0A0h
mov A,@R0

inc R0
mov A,@R0
mov B,A    ;nextpage ->B
inc R0
mov A,@R0   ;length
clr C
subb A,#04
mov R7,A
inc R0
mov A,@R0
subb A,#0
mov R6,A

mov A,B        ;if (nextpage>=80h or <4Ch or len >1500 )
clr C          ;drop all packets & return
subb A,#80h
jnc bug
mov A,B
clr C
subb A,#4Ch
jc bug
mov A,R6
clr C
subb A,#6
jc L1913

bug:
;page(1)
mov DPL,#0
mov A,#62h
movx @DPTR,A
;CURR
mov DPL,#07
movx A,@DPTR
dec A
mov B,A
;page(0)
mov DPL,#0
mov A,#22h
movx @DPTR,A
mov A,B
mov DPL,#3
movx @DPTR,A
ret

L1913:
mov  R0,#0B0h
mov A,@R0
clr C
subb A,#08h
jnz rec_next
inc R0
mov A,@R0
jz  type_is_ip         ;0800 IP
mov A,@R0
clr C
subb A,#06h
jnz rec_next
mov A,#0FFH            ;0806


PUSH ACC
sjmp L1314
type_is_ip:
mov R0,#0A4h
mov A,@R0
clr C
subb A,#0FFH
jz rec_next
clr A
PUSH ACC
L1314:
mov DPl,#08h
mov A,#4
movx @DPTR,A
mov dpl,#0Ah
mov A,R6
movx @DPTR,A
inc dpl
mov A,R7
movx @DPTR,A
mov dpl,#0
mov A,#0Ah
movx @DPTR,A

mov 26H,24H
mov 27H,25H
inc R6
loop3025:
mov DPTR,#8010h
movx A,@DPTR
mov DPH,26H
mov DPL,27H
movx @DPTR,A
inc DPTR
mov 26H,DPH
mov 27H,DPL
djnz R7,loop3025
djnz R6,loop3025
mov DPTR,#8000h
mov A,#22h
movx @DPTR,A

mov A,25H
add A,#0EH         ;去掉头部14字节
mov DPL,A
mov A,24H
addc A,#0
mov DPH,A
POP ACC

jz  is_ip_packet
call arp_rec
mov 24h,#40
mov 25h,#00h
sjmp rec_next

is_ip_packet:
call ip_rec
nop
rec_next:
mov R0,#0A1H
mov A,@R0    ;next page
dec A
mov B,A
cjne A,#4Bh, d101 ; if BNRY=0x4B BNRY=0x7F
mov B,#7Fh
d101:
mov A,B
mov DPTR,#8003h
movx @DPTR,A    ; write to BRNY
Ljmp  pac_receive


Empty:
;page(0)
mov dpl,#0
mov A,#22h
movx @DPTR,A
ret


;***************************************


org 1000h
;*******************************数据区域**********************************

ether_data:
;--------mac
DB 00h,00h,00h,00h,00h,00h
DB 00h,11h,22h,033h,44h,55h
DB 08h,00h

ip_data:
DB 192,168,0,2    ; 源IP
DB 192,168,0,3
DW 1234,1234  ;端口号
;--------

subnet_data:
DB 192,168,0,2
DB 255,255,255,0
DB 192,168,0,1
;--------------

arp_data:
DB 08h,06h,00h,01h,08h,00h,06h,04h,00h,01h

Data_segment:
s1:
DB '欢迎使用串口服务器!',0Dh,0Ah
s2:
DB '初始化......',0Dh,0Ah
s3:
DB '**************************',0Dh,0Ah
DB '默认配置:',0Dh,0Ah
DB 'MAC:00-11-22-33-44-55',0Dh,0Ah
DB 'IP:192.168.0.2',0Dh,0Ah
DB '子网掩码:255.255.255.0',0Dh,0Ah
DB '网关:192.168.0.1',0Dh,0Ah
DB '目的IP:192.168.0.3',0Dh,0Ah
DB '传输协议:UDP',0Dh,0Ah
DB '本地端口:1234,远程端口:1234',0Dh,0Ah
DB '***************************',0Dh,0Ah
s4:
DB '要修改配置,请在5秒内按下任意键...  ',0Dh,0Ah
s5:
DB '帮助信息:',0Dh,0Ah
DB 'cmd',0Dh,0Ah
DB 'exit',0Dh,0Ah
DB 'set (mac,ip,mask,gate,destip,sourport,destport) *',0Dh,0Ah
DB 'ping ip',0Dh,0Ah
DB 'send ip port udp/tcp',0Dh,0Ah
DB 'help',0Dh,0Ah
;----------------------------
s6:
DB '?*欢迎使用串口服务器*?',0dh,0ah,'welcome to serial server !!    ',0dh,0ah
;

s8:
DB 'OK!',0Dh,0Ah
s9:
DB 'Wrong!Input again!',0Dh,0Ah
s7:
DB '本机IP '
s10:
DB '目的IP '
s11:
DB '子网掩码 '
s12:
DB '网关 '
s13:
DB '修改完毕!',0Dh,0Ah ;11
s14:
DB 0Dh,0Ah,'请逐项修改,直接<ENTER>保留原来设置',0Dh,0Ah,0Dh,0Ah       ;40
s15:
DB '开始正常运行......',0Dh,0AH
s16:
DB 'Pinging '      ;8
s17:
DB ' with 32 bytes of data:',0Dh,0Ah,           ;25
s18:
DB 'Ping 请求超时!',0Dh,0Ah           ;16
s19:
DB 'Reply from '         ; 11
s20:
DB '找不到对方主机!',0Ah,0DH
s21:
DB 'time='
s22:
DB 'ms,TTL='
end0:
END

⌨️ 快捷键说明

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