发表于:2003-09-06 09:40:00
楼主
中国人的z893要与德国人的CAN一较高低之六 51所使用的[软猫]
CAN 与z893尽管同属[局部网],
但是两者具有根本的差别,这种差别就在于:
前者为通讯协议,
后者为服务器。
就如同两个原始部落,
前者发明了用绳节记数,
后者已开始使用上了甲骨文,
两者已具有了质的分别。
CAN 的协议里不含有任何直接面向I/O控制的指令,
当它挂接在一个系统之上时,仅仅只能是一个传声筒,
z893就不一样了,当它挂接在一个系统之上时,
那怕是win98me这样的巨人,它也只能称之为工作站。
CAN 采用2总线,使用专用芯片上网,俗称[硬猫]。
z893采用3总线,使用软件协议上网,俗称[软猫]。
两者之间存在着的明显的差别:
[硬猫]协议透明度差,自我保护性强,系统商利益大,配套厂家成本高,升级难.
[软猫]协议透明度高,自我保护性差,系统商利益小,配套厂家成本低,升级容易.
z893之所以采用后者是基于我们是发展中国家,
企业起步晚,家底薄,
不可能一刀一枪地与那些超级企业相拼,
只有最便宜的总线才能为配套厂家所采用,
说白了,
z893必须与中国的小公司,小企业同生同死,共求发展,
也才有一线生存的希望,
这是非常重要的。
下面将[51系列的软猫]转贴给大家,
如果理解有困难,没关系,
你只要照本宣科地搬进你的程序就行,
用多了,自然就会会的,
说不定还能搞出几个功能更强的[新猫]。
关于win98me的[软猫],
我也将会在以后的贴子中与同行们相见,
不过我弄不懂,贴上来的贴子[指源程序]怎么书写的格式变了??难看了??
只有请大家原谅。
;[注][em_z893.工作站.汇编源程序清单]
; [24倍速服务器下][时钟晶体] 分频系数 14.7456MHz/ 4 =115.2KbP/S
; [ 8倍速服务器下][时钟晶体] 分频系数 14.7456MHz/16 = 28.8KbP/S
; P0:=0100 [数据库]0100 置 [P0口]
; P2:=0101 [数据库]0101 置 [P2口]
ORG 0000H
em0000: LJMP em0400 ; 复位 RESET 入口
ORG 0003H
em0003: LJMP emT01 ; INT0 外部中断 入口[em-z893.工作站系统使用]
ORG 000BH
em000B: LJMP em1000 ; T0 溢出 入口
ORG 0013H
em0013: LJMP em2000 ; INT1 外部中断 入口
ORG 001BH
em001B: LJMP em3000 ; T1 溢出 入口
ORG 0023H
em0023: LJMP emT05 ; 串口IN/OUT 入口[em-z893.工作站系统使用]
ORG 002BH
em002B: ; T2 OR P1.1 入口
em0033: ; ADUC812_A/D 转换结束 入口
em003B: ; ADUC812_T2CI ISPI串行 入口
em0043: ; ADUC812_PSMI 电源监视器 入口
;******************** .软猫.含扩展LJMP em0300 ********************
; [z893.工作站.振铃服务程序] T=21-47
;18/21 [INT0 中断服务程序入口]
ORG 0050H
emT01: PUSH 0D0H ;2[PSW] [PSW]标志进栈
PUSH 0E0H ;2[ACC] [ACC]标志进栈
MOV 68H, #01H ;2[68] [串IN 标志=01]00关01开
MOV 69H, #00H ;2[69] [串OUT标志=00]00关01开
MOV 60H, #61H ;2[60] [读指针=61]复位
MOV 70H, #71H ;2[70] [写指针=71]复位
MOV A, 7AH ;1[A ][7A] [交换标志]00空闲01启动02正在运行
CJNE A, #01H,emT03 ;2[A ] [不等01]去[交换标志]复位
emT02: POP 0E0H ;2[ACC] [ACC]标志出栈
POP 0D0H ;2[PSW] [PSW]标志出栈
RETI ;2[--] [中断返回]:[7A等于01]!!!
emT03: XRL 7AH, A ;1[7A][A ] [交换标志置00]:[00空闲][01启动][02运行]
LJMP em0300 ;2[--] 去[用户的自动交换程序入口]_!!!
; [z893.工作站.IN/OUT串行中断服务程序] T=19-43
;8/10 [串行中断服务程序入口]
emT05: PUSH 0D0H ;2[PSW] [PSW]标志进栈
PUSH 0E0H ;2[ACC] [ACC]标志进栈
PUSH 00H ;2[R0] [R0] 标志进栈
JBC 98H, emT06 ;2[RI] RI等于1去[读程序OK!]清RI
JBC 99H, emT12 ;2[TI] TI等于1去[写程序OK!]清TI
;8+3+8=19 [读专用分配程序]/RI=1
emT06: MOV A, 68H ;1[A ][68] 取[串IN标志]00关01开
JZ emRETI ;2[--] [等于00]去[中断返回]
;8+3+24+8=43 [置显示IR/D程序]/D=#63H
emT07: MOV A, 60H ;1[A ][60] 取[读指令]指针
CJNE A, #63H,emT08 ;2[A ] 不等于[#63]去[启动交换]
MOV 63H, 99H ;2[63][SBUF] 取[IRD]数据=[SBUF]
INC 60H ;1[60] [读指令]指针+1
PUSH 83H ;2[DPH] 标志进栈[DPH]
PUSH 82H ;2[DPL] 标志进栈[DPL]
MOV DPTR, #0200H ;2[DPTR] 置[ROM]初值[#0200H]
MOV A, 62H ;1[A ][62] 变址量A=62H
MOVC A, @A+DPTR ;2[A ][DP