汇编语言与微机接口——交通灯设计

这学期开了汇编语言与微机接口这门课,,那么什么是汇编语言呢?
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
我觉得汇编语言就是一门能从底层让我们清晰的了解到程序都干了什么,有助于我们对程序的执行语句的了解,对调试,找Bug有挺大的帮助。
下面是以及后面几篇是汇编的几个小设计,希望对大家有用。

交通灯设计*

一、设计目的
设计一套十字路口的交通灯管理系统。按照顺序时间控制原则,利用中断控制器和定时器。采用定时中断方式设计实现。东西向和南北向均有红黄绿灯。具备倒计时功能。
南北向通行时间20秒,准备时间5秒。在准备时间里黄灯闪烁3次,闪烁频率为1
秒,周而复始。东西向通行时间40秒,准备时间5秒。在准备时间里黄灯闪烁3次,
闪烁频率为1秒,周而复始。东西向参照下边的时序控制图。

在这里插入图片描述
2. 设计要求
(1) 硬件测试通过。接线完成。三个芯片分别测试通过。8259能够实现中断。8254能够实现呼吸灯。8255能够控制L8—L15的亮与灭。
(2) 1S的定时中断程序能够进入。
(3) 交通灯控制程序
(4) 按KK1按钮开始工作。按KK2按钮停止工作。
(5) 代码转换程序。
(6) LED数码管动态显示程序。
(7) 倒计时程序。
(8) 白天/黑夜功能。
(9) 完善程序。
三、设计方案
1、设计思路
东西南北各三盏灯,每三盏分别为红、黄、绿三种颜色,总共十二盏灯,而实际情况下,东西方向灯亮灭一致,南北方向灯亮灭一致,故只需要按东西为一组,南北为一组,两组交错亮灭来设计控制系统,即可达到交通灯系统的控制目的。根据以上分析那么只需要控制东南或者西北六盏灯亮灭规律就能实现控制,另外两组对应一致就行了。

2、使用的I/O设备

I/O设备使用了KK1+键、8个LED小灯泡、共阴极8段显示数码管。
3、使用的芯片
使用了8259A中断控制器、8255并行输入输出接口芯片、8254定时/计数器芯片。
4、芯片的作用
8259A用于控制中断申请以及发生中断时执行对应的子程序,8255并行接口芯片用于向I/O设备输出控制灯泡或数码管点亮的数据代码,8254定时器利用频率脉冲来实现定时申请中断和动态显示8段数码管。
四、硬件线路设计
1、硬件接线图

2、端口地址说明
                 表6-1  实验箱8259端口地址说明

8259端口地址
主片 从片
偶地址 奇地址 偶地址 奇地址
20H 21H 0A0H 0A1H

               表6-2  实验箱IO端口地址说明

试验箱IO端口地址
A1A0=00 A1A0=01 A1A0=10 A1A0=11
IOY0 0600H 0602H 0604H 0606H
IOY1 0640H 0642H 0644H 0646H
IOY2 0680H 0682H 0684H 0686H
IOY3 06C0H 06C2H 06C4H 06C6H
五、软件设计
1、程序流程图
在这里插入图片描述

2、R变量和M变量说明

P8255A、P8255B、P8255C、P8255M 为8255并行输入输出接口芯片的四个端口地址。
TIMER0、TIMER1、TIMER2、TIMERM 为8254计时器的四个端口地址。
DISCODE 为共阴极8段数码显示管,从0-F的显示代码。
COUNT 为计数变量,用于记录时间。
CTDOWN0 为倒计时时间变量。
POINT 为用于表示红绿灯4种状态的标志变量。
STA 为用于数码管动态显示的标志变量。
3、程序说明
此程序利用5ms的中断实现数码管的动态显示;1s的中断实现每秒使变量COUNT加一,来记录当前时刻的秒数;KK1+ 按键用于申请MIR7中断,来实现交通灯开启功能。

参考程序:

P8255A 		EQU   	0600H 
P8255B 		EQU   	0602H 
P8255C 		EQU   	0604H 
P8255M	 	EQU   	0606H
TIMER0    	EQU  	06C0H	
TIMER1    	EQU  	06C2H
TIMER2	   	EQU  	06C4H
TIMERM 	EQU  	06C6H
DATA 		SEGMENT 
DISCODE	DB		3FH,06H,5BH,4FH,66H,6DH,7DH,07H	;0--7的显示代码
				DB		7FH,6FH,77H,7CH,39H,5EH,79H,71H		;8--F的显示代码
INDEX		DB		00H,00H,00H,00H,00H,00H,0CCH,0CCH
DYNBUFF	DB      00H,00H,00H,00H,00H,00H,00H,00H 	;动态显示缓冲
LOCATN		DB      00H,00H,00H,00H,00H,00H,00H,00H 	;动态显示位置控制
COUNT0		DB		100
CTDOWN0	DB		100
CTDOWN1	DB		100
CTDOWN2	DB		100
CTDOWN3	DB		100
DATA 		ENDS
SSTACK		SEGMENT	PARA  STACK  'STACK'
				DW		32	DUP(?)
SSTACK		ENDS
CODE 		SEGMENT 
			ASSUME 	CS:CODE, DS:DATA,SS: SSTACK			
   START:	MOV		AX,DATA	
			MOV		DS,AX	
;--------------------------------------------------------------- 8255初始化
INITA:	NOP
;--------------------------------------------------------------- 中断芯片
INITB:	PUSH		DS
MOV		AX,0000H	
			MOV		DS,AX		
			MOV		AX,OFFSET	 MIR7
			MOV		SI,003CH
			MOV		[SI],AX
			MOV		AX,CS
			MOV		SI,003EH
			MOV		[SI],AX
			MOV		AX,OFFSET	 MIR6
			MOV		SI,0038H
			MOV		[SI],AX
			MOV		AX,CS
			MOV		SI,003AH
			MOV		[SI],AX
	MOV 		AX, OFFSET	 SIR1 
MOV 		SI, 00C4H 
MOV 		[SI], AX 
MOV		AX, CS 
MOV 		SI, 00C6H 
MOV	 	[SI], AX 
			CLI	
			POP			DS		
;--------------------------------------------------------------- 主
			MOV		AL,11H
			OUT		20H,AL			;ICW1
			MOV		AL,08H
			OUT		21H,AL			;ICW2
			MOV		AL,04H
			OUT		21H,AL			;ICW3
MOV		AL,01H
			OUT		21H,AL			;ICW4
;-------------------------------------------------------------初始化从片8259 
MOV 		AL, 11H 
OUT 		0A0H, AL 		;ICW1 
MOV 		AL, 30H 
OUT	 	0A1H, AL 		;ICW2 
MOV 		AL, 02H 
OUT 		0A1H, AL		 ;ICW3 
MOV 		AL, 01H 
OUT 		0A1H, AL 		;ICW4
 ;--------------------------------------------------------------- 
			MOV		AL,2BH			;OCW1 = 00101011B
	OUT		21H,AL	
	MOV	 	AL, 0FDH 		;OCW1 = 1111 1101B
	OUT 		0A1H,AL 		
			
			STI
	AA1:	NOP
			JMP			AA1
;--------------------------------------------------------------- 定时器芯片
INITC:	MOV		DX, TIMERM
			MOV		AL,36H
			OUT		DX,AL
			MOV		DX, TIMER0			;计数器0
			MOV		AL,0E8H
			OUT		DX,AL
			MOV		AL,03H
			OUT		DX,AL
			MOV		DX, TIMERM
			MOV		AL,76H
			OUT		DX,AL
			MOV		DX, TIMER1			;计数器1
			MOV		AL,0E8H
			OUT		DX,AL
			MOV		AL,03H
			OUT		DX,AL
;--------------------------------------------------------------- 
	BEGIN:	NOP
	AA2:	JMP			AA2
;--------------------------------------------------------------- 
	MIR7	PROC		NEAR
			PUSH		AX
			PUSH		DX
			MOV		AX,0137H
			INT			10H
			MOV		AX,0120H
			INT			10H

			MOV		AL,20H
			OUT		20H,AL
			POP			DX
			POP			AX			
			IRET
	MIR7	ENDP
;--------------------------------------------------------------- 
MIR6	PROC		NEAR
			PUSH		AX
			PUSH		DX

			MOV		AL,20H
			OUT		20H,AL
			POP			DX
			POP			AX			
			IRET
	MIR6	ENDP	
SIR1	PROC		NEAR
			PUSH		AX
			PUSH		DX

			MOV 		AL, 20H 
			OUT 		0A0H, AL 
			OUT 		20H, AL
			POP			DX
			POP			AX			
			IRET
	SIR1	ENDP	
	CODE	ENDS
			END	START		

	2、最终程序清单
P8255A 		EQU   	0640H 
P8255B 		EQU   	0642H 
P8255C 		EQU   	0644H
P8255M	 	EQU   	0646H
TIMER0    	EQU  	0600H	
TIMER1    	EQU  	0602H
TIMER2	   	EQU  	0604H
TIMERM 	EQU  	0606H
DATA 		SEGMENT 
DISCODE	DB		3FH,06H,5BH,4FH,66H,6DH,7DH,07H	;0--7的显示代码
		DB		7FH,6FH,77H,7CH,39H,5EH,79H,71H		;8--F的显示代码
INDEX		DB		00H,00H,00H,00H,00H,00H,0CCH,0CCH
DYNBUFF	DB      00H,00H,00H,00H,00H,00H,00H,00H 	;动态显示缓冲
LOCATN		DB      00H,00H,00H,00H,00H,00H,00H,00H 	;动态显示位置控制
COUNT		DB		00H
CTDOWN0	DW		20,5,25,5
POINT	DB		01H
CTDOWN2	DB		100
CTDOWN3	DB		100
STA     DB    	01H
DATA 		ENDS
SSTACK		SEGMENT	PARA  STACK  'STACK'
				DW		100	DUP(?)
SSTACK		ENDS
CODE 		SEGMENT 
			ASSUME 	CS:CODE, DS:DATA,SS: SSTACK			
START:	MOV		AX,DATA	
MOV		DS,AX	
;--------------------------------------------------------------- 8255初始化
INITA:	NOP
;--------------------------------------------------------------- 中断芯片
INITB:	PUSH		DS
			MOV		AX,0000H	
			MOV		DS,AX		
			MOV		AX,OFFSET	 MIR7
			MOV		SI,003CH
			MOV		[SI],AX
			MOV		AX,CS
			MOV		SI,003EH
			MOV		[SI],AX
			MOV		AX,OFFSET	 MIR6
			MOV		SI,0038H
			MOV		[SI],AX
			MOV		AX,CS
			MOV		SI,003AH
			MOV		[SI],AX
			MOV 		AX, OFFSET	 SIR1 
MOV 		SI, 00C4H 
MOV 		[SI], AX 
MOV		AX, CS 
MOV 		SI, 00C6H 
MOV	 	[SI], AX 
			CLI	
			POP			DS		
;--------------------------------------------------------------- 主
			MOV		AL,11H
			OUT		20H,AL			;ICW1
			MOV		AL,08H
			OUT		21H,AL			;ICW2
			MOV		AL,04H
			OUT		21H,AL			;ICW3
			MOV		AL,11H
			OUT		21H,AL			;ICW4
;-------------------------------------------------------------初始化从片8259 
MOV 		AL, 11H 
OUT 		0A0H, AL 		;ICW1 
MOV 		AL, 30H 
OUT	 	0A1H, AL 		;ICW2 
MOV 		AL, 02H 
OUT 		0A1H, AL		 ;ICW3 
MOV 		AL, 11H 
OUT 		0A1H, AL 		;ICW4
 ;--------------------------------------------------------------- 
			MOV		AL, 6FH			;OCW1 = 01101111B
			OUT		21H, AL	
			MOV	 	AL, 0FDH 		;OCW1 = 1111 1101B
			OUT 		0A1H, AL 		
			STI
;--------------------------------------------------------------- 定时器芯片
INITC:		MOV		DX, TIMERM
			MOV		AL, 36H
			OUT		DX, AL
			MOV		DX, TIMER0			;计数器0
			MOV		AX, 5000
			OUT		DX, AL
			MOV		AL, AH
			OUT		DX, AL
			MOV		DX, TIMERM
			MOV		AL, 76H
			OUT		DX, AL
			MOV		DX, TIMER1			;计数器1
			MOV		AX, 18432
			OUT		DX, AL
			MOV		AL, AH
			OUT		DX, AL
;-------------------------------------------------------------			
			MOV 	DX, P8255M				;8255
			MOV 	AL, 80H 
			OUT 	DX, AL
;---------------------------------------------------------- 
	BEGIN:	NOP
	AA1:	JMP			AA1
;--------------------------------------------------------------- 
CONVERT PROC
	PUSH 	BX
	PUSH 	AX
	MOV BX, OFFSET CTDOWN0
	MOV AL, POINT
	CMP AL, 01H
	JZ P1
	CMP AL, 02H
	JZ P2
	CMP AL, 03H
	JZ P3
	CMP AL, 04H
	JZ P4

P1:	MOV AX, [BX]
	MOV CL, 10
	DIV CL
	JMP T1
P2:	MOV AX, [BX+2]
	MOV CL, 10
	DIV CL
	JMP T1
P3:	MOV AX, [BX+4]
	MOV CL, 10
	DIV CL	
	JMP T1
P4:	MOV AX, [BX+6]
	MOV CL, 10
	DIV CL	
	JMP T1
	
T1:	MOV BX, OFFSET DISCODE
	XLAT
	MOV CH, AL	;十位
	MOV AL, AH
	XLAT
	MOV CL, AL	;个位
	
	POP 	AX
	POP 	BX
	RET
CONVERT ENDP
;----------------------------------------------------------------------
DISPLY1		PROC  		NEAR				; 显示第一位
		PUSH		AX
		PUSH		DX
		MOV 	DX, P8255C
		MOV 	AL, 11111110B	;十位
		OUT 	DX, AL
		MOV 	DX, P8255A
		CALL 	CONVERT
		MOV 	AL, CH
		OUT 	DX, AL
		POP	 	DX
       	POP	 	AX
       	RET
DISPLY1 	ENDP

DISPLY2		PROC  		NEAR				; 显示第二位
		PUSH		AX
		PUSH		DX
		MOV 	DX, P8255C
		MOV 	AL, 11111101B 	;个位
		OUT 	DX, AL
		MOV 	DX, P8255A
		MOV 	AL, CL
		OUT 	DX, AL
		POP	DX
       	POP	AX
       	RET
DISPLY2 	ENDP

DISPLY		PROC					;数码管动态显示代码
		PUSH		AX
	  	MOV		AL,STA
		TEST		AL,01H
	  	JZ			EVEN1
ODD:	MOV		STA,0
	  	CALL		DISPLY1
	 	JMP			DONE
EVEN1:	MOV		STA,01H
		CALL		DISPLY2
DONE:   POP		AX
		RET
DISPLY		ENDP
;----------------------------------------------------------------------
MIR7	PROC		NEAR
			PUSH		DX
			STI
L1:	  MOV DX, P8255B			;南北绿,东西红
	  MOV AL, 38H  			;0011 1000
	  OUT DX, AL 				;Light
      MOV AL, 01H    			;POINT = 1
      MOV POINT, AL
	  MOV COUNT, 0	 
MOV		AL, 2BH			;OCW1 = 00101011B   开SIR2 5ms数码管动态显示中断
OUT		21H, AL	
MOV	 	AL, 0FDH 		;OCW1 = 1111 1101B   也打开MIR6
OUT 		0A1H, AL 		
WAIT20:		CMP COUNT, 20
			JB WAIT20
			MOV DX, P8255B;亮
			MOV AL, 48H 				;0100 1000  
			OUT DX, AL
				INC POINT			 	; POINT = 2
			MOV COUNT, 0
WAIT1:		CMP COUNT, 1
			JB WAIT1
			MOV DX, P8255B					;灭 
			MOV AL, 08H 
			OUT DX, AL
			MOV COUNT, 0
WAIT2:		CMP COUNT, 1
			JB WAIT2
			MOV DX, P8255B					;亮
			MOV AL, 48H 
			OUT DX, AL
			MOV COUNT, 0
WAIT3:		CMP COUNT, 1
			JB WAIT3
			MOV DX, P8255B					;灭 
			MOV AL, 08H 
			OUT DX, AL
			MOV COUNT, 0
WAIT4:		CMP COUNT, 1
			JB WAIT4
			MOV DX, P8255B;亮
			MOV AL, 48H 
			OUT DX, AL
			MOV COUNT, 0
WAIT5:		CMP COUNT, 1
			JB WAIT5
			MOV DX, P8255B					;南北红,东西绿
			MOV AL, 083H   				;1000 0011
	 		OUT DX, AL 						;Light
;-------------------------------------------------------
				INC POINT 					;POINT = 3
			MOV COUNT, 0
WAIT40:		CMP COUNT, 25
			JB WAIT40
				INC POINT    				 ;POINT = 4
			MOV COUNT, 0
WAIT12:		CMP COUNT, 1
			JB WAIT12
			MOV DX, P8255B					;灭 
			MOV AL, 80H 
			OUT DX, AL
			MOV COUNT, 0
WAIT22:		CMP COUNT, 1
			JB WAIT22
			MOV DX, P8255B					;亮
			MOV AL, 84H 
			OUT DX, AL
			MOV COUNT, 0
WAIT32:		CMP COUNT, 1
			JB WAIT32
			MOV DX, P8255B					;灭 
			MOV AL, 80H 
			OUT DX, AL
			MOV COUNT, 0
WAIT42:		CMP COUNT, 1
			JB WAIT42
			MOV DX, P8255B					;亮
			MOV AL, 84H 
			OUT DX, AL
			MOV COUNT, 0
WAIT52:		CMP COUNT, 1
			JB WAIT52
			MOV COUNT, 0
SWITCH:	MOV BX, OFFSET CTDOWN0
			MOV BYTE PTR[BX], 20
			MOV BYTE PTR[BX+2], 5
			MOV BYTE PTR[BX+4], 25
			MOV BYTE PTR[BX+6], 5
			JMP L1
			POP			DX	
			IRET
MIR7	ENDP
;--------------------------------------------------------------- 
MIR6	PROC		NEAR
			PUSH		AX
			PUSH		BX
			INC COUNT
			MOV BX,OFFSET CTDOWN0
			MOV AH,POINT
			CMP AH,01H
			JZ M1
			CMP AH,02H
			JZ M2
			CMP AH,03H
			JZ M3
			CMP AH,04H
			JZ M4
			JMP QUIT6
M1:			DEC BYTE PTR[BX]
        JMP QUIT6
M2:			DEC BYTE PTR[BX+2]
		JMP QUIT6
M3:			DEC BYTE PTR[BX+4]
        JMP QUIT6
M4:			DEC BYTE PTR[BX+6]
		JMP QUIT6
QUIT6:		MOV		AL,20H
			OUT		20H,AL
			POP			BX
			POP			AX			
			IRET
MIR6	ENDP	

SIR1	PROC		NEAR
			PUSH		AX
			PUSH		DX
			STI
			CALL DISPLY
			MOV 		AL, 20H 
			OUT 		0A0H, AL 
			OUT		20H, AL
			POP			DX
			POP			AX			
			IRET
SIR1	ENDP	
	CODE	ENDS
			END	START	

最后的实验结果如下:
在这里插入图片描述
希望对大家有所帮助。

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值