⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 毕业设计.asm

📁 单片机制作PLC
💻 ASM
📖 第 1 页 / 共 2 页
字号:
  In0  BIT  P0.0	  
  In1  BIT  P0.1
  In2  BIT  P0.2
  In3  BIT  P0.3
  InMap0  BIT  20H.0   ;输入映像存储区
  InMap1  BIT  20H.1
  InMap2  BIT  20H.2
  InMap3  BIT  20H.3

  Out0  BIT  P1.0
  Out1  BIT  P1.1
  Out2  BIT  P1.2
  Out3  BIT  P1.3 
  OutMap0  BIT  20H.4	;输出映像存储区
  OutMap1  BIT  20H.5
  OutMap2  BIT  20H.6
  OutMap3  BIT  20H.7
/***************************************************************************************************/
//定义10个定时器
//每个定时器由四部分组成:溢出标志位(逻辑位)DTn,触发启动标志位STn,计数器TCn_L和TCn_H,初值Kn_L和Kn_H
DT0 	BIT 	21H.0
DT1 	BIT 	21H.1
DT2 	BIT 	21H.2
DT3 	BIT 	21H.3
DT4 	BIT     21H.4
DT5 	BIT 	21H.5
DT6 	BIT 	21H.6
DT7 	BIT 	21H.7
DT8 	BIT 	22H.0
DT9 	BIT 	22H.1

ST0 	BIT 	22H.2
ST1 	BIT 	22H.3
ST2 	BIT 	22H.4
ST3 	BIT 	22H.5
ST4 	BIT 	22H.6
ST5		BIT 	22H.7
ST6 	BIT 	23H.0
ST7 	BIT 	23H.1
ST8 	BIT 	23H.2
ST9 	BIT 	23H.3

TC0_L	EQU 	28H
TC0_H	EQU 	29H
TC1_L	EQU 	2AH
TC1_H	EQU 	2BH
TC2_L	EQU 	2CH
TC2_H	EQU 	2DH
TC3_L	EQU 	2EH
TC3_H	EQU 	2FH
TC4_L	EQU 	30H
TC4_H	EQU 	31H
TC5_L	EQU 	32H
TC5_H	EQU 	33H
TC6_L	EQU 	34H
TC6_H	EQU 	35H
TC7_L	EQU 	36H
TC7_H	EQU 	37H
TC8_L	EQU 	38H
TC8_H	EQU 	39H
TC9_L	EQU 	3AH
TC9_H	EQU 	3BH	 ;每个计数器占两个字节

K0_L	EQU 	3CH
K0_H	EQU 	3DH
K1_L	EQU 	3EH
K1_H	EQU 	3FH
K2_L	EQU 	40H
K2_H	EQU 	41H
K3_L	EQU 	42H
K3_H	EQU 	43H
K4_L	EQU 	44H
K4_H	EQU 	45H
K5_L	EQU 	46H
K5_H	EQU 	47H
K6_L	EQU 	48H
K6_H	EQU 	49H
K7_L	EQU 	4AH
K7_H	EQU 	4BH
K8_L	EQU 	4CH
K8_H	EQU 	4DH
K9_L	EQU 	4EH
K9_H	EQU 	4FH	 ;每个占两个字节 
/***************************************************************************************************/		
//定义10个计数器
//每个定时器由四部分组成:逻辑位Cn,	复位标志位RSTn,计数器有Cn_L和Cn_H两两部分
C0 		BIT 	23H.4
C1 		BIT 	23H.5
C2 		BIT 	23H.6
C3 		BIT 	23H.7
C4 		BIT     24H.0
C5 		BIT 	24H.1
C6 		BIT 	24H.2
C7 		BIT 	24H.3
C8 		BIT 	24H.4
C9 		BIT 	24H.5

RST0 	BIT 	24H.6	;复位标志
RST1 	BIT 	24H.7
RST2 	BIT 	25H.0
RST3 	BIT 	25H.1
RST4 	BIT 	25H.2
RST5	BIT 	25H.3
RST6 	BIT 	25H.4
RST7 	BIT 	25H.5
RST8 	BIT 	25H.6
RST9 	BIT 	25H.7

C0_L	EQU 	50H
C0_H	EQU 	51H
C1_L	EQU 	52H
C1_H	EQU 	53H
C2_L	EQU 	54H
C2_H	EQU 	55H
C3_L	EQU 	56H
C3_H	EQU 	57H
C4_L	EQU 	58H
C4_H	EQU 	59H
C5_L	EQU 	5AH
C5_H	EQU 	5BH
C6_L	EQU 	5CH
C6_H	EQU 	5DH
C7_L	EQU 	5EH
C7_H	EQU 	5FH
C8_L	EQU 	60H
C8_H	EQU 	61H
C9_L	EQU 	62H
C9_H	EQU 	63H	 ;每个计数器占两个字节

PV0_L	EQU 	64H
PV0_H	EQU 	65H
PV1_L	EQU 	66H
PV1_H	EQU 	67H
PV2_L	EQU 	68H
PV2_H	EQU 	69H
PV3_L	EQU 	6AH
PV3_H	EQU 	6BH
PV4_L	EQU 	6CH
PV4_H	EQU 	6DH
PV5_L	EQU 	6EH
PV5_H	EQU 	6FH
PV6_L	EQU 	70H
PV6_H	EQU 	71H
PV7_L	EQU 	72H
PV7_H	EQU 	73H
PV8_L	EQU 	74H
PV8_H	EQU 	75H
PV9_L	EQU 	76H
PV9_H	EQU 	77H	 ;每个占两个字节 
/***************************************************************************************************/
		ORG  	0000H
		AJMP	Main
		ORG  	000BH
		AJMP 	IT0Int	 ;T0中断
		ORG 	0030H
Main:  
		ACALL Initi				 ;初始化
  Loop: ACALL GetIn				 ;输入采样
	    LCALL Process			 ;程序处理
		ACALL GetOut			 ;输出控制
	    SJMP Loop
/***************************************************************************************************/
/*初始化*/
Initi: 	 
		 MOV  	SP,		#78H 
		 MOV 	P0,		#00H  	;输入初始化
         MOV 	P1,		#0FFH  	;输出初始化,输出是负逻辑
		 
		 MOV 	TMOD,	#01H	 ;定时器0工作在方式1。12MHz晶振
 		 MOV 	TH0,	#3CH
		 MOV 	TL0,	#0B0H	 ;定时50000us(设0.05s为所有计时器的时间基)
		 SETB   EA
		 SETB	ET0

		 LCALL  Initi_Timer
		 LCALL  Initi_Counter

		 SETB   TR0
		 RET
;=====================================================
/*输入采样*/
GetIn:		   
	     CLR InMap0
		 CLR InMap1
		 CLR InMap2
		 CLR InMap3

		 JNB  	In0,	CHK1
		 ACALL  	KT10MS  ;调用10ms的时间延时,躲过开关抖动
		 JNB  	In0,	CHK1
		 SETB 	InMap0 	

   CHK1: JNB  	In1,	CHK2
	     ACALL  	KT10MS  
	     JNB  	In1,	CHK2
	     SETB 	InMap1

   CHK2: JNB  	In2,	CHK3
		 ACALL  	KT10MS  
		 JNB  	In2,	CHK3
		 SETB 	InMap2

   CHK3: JNB  	In3,	EndCHK
		 ACALL  	KT10MS  
		 JNB  	In3,	EndCHK
		 SETB 	InMap3

   EndCHK:RET
;=====================================================		
;时间继电器
KT10MS: 
		 MOV  R5,#0BH
	F1:  MOV  R7,#02H
	F2:  MOV  R6,#0FFH
	F3:  DJNZ  R6,F3
         DJNZ  R7,F2
         DJNZ  R5,F1
         RET
;=====================================================
/*输出控制*/	
GetOut:	 
		 MOV 	C,		OutMap0
		 CPL	C				;程序处理时时正逻辑,输出时是负逻辑
		 MOV 	Out0,	C 		;从输出映像输出
		 	
		 MOV 	C,		OutMap1
		 CPL	C
		 MOV 	Out1,	C

		 MOV 	C,		OutMap2
		 CPL	C
		 MOV	Out2,	C

		 MOV 	C,		OutMap3
		 CPL	C
		 MOV 	Out3,	C
		 RET
/***************************************************************************************************/
/*定时中断程序*/
IT0Int:   CLR 	TR0
		  PUSH 	PSW
		  PUSH 	ACC
		  MOV 	TH0,	#3CH
		  MOV 	TL0,	#0B0H	
;依次查询计时器的状态标志S是否打开,即计时器是否启动,若启动,计数器加1		  
		  JNB 	ST0,		Next1
		  INC 	TC0_L
		  MOV A , TC0_L			   ;低位加1后为0,则高位加1
		  JNZ    Next1
          INC 	TC0_H 

  Next1:  JNB 	ST1,		Next2
  		  INC 	TC1_L
		  MOV A , TC1_L
		  JNZ    Next2
          INC 	TC1_H 
		  	
  Next2:  JNB 	ST2,		Next3
  		  INC 	TC2_H 
		  MOV A , TC2_L
		  JNZ    Next3
		  INC 	TC2_L

  Next3:  JNB 	ST3,		Next4
  		  INC 	TC3_L
		  MOV A , TC3_L
		  JNZ    Next4
          INC 	TC3_H 
	
  Next4:  JNB 	ST4,	Next5  
  		  INC 	TC4_L
		  MOV A , TC4_L
		  JNZ    Next5 
          INC 	TC4_H 

  Next5:  JNB 	ST5,	Next6 
  		  INC 	TC5_L
		  MOV A , TC5_L
		  JNZ    Next6 
          INC 	TC5_H 
		  	
  Next6:  JNB 	ST6,		Next7 
          INC 	TC6_L
		  MOV A , TC6_L
		  JNZ    Next7 
          INC 	TC6_H 

  Next7:  JNB 	ST7,		Next8	
  		  INC 	TC7_L
		  MOV A , TC7_L
		  JNZ    Next8
          INC 	TC7_H 
		  	
  Next8:  JNB 	ST8,		Next9  
  		  INC 	TC8_L
		  MOV A , TC8_L
		  JNZ    Next9
          INC 	TC8_H 

  Next9:  JNB 	ST9,	EndInt	  
  	      INC 	TC9_L
		  MOV A , TC9_L
		  JNZ    EndInt
          INC 	TC9_H 
		  
  EndInt: POP ACC
		  POP PSW
		  SETB TR0
 		  RETI
;=====================================================
/*定时器程序*/
;当前逻辑运算值在位累加器C中
Tim0:		JNC		Off0
			JNB		ST0,	Open0
		 
			MOV		A,		TC0_L			//当输入逻辑为1时,如果定时器已经启动,则需要检测定时器是否溢出
			CJNE    A,		K0_L,	Exit0
			MOV		A,		TC0_H
			CJNE    A,		K0_H,	Exit0
			SETB	DT0					    //一旦检测到定时器溢出,置定时器逻辑标志位,同时关闭定时器
			SJMP    Rest0

	Open0:	JB		ST0,		Exit0
			JB		DT0,		Exit0
			SETB	ST0						//当输入逻辑为1时,如果定时器没有启动,也没有溢出,则启动该定时器
			RET 

	Off0:	CLR		DT0		
	Rest0:	CLR		ST0		
			MOV     TC0_H,		#00H 		   
			MOV     TC0_L,		#00H

	Exit0:	RET
;=====================================================
Tim1:		JNC		Off1
			JNB		ST1,	Open1
		 
			MOV		A,		TC1_L			
			CJNE    A,		K1_L,	Exit1
			MOV		A,		TC1_H
			CJNE    A,		K1_H,	Exit1
			SETB	DT1					    
			SJMP    Rest1

	Open1:	JB		ST1,		Exit1
			JB		DT1,		Exit1
			SETB	ST1						
			RET 

	Off1:	CLR		DT1		
	Rest1:	CLR		ST1		
			MOV     TC1_H,		#00H 		   
			MOV     TC1_L,		#00H

	Exit1:	RET
;=====================================================
Tim2:		JNC		Off2
			JNB		ST2,	Open2
		 
			MOV		A,		TC2_L			
			CJNE    A,		K2_L,	Exit2
			MOV		A,		TC2_H
			CJNE    A,		K2_H,	Exit2
			SETB	DT2					    
			SJMP    Rest2

	Open2:	JB		ST2,		Exit2
			JB		DT2,		Exit2
			SETB	ST2						
			RET 

	Off2:	CLR		DT2		
	Rest2:	CLR		ST2		
			MOV     TC2_H,		#00H 		   
			MOV     TC2_L,		#00H

	Exit2:	RET
;=====================================================
Tim3:		JNC		Off3
			JNB		ST3,	Open3
		 
			MOV		A,		TC3_L			
			CJNE    A,		K3_L,	Exit3
			MOV		A,		TC3_H
			CJNE    A,		K3_H,	Exit3
			SETB	DT3					    
			SJMP    Rest3

	Open3:	JB		ST3,		Exit3
			JB		DT3,		Exit3
			SETB	ST3						
			RET 

	Off3:	CLR		DT3		
	Rest3:	CLR		ST3		
			MOV     TC3_H,		#00H 		   
			MOV     TC3_L,		#00H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -