;工业控制程序
;实验目的:
;1.掌握单片机开发系统的使用
;2.掌握一次性在线仿真调试的全过程
;3.掌单片机如何编程及中断的应用
;实验原理:
;在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些断续生产过程,
;这些断续生产过程又都是按某种顺序有规律地完成预定的动作。对这类断续生
;产过程的控制称顺序控制。
;例如注塑机要生产一个工件,其工艺过程大致按"合模→注射→延时→开模
; →产伸→产退"这么个时间顺序动作。这种顺序控制采用单片机是很容易实现的。
;本实验是以控制注塑机为例而设计的典型时间顺序控制实验。
; 我们把89XX P0口的0-6位依次用发光二极管作为模拟输出指示,
;共分7道工序,P1.7为声光报警,P3.4为开工启动开关,P3.2,P3.3为外部故障输入模拟开关,
;低电平告警。
;为了问题简单化,我们设定每道工序只有一位有输出(高电平灯亮),工作流程表如下:
;P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 工序 控制字
;0 0 0 0 0 0 0 1 1 01H
;0 0 0 0 0 0 1 0 2 02H
;0 0 0 0 0 1 0 0 3 04H
;0 0 0 0 1 0 0 0 4 08H
;0 0 0 1 0 0 0 0 5 10H
;0 0 1 0 0 0 0 0 6 20H
;0 1 0 0 0 0 0 0 0 40H
;1 0 0 0 0 0 0 0 0 80H
;以上设硬件接线为高电平有效,如果设硬件接线为低电平有效(灌电流,减小CPU功耗),
;LED灯亮,你又如何写出控制字!请你画出程序流程图!
ORG 0000H ;工业顺序控制程序
AJMP MIN ;转主程序
ORG 0003H ;INT0中断入口地址
AJMP INTA ;转中断服务程序
ORG 0013H ; INT1中断入口地址
AJMP INTB ;转中断服务程序
ORG 0050H ;主程序
MIN: MOV SP,#50H
MOV P0,#0FFH ;关P0口(设高电平LED灯亮)
MOV P3,#0FFH ;关P3口(设低电平工作
L0056: JNB T0,$ ;等开工(P3.4)
ORL IE,#85H ;允许INT0,INT1中断
ORL IP,#04H ;设为INT1为优先中断
L005F: MOV P0,#0FEH ;执行工序1
ACALL S00E0 ;延时
MOV P0,#0FDH ; 执行工序2
ACALL S00E0 ;
MOV P0,#0FBH ; 执行工序3
ACALL S00E0 ;
MOV P0,#0F7H ; 执行工序4
ACALL S00E0 ;
MOV P0,#0EFH ; 执行工序5
ACALL S00E0 ;
MOV P0,#0DFH ; 执行工序6
ACALL S00E0 ;
MOV P0,#0BFH ; 执行工序7
ACALL S00E0 ;
MOV P0,#7FH ;执行工序8
ACALL S00E0 ;
SJMP L005F ;循环
ORG 0090H ;INT0中断服务程序
INTA: MOV B,R2 ;保护现场
MOV P0,#0FFH ;关输出
MOV 20H,#0F0H ;报警声参数
L0098: SETB P1.7 ;P1.7输出报警声
ACALL S00D0 ;延时时间比INT1长
CLR P1.7 ;
ACALL S00D0 ;
DJNZ 20H,L0098 ;不为零转
CLR P1.7 ;
ACALL S00E0 ;
JNB INT0,L0098 ;INT0为零继续报警
MOV R2,B ; INT0为1不报警,恢复现场
SETB P1.7
RETI ;中断返回
ORG 00B0H ; INT1中断服务程序
INTB: MOV B,R2 ; 保护现场
MOV P1,#0FFH ; 关输出
MOV B,#20H ; 报警声参数
L00B8: SETB P1.7 ; P1.7输出报警声
ACALL S00D6 ; 延时时间比INT0短
CLR P1.7 ;
ACALL S00D6 ;
DJNZ 20H,L00B8 ; 不为零转
CLR P1.7 ;
ACALL S00E0 ;
JNB INT1,L00B8 ; INT1为零继续报警
MOV R2,B ; INT1为1不报警,恢复现? SETB P1.7
RETI ; 中断返回
ORG 00D0H
S00D0: MOV R2,#07H ;
ACALL S00EB ;
RET ;
ORG 00D6H
S00D6: MOV R2,#05H ;
ACALL S00EB
RET
ORG 00E0H ;
S00E0: MOV R2,#25H
ACALL S00EB
RET
ORG 00EBH ;通用延时子程序
S00EB: PUSH 02H ;R2(复位后R2即为02H)存放时间常数,进栈保护
L00ED: PUSH 02H ; R2进栈保护
L00EF: PUSH 02H ; 进栈
L00F1: DJNZ R2,$ ;R2不为零等待
POP 02H ;出栈
DJNZ R2,L00EF ; R2不为零转
POP 02H ; 出栈
DJNZ R2,L00ED ; R2不为零转
POP 02H ; 出栈
DJNZ R2,S00EB ; R2不为零转
RET ;子程序返回
END
|