汇编语言(九)硬件课程设计总结——洗衣机

本文是在为期两周的硬件课程设计结束之后,博主整理的关于使用8086汇编语言编程来操作8255等接口芯片,实现一个较为完整的微型计算机控制系统的设计。

课程设计要求说明书+汇编.asm源码+proteus仿真图+可运行程序+程序设计流程图

选题:模拟控制的全自动洗衣机 —— 按下启动按钮,洗衣机电源导通,准备进入洗衣程序。在洗衣过程可任意时刻按下停止键,洗衣程序中止运行。按下启动按钮,程序重新开始运行。(博主附加了数码管倒计时显示的甩干模式等)

主要用到的工具有:唐都实验箱(8086CPU、8255接口芯片等)、工具箱、Wmd32、Proteus仿真软件(据说只能在32位OS下使用,所以还需配备 win7 32位OS)、

因为是小组合作完成,博主主要是在Wmd32下写汇编代码,并加载到实验箱检测调试结果,然后将汇编连接后的.EXE文件给负责proteus仿真的同学就可以了,对Proteus仿真细节其实不很熟,不过那软件因为在Windows下,所以上手应该也快。Wmd32也很好用,用鼠标点点就行了。因为是计科专业(找个理由),焊接也做得不是很漂亮,所以就不上图了,这里找来一朋友的小弟焊的板子给大家看看。

汇编语言(九)硬件课程设计总结——洗衣机_第1张图片          汇编语言(九)硬件课程设计总结——洗衣机_第2张图片

好了,现在给出主要设计过程

  • ①根据设计内容,给出设计方案,选择需要的接口芯片和外设等,确定相应的接口芯片的工作方式,并给出所设计的系统布线图。
  • ②根据系统要求,完成程序设计,报告中给出程序流程图说明程序设计思想。
  • ③根据设计方案,在Proteus下完成仿真设计,给出Proteus下仿真执行截图。
  • ④焊接硬件电路板,保证电路布线焊接正确。
  • ⑤将焊电路的板子与实验箱连接,并运行实验箱上的程序,调试出结果。
  • ⑥分别拍照,打印出焊接电路板与实验箱连接的系统运行截图。

下面是proteus仿真图

汇编语言(九)硬件课程设计总结——洗衣机_第3张图片

程序设计流程图

汇编语言(九)硬件课程设计总结——洗衣机_第4张图片

最终连接实物图

最后附上源代码

;=========================================================
; 文件名: 
; 功能描述: 全自动滚筒洗衣机
;=========================================================

SSTACK	SEGMENT STACK
		DW 256 DUP(?)
SSTACK	ENDS

DATA	SEGMENT
led 	db 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH    ;数码管倒计时序列9~0
ioporta equ 600h    ;端口A地址
ioportb equ 602h    ;端口B地址
ioportc equ 604h    ;端口C地址
TABDT	DB 01H,03H,02H,06H,04H,0CH,08H,09H  ;步进电机序列
DATA	ENDS

CODE	SEGMENT
		ASSUME CS:CODE, DS:DATA

START:  
;====================Begin===========================

	    MOV AX, DATA
        MOV DS, AX
        mov dx,606h
		mov al,88H    ;方式0,A输出,B输出,C低四位输出
		out dx,al	
		
BEGIN:	
		CALL TUBE_STOP
		MOV DX, 0604H
        IN  AL, DX	;读C口输入
        MOV BL, AL
        
        MOV CL, 4
        SHR BL, CL	;获取低四位
        CMP BL, 0
        JZ  BEGIN
        CMP BL, 1	;若开关1打开,甩干模式
        JZ  FASTEST
        CMP BL, 02H
		JZ  FAST
		CMP BL, 04H
		JZ  SLOW
		JMP BEGIN	
		
FASTEST:
 		CMP DI,10	;甩干模式出来停止
        JZ  BEGIN
		call meantime
		;MOV DI, 1000H	;约定使用DI来传递参数(延时长短)
		;CALL SPEED  ;甩干模式,急速快
FAST:
		MOV DI, 4000H	;约定使用DI来传递参数(延时长短)
        CALL SPEED	;开关1被打开,速度1标准
SLOW:        
		MOV DI, 8000H	;约定使用DI来传递参数(延时长短)
        CALL SPEED	;开关2被打开,速度2轻柔        

;**************读取开关子程序**************
READ	PROC
		PUSH DX
		PUSH AX
		PUSH BX
		PUSH CX
		
		MOV DX, 0604H
        IN  AL, DX	;读C口输入
        MOV BL, AL
        MOV CL, 4
        SHR BL, CL	;获取低四位
        CMP BL, 0
        JZ  BEGIN
;        CMP BL, 1	;若开关1打开,甩干模式
;        JZ  Q1
;       CMP BL, 02H	;若开关2打开,标准模式
;		JZ  FAST
;		CMP BL, 04H	;若开关3打开,轻柔模式
;		JZ  SLOW
        POP CX
        POP BX
        POP AX
        POP DX
        
        RET
READ	ENDP
						;动态数码管停止;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TUBE_STOP PROC
	PUSH AX
	PUSH BX
	PUSH DX
	mov dx,606h
	mov al,88H;方式0,A输出,B输出,C低四位输出
	out dx,al		;初始化8255
	mov bx,offset led
	mov al,11111001b	;选择全部
	mov dx,ioportc
	out dx,al 	;出C口 选择个位	
	mov al,[bx+9]	;
	mov dx,ioporta
	out dx,al	;从a口输出	
	POP	DX
	POP BX
	POP	AX		
	RET
TUBE_STOP ENDP						

;**************同步**************
meantime proc
	
	mov dx,606h
	mov al,10001000b;方式0,A输出,B输出,C输出
	out dx,al		;初始化8255
	mov bx,offset led
	mov si,0;个位
	mov di,8;十位
	mov cx,12
	
digit1:		;动态刷新一次数码管数字
	CALL GEW	;从a口输出
	call delay;1000
	CALL TEN
	CALL shuaigan
	call read	;读开关
    loop digit1
        
digit3:	
	mov cx,12
	inc si
	cmp si,9
	jbe  digit1
	
	CMP  DI,9	;只为判断最后一次00情况
	Ja  DIGIT4

	inc di	;满十进一
	mov si,0;清零个位
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
digit2:			;个位刷成0,十位刷成 原来-1

	CALL GEW
	call delay;1000
	CALL TEN
	CALL shuaigan
	call read	;读开关
	loop digit2
	
	mov  cx,12
	CMP  DI,9
	JBe  DIGIT3

DIGIT4:	;输出为0结束程序
	call tube_stop
	jmp begin
	
meantime endp
;******************个位*******************
GEW PROC
		PUSH AX
		PUSH BX
		PUSH DX
		PUSH SI
			mov bx,offset led
			mov al,11111011b	;选择个位
			mov dx,ioportC
			out dx,al 	;出C口 选择个位
			
			mov al,[bx+SI]	;
			;NOT AL       ;这条指令与数码管共阴极或共阳极有关,具体可根据实际情况,添加或删除
			mov dx,ioporta
			out dx,al	;从a口输出
		POP SI
		POP DX
		POP BX
		POP AX
		RET
GEW ENDP
;******************十位*******************
TEN PROC
		PUSH AX
		PUSH BX
		PUSH DX
		PUSH DI
			
			mov bx,offset led	
		
			mov al,11111101B	;选择十位
			mov dx,ioportC
			out dx,al 	;出c口 选择十位
			
			mov al,[bx+di];
			;NOT AL    ;这条指令与数码管共阴极或共阳极有关,具体可根据实际情况,添加或删除
			mov dx,ioporta
			out dx,al	;从a口输出
			
		POP DI
		POP DX
		POP BX
		POP AX
		RET
TEN ENDP	
;**************延时子程序*****************
delay proc
		push cx
		mov cx,500h
	del:
		;nop
		nop
		loop del	
		pop cx
		ret
delay endp
;**************甩干子程序****************
shuaigan proc
		push ax
		push bx
		push cx
		push dx
		MOV  	BX, OFFSET TABDT
		MOV  	CX, 0008H                          	
	Q2:	
		
		call    gew
			
		MOV	AL,[BX]   
		MOV  	DX, 0602H		; 写B口       
		OUT	DX, AL
		INC	BX
		call 	delay		; 控制步进电机的+转速1000 
		call 	delay
		call 	delay
		call 	delay
		CALL    TEN
		call 	delay
		call 	delay
		call 	delay
		call 	delay
		LOOP 	Q2
		
		pop dx
		pop cx
		pop bx
		pop ax
		ret
shuaigan endp			
				
;***************延时子程序****************
DALLY PROC
;			PUSH DI
			PUSH CX
			MOV  CX, DI
	A3:		PUSH AX
			POP	 AX
			LOOP A3
			POP  CX
;			POP  DI
			RET
			
DALLY	ENDP
;*************电机驱动子程序********************      
SPEED PROC
				 
		
MAIN:   MOV  AL, 88H			; 控制B口工作于方式0,输出
		MOV  DX, 0606H              
		OUT  DX, AL
			
		MOV  SI, 0			;SI用于计算反转时间
;***************正转*****************	
A1:		
			
		MOV  BX, OFFSET TABDT
	    MOV  CX, 0008H                          	
A2:		MOV	 AL,[BX]   
		MOV  DX, 0602H		; 写B口       
		OUT	 DX, AL
		
		CALL DALLY		; 控制步进电机的+转速  
					       
		INC	 BX                                      
		LOOP A2
			
		CALL READ
			
		INC SI				;SI用于计算反转时间
		CMP SI, 8H	    	;8次后反转
		JB	A1
			
		PUSH DI
		MOV  DI, 0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP  DI

		PUSH DI
		MOV  DI, 0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP DI
		
		PUSH DI
		MOV  DI, 0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP  DI
		
		JMP  A5
A8:		JMP  A1	
		;	CALL DALLY  		;正反转切换,需停止休息(模仿现实中洗衣机)
		;	CALL DALLY  		;正反转切换,需停止休息
;***************反转***************			
A5:		
		MOV  BX, OFFSET TABDT+7
	    MOV  CX, 0008H                          	
A4:		
	    MOV  AL,[BX]   
		MOV  DX, 0602H		; 写B口       
		OUT	 DX, AL
		CALL DALLY		; 控制步进电机的+转速                
		DEC  BX                                      
		LOOP A4
			
		CALL READ
			
		DEC SI				;SI用于计算反转时间
		CMP SI, 0			;0后正转
		JA  A5
						
		PUSH DI
		MOV  DI,0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP  DI
		
		PUSH DI
		MOV  DI,0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP  DI
		
		PUSH DI
		MOV  DI,0FFFFH
		CALL DALLY  		;正反转切换,需停止休息
		POP  DI
		
		;	CALL DALLY  		;正反转切换,需停止休息
		;	CALL DALLY  		;正反转切换,需停止休息
		JZ  A8
		
		RET
SPEED	ENDP	

CODE	ENDS
		END START

最后,希望大家都能好好完成这些实践类学习。不要只停留在课本上,满足于考试的分数(当然你可以拿奖学金也很厉害),但作为工科学生来说,还是应该多动手实践。本来计科的硬件相关课程已经砍得很多了,如果连仅剩的一点都丢掉,那真是很可悲的事情。

你可能感兴趣的:(Assembly)