实验一 工业顺序控制
P1.0~P1.6控制七只发光二极管的点亮,模拟注塑机的七道工序,低电平有效,设定每道工序时间转换为延时。
P3.4为开工启动开关,高电平启动;P3.3为外部故障输入模拟信号,低电平报警;P1.7为报警声音输出。
设定前6道工序每道工序只有一位输出低电平点亮一位LED,第七道工序三位有输出,点亮三位LED。
实验程序框图
实验代码
ORG 0000H
LJMP PO10
ORG 0003H
LJMP INT
ORG 0100H
PO10: MOV P1, #7FH
ORL P3, #00H
PO11: JNB P3.4, PO11 ;为0则转移(1则开工)
ORL IE, #84H ;ORL=逻辑或
ORL IP, #01H
MOV PSW, #00H ;初始化
MOV SP, #53H
PO12:
MOV P1, #7EH ;0111 1110
ACALL PO1B
MOV P1, #7DH ;0111 1101
ACALL PO1B
MOV P1, #7BH ;0111 1011
ACALL PO1B
MOV P1, #77H ;0111 0111
ACALL PO1B
MOV P1, #6FH ;0110 1111
ACALL PO1B
MOV P1, #5FH ;0101 1111
ACALL PO1B
MOV P1, #0FH ;0000 1111
ACALL PO1B
SJMP PO12
ORG 0003H
INT: //0003H中断源优先级最高,无需开关中断。
MOV B, R2 ;现场保护
PO17: MOV P1, #7FH ;关闭输出
//若要LED显示报警响起时的位置则去除“关闭输出”代码。
MOV 20H, #0A0H ;振荡次数
PO18: SETB P1.7 ;对P1.7置数,振荡
ACALL PO1A ;延时
CLR P1.7 ;对P1.7清零,停止
ACALL PO1A ;延时
DJNZ 20H, PO18 ;减1不为零则跳转(20H储存的是振荡次数)
CLR P1.7 ;停止振荡
ACALL PO1A ;延时
JNB P3.3, PO17 ;JNB-直接寻址位为零则转移(故障是否消除)
MOV R2, B ;恢复现场
RETI //返回断点处
PO19: MOV R2, #10H
ACALL DELY ;延时1
RET
PO1A: MOV R2, #06H
ACALL DELY ;延时2
RET
PO1B: MOV R2, #30H
ACALL DELY ;延时3
RET
ORG 0200H
DELY: PUSH 02H ;R2设置延时时间
DEL2: PUSH 02H
DEL3: PUSH 02H
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
结果和分析
开机启动流水灯模拟流水线后,二极管依次点亮,即工序执行正常。模拟外部故障时声音报警响起,故障解决后报警声停止,流水灯从报警时的地方继续执行下去。
实验二 独立按键计数
用独立按键的某一个按键,接外部中断0的引脚P3.2。第一次按下,数码管显示1,第二次按下数码管显示2,每一次按键数字加1,一直显示到9,然后再按下,重新从0开始显示。
要求显示数字不能连续跳动,每一次按下按键的同时,有蜂鸣器产生按键声音。
实验代码
ORG 0000H
AJMP START
ORG 000BH
AJMP INT
START:
MOV R0,#0
MOV P2,0FFH
MOV P1,0H
SETB IT0 ;设置外部中断0为下降沿触发
SETB EX0 ;启用外部中断0
SETB EA
MAIN:
LCALL DISPLAY
SJMP MAIN
INT:
LCALL DELAY
JB P3.2,RETU
CLR P2.7
LCALL DELAY
SETB P2.7
MOV A,R0
ADD A,#1
MOV R0,A
CJNE R0,#10,INT_LOOP
MOV R0,#0
INT_LOOP:
LCALL DISPLAY
JNB P3.2,INT_LOOP //P3.2为低电平,则按键仍在按下,循环等待。
LCALL DELAY
RETU:
RETI
DISPLAY:
MOV A,R0
MOV DPTR,#TAB
MOVC A, @A+DPTR
MOV P1,A
LCALL DELAY
RET
DELAY: MOV R5,#20
D1: MOV R6,#10
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
TAB:
DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
结果和分析
第一次按下,数码管显示1,第二次按下数码管显示2,每一次按键数字加1,一直显示到9,然后再按下,重新从0开始显示。显示数字不连续跳动,每一次按下按键的同时,有蜂鸣器产生按键声音。