📄 89s51plc.txt
字号:
如何用AT89系列单片机自制PLC控制板
设计者: 施志鹏
在如今自动化生产过程中,大多都是以PLC为核心,或者是用PLC来改造生产设备。它的稳定性,通用性,易学性等,特别是它的通信及网络技术,使得无数学者为它着迷。在众多的优点下,为独的遗憾就是贵啊!因此就有朋友问我,能否用单片机代替PLC。可以,完全可以,只不过会在制作与编程上比较困难一点。下面我将大家介绍如何自制一款,用AT89C2051单片机制作的仿PLC八进六出控制板,当然还比不上真正的PLC,但是制作成本不过80多元。用在一般的小型改造上,我想也够了。
线路原理如(图一),线路中的单片机为AT89C2051,也可以是AT89C4051, 后者的程序储存空间为4K。输入通道与输出通道采用了4颗TLP-521-4光电耦合,在输出通道的后级还用了一颗ULN2003电流放大器,主要是驱动小型继电器线圈。D1—D8为输入端口指示,
D9—D14为输出端口指示,D15为线路板上的指示灯,它的用途由用户定义,比如某个工作步的指示。控制板的输入电压为5V和12V两种,5V主要是供给输入部份和单片机本身使用,12V电压是供给输出部份。在这就有朋友问道:为什么要用到两个电源?5V直流电的继电器在市面上也有得卖。选用两种电源作为供给,只是为了提高控制板本身工作时的稳定性,因为继电器在释放时会产生反电势,对电源有点影响,除非用户选用5V的开关电源,不过我相信大多的DIY最后会选择7812和7805作为电源部份,所以在设计上采用了两种电源,这样比较划算。(图二)为控制板的工程接线图,用过PLC的朋友们是否会觉得很像熟悉。(图三)为这个线路的PCB走线图。
为了让大家在设计上有个程序参考,本人分别用汇编语言与C语言各写一个程序供大家参考。这两个程序只要稍作修改,就可以得到另一种用户程序。
汇编语言:
;==============================
;定义输入部份
SB1 EQU P3.0
SB2 EQU P3.1
SB3 EQU P3.2
SB4 EQU P3.3
SB5 EQU P3.4
SB6 EQU P3.5
SB7 EQU P3.7
SB8 EQU P1.0
KA1 EQU P1.7
KA2 EQU P1.6
KA3 EQU P1.5
KA4 EQU P1.4
KA5 EQU P1.3
KA6 EQU P1.2
LED EQU P1.1 ;这样的定义,可以方便设计。
ORG 0030H
RESET:
MOV R0,#00H
DJNZ R0,$ ;系统延时
MOV SP,#60H
MOV P3,#0FFH
MOV P1,#0FFH ;输出初始化
NOP
NOP
;===========================================
;主程序部份 输入按钮
MAIN: MOV R0,#0FFH
MOV DPTR,#TAB ;跳转表赋值
;按钮程序判断
START: JNB SB1,LL1
JNB SB2,LL2
JNB SB3,LL3
JNB SB4,LL4
JNB SB5,LL5
JNB SB6,LL6
JNB SB7,LL7
JNB SB8,LL8
CJNE R0,#0FFH,NEXT
AJMP START
NEXT: MOV A,R0 ;程序跳转表
RL A
JMP @A+DPTR
;==========================================
LL1: CALL KT10MS ;调用10ms的时间延时,躲过开关抖动
JNB SB1,LLL1
AJMP START
LLL1: MOV R0,#00H
AJMP NEXT
;=========================
LL2: CALL KT10MS
JNB SB2,LLL2
AJMP START
LLL2: MOV R0,#01H
AJMP NEXT
;=========================
LL3: CALL KT10MS
JNB SB3,LLL3
AJMP START
LLL3: MOV R0,#02H
AJMP NEXT
;=========================
LL4: CALL KT10MS
JNB SB4,LLL4
AJMP START
LLL4: MOV R0,#03H
AJMP NEXT
;=========================
LL5: CALL KT10MS
JNB SB5,LLL5
AJMP START
LLL5: MOV R0,#04H
AJMP NEXT
;=========================
LL6: CALL KT10MS
JNB SB6,LLL6
AJMP START
LLL6: MOV R0,#05H
AJMP NEXT
;=========================
LL7: CALL KT10MS
JNB SB7,LLL7
AJMP START
LLL7: MOV R0,#06H
AJMP NEXT
;========================
LL8: CALL KT10MS
JNB SB8,LLL8
AJMP START
LLL8: MOV R0,#07H
AJMP NEXT
;==============================================
;跳转表入口处
TAB: AJMP SQ1
AJMP SQ2
AJMP SQ3
AJMP SQ4
AJMP SQ5
AJMP SQ6
AJMP SQ7
AJMP SQ8
;==============================================
;跳转表入口程序处理部份,即是按每个按钮SB1至SB8的不信号进行处理
;可以在每个按钮程序部份插入用户想实现的动作步
;按钮SB1的程序处理
SQ1: CLR KA1 ;KA1动作
MOV R0,#0FFH
AJMP START
;按钮SB2的程序处理
SQ2: CLR KA2 ;KA2动作
MOV R0,#0FFH
AJMP START
;按钮SB3的程序处理
SQ3: CLR KA3 ;KA3动作
MOV R0,#0FFH
AJMP START
;按钮SB4的程序处理
SQ4: CLR KA4 ;KA4动作
MOV R0,#0FFH
AJMP START
;按钮SB5的程序处理
SQ5: CLR KA5 ;KA5动作
MOV R0,#0FFH
AJMP START
;按钮SB6的程序处理
SQ6: CLR KA6 ;KA6动作
MOV R0,#0FFH
AJMP START
;按钮SB7的程序处理
SQ7: CLR LED ;LED指示亮
MOV R0,#0FFH
AJMP START
;按钮SB8的程序处理
SQ8: SETB KA1 ;停KA1
SETB KA2 ;停KA2
SETB KA3 ;停KA3
SETB KA4 ;停KA4
SETB KA5 ;停KA5
SETB KA6 ;停KA6
SETB LED ;停LED
MOV R0,#0FFH
AJMP START
;======================================================
;时间继电器
KT10MS: MOV R5,#0BH
F1: MOV R7,#02H
F2: MOV R6,#0FFH
F3: DJNZ R6,F3
DJNZ R7,F2
DJNZ R5,F1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -