【汇编】课程实验-工业顺序控制、独立按键计数(51单片机)

实验一 工业顺序控制


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开始显示。显示数字不连续跳动,每一次按下按键的同时,有蜂鸣器产生按键声音。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值