本文是在为期两周的硬件课程设计结束之后,博主整理的关于使用8086汇编语言编程来操作8255等接口芯片,实现一个较为完整的微型计算机控制系统的设计。
课程设计要求说明书+汇编.asm源码+proteus仿真图+可运行程序+程序设计流程图
选题:模拟控制的全自动洗衣机 —— 按下启动按钮,洗衣机电源导通,准备进入洗衣程序。在洗衣过程可任意时刻按下停止键,洗衣程序中止运行。按下启动按钮,程序重新开始运行。(博主附加了数码管倒计时显示的甩干模式等)
主要用到的工具有:唐都实验箱(8086CPU、8255接口芯片等)、工具箱、Wmd32、Proteus仿真软件(据说只能在32位OS下使用,所以还需配备 win7 32位OS)、
因为是小组合作完成,博主主要是在Wmd32下写汇编代码,并加载到实验箱检测调试结果,然后将汇编连接后的.EXE文件给负责proteus仿真的同学就可以了,对Proteus仿真细节其实不很熟,不过那软件因为在Windows下,所以上手应该也快。Wmd32也很好用,用鼠标点点就行了。因为是计科专业(找个理由),焊接也做得不是很漂亮,所以就不上图了,这里找来一朋友的小弟焊的板子给大家看看。
好了,现在给出主要设计过程:
;=========================================================
; 文件名:
; 功能描述: 全自动滚筒洗衣机
;=========================================================
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
最后,希望大家都能好好完成这些实践类学习。不要只停留在课本上,满足于考试的分数(当然你可以拿奖学金也很厉害),但作为工科学生来说,还是应该多动手实践。本来计科的硬件相关课程已经砍得很多了,如果连仅剩的一点都丢掉,那真是很可悲的事情。