plc到复杂指令集(8051)编译器设计(汇编)2-组合逻辑部分-基本控制指令
在最开始一定要注意,使用的单片机指令集至少要有100条左右,不然很有可能是没有逻辑指令的精简架构,在指令翻译过程中会有严重问题,例如机器码的非一致性。
本文中的plc系统指令使用三菱fx1,单片机使用amd87c51,其他衍生型号可能略有出入,标题以PLC指令为准
请忽略t0,这是时序逻辑范畴,不在组合逻辑部分内描述
文字描述的伪代码:读取按钮,装入中间寄存器,输出到y0;读取取反按钮,装入寄存器,输出到m100(内存空间);后省略
重要的一件事就是:一定要看好机器码!!指令具体是不一样的
位操作mov分别是a2和92!
LD+OUT
MOV C,P0.0
MOV P1.0,C
LDI+OUT
MOV C,P0.0
CPL C
MOV P1.0,C
其中,ldi对应前两句
机器码:
A2
B3
92
LD+OUTM
MOV C,P0.0
MOV 30H,C
对于51来说,ram相当有限,00h-7fh可以作为m中间继电器的存储区域,共128位,推荐用Q系列的八位编号方式,例如Q0.0,对应30h,Q0.7对应37h
LDM+OUT
MOV C,30H
MOV P1.1,C
LD+AND+OUT
MOV C,P0.0
ANL C,P0.1
MOV P1.0,C
A2
82
92
LD+ANI+OUT+AND+OUT
MOV C,P0.0
ANL C,/P0.1
MOV P1.0,C
ANL C,P0.2
MOV P1.1,C
A2
B0
92
82
B0
LD+OR+ORI+OUT
MOV C,P0.0
ORL C,P0.1
ORL C,/P0.2
MOV P1.1,C
A2
72
A0
B0
LD+SET
MOV C,P0.0
ORL C,P1.0
MOV P1.0,C
A2
72
92
从机器码可以看出,ld+set等效于ld+ory+out
LD+RST
MOV C,P0.0
ANL C,/P0.1
MOV P1.1,C
A2
B0
92
sety和m是一样的
m使用的是位地址,而不是单元地址,只能用c来操作
如果要使用D这样的八位数字寄存器,则需要使用单元地址30h-7fh
LD+RSTD (程序中应避免)
MOV C,P0.0
JC FINISH
MOV 30H,#00H
FINISH:
A2
40
75
这就很恶心了,使用了伪指令,这样一来,伪指令标签还要再自加数字,如果后边还有rstd的话
所以尽量用传送指令清D
这是一个fx1n加入的指令,在线上取反
LD+INV+OUT
MOV C,P0.0
CPL C
MOV P1.0,C
A2
B3
92
这一坨(只适用于一个ld后边的分支,只有一个mpp和mps,有一堆mrd的简单情况,不应使用)
MOV C,P0.0
;LD
MOV ACC,#00H
MOV ACC.0,C
;MPS
ANL C, 30H
;AND
MOV P1.0,C
;OUT
MOV C,ACC
;MRD
ANL C,3FH
;AND
MOV P1.1,C
;OUT
MOV C,ACC
;MPP
ANL C,40H
;AND
MOV P1.2,C
;OUT
正确的mps和mpp,最后一行前边插入了分支mrd
程序最开始的地方按需求应该放置sp
MOV SP,#00H
;BEGIN
MOV C,P0.0
CPL C
;LDI
MOV ACC.0,C
PUSH A
;MPS
ANL C,P0.1
;AND
MOV ACC.0,C
PUSH A
;MPS
ANL C,/P0.3
;ANI
MOV P1.0,C
;OUT
POP A
MOV C,ACC.0
;MPP
ANL C,P0.2
;AND
MOV P1.1,C
;OUT
POP A
MOV C,ACC.0
;MPP
ANL C,P0.3
;AND
MOV ACC.0,C
PUSH A
;MPS
ANL C,/P0.3
;AND
MOV P0.3,C
;OUT
MOV C,ACC.0
;MRD
ANL C,P0.5
;AND
MOV P0.4,C
;OUT
POP A
MOV C,ACC.0
;MPP
ANL C,P0.6
;AND
MOV P0.5,C
;OUT