【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)

洗衣机控制模拟系统设计

  • 1 设计题目及要求
    • 1.1 设计题目
    • 1.2设计要求
  • 2 方案分析与设计
    • 2.1 需求分析
      • 2.1.1 角色分析
      • 2.1.2 用例分析
        • 2.1.2.1 开机用例
        • 2.1.2.2 关机用例
        • 2.1.2.3 注水用例
        • 2.1.2.4 洗涤用例
        • 2.1.2.5 甩干用例
        • 2.1.2.6 显示用例
        • 2.1.2.7 计时用例
        • 2.1.2.8 指令处理用例
      • 2.1.3用例关系
    • 2.3 软件流程
      • 2.3.1 主程序流程
      • 2.3.2 中断流程
      • 2.3.3 键盘处理流程
      • 2.3.4 计时函数流程
  • 3 源代码
    • 3.1 无中断系统源码
    • 3.2 不产生循环中断系统源码
    • 3.2 循环中断系统源码
  • 4 调试过程说明
    • 4.1 CPU与接口芯片调试
    • 4.2数码管显示模块
      • 4.2.1 LED 显示器显示原理
      • 4.2.2 LED 显示电路
    • 4.2 矩阵键盘模块
    • 4.3 功能响应模块
    • 4.4 整体调试
  • 5设计结果说明
  • 6总结
  • 参考文献

1 设计题目及要求

1.1 设计题目

本课程设计题目的主要内容是模拟一台洗衣机的运行控制。在此次课程设计中,设置五个按键,分别用于选择开机、注水、洗涤、甩干、关机功能。在选择开机按键时,洗衣机处于等待状态,开启相应的等待状态的灯组合,只有在开机键按下以后,其他按键按下才有状态显示。当用户按下注水按键时,开启倒计时以及相应的状态灯组合,当倒计时结束时,响铃提示,状态灯回到等待状态,这时候,可以按其他键进行执行操作,洗涤、甩干与注水按键的状态类似,只是倒计时时间和状态灯组合不同而已。考虑到洗衣机的执行操作,不能按键就有对应操作,用户在按下注水按键后执行注水功能,在执行过程中按下甩干功能,若直接跳到甩干功能,在现实中是不允许的,这样洗衣机系统就会出现奔溃,这里我们设置在未执行完一个功能之前对于按键操作不做相应,只有在一个功能执行完成后,才进行读按键,接受执行完功能后最近的一个按键请求。

1.2设计要求

(1)能正确选择洗衣机的注水、清洗、甩干等不同模式;
(2)能正确显示各种模式下的不同状态;
(3)能使洗衣机快速响应最新的用户命令,形象模拟各种模式。

2 方案分析与设计

2.1 需求分析

2.1.1 角色分析

本次课程设计为洗衣机控制系统的模拟,结合实际情况可知,系统面对的主要角色为人类用户,系统接收用户的指令并给予相应的处理。在系统内部,结合相关功能可知,还应包括计时器、显示器和指令处理器这些角色以执行相应功能。

2.1.2 用例分析

结合本次课程社及应完成的任务可知,系统所需的用例至少应包括开机、关机、注水和甩干,此外,还应包括对指令的处理、结果的显示和计时相关用例。各用例文档如下所示。

2.1.2.1 开机用例

在电源接通、仿真开始或系统等待执行的时候执行开机用例,是系统可以处理用户给出的各种指令。

用例名:开机用例。
摘要:启动洗衣机。
角色:用户。
前置条件:无。
主序列:
(1)用户按下开机键;
(2)灯全亮(111);
非功能性需求:
无。
后置条件:等待其他指令。

2.1.2.2 关机用例

在用户给出关机指令后,执行关机用例不再接收除开机外的任何指令输入。

用例名:关机用例。
摘要:关闭洗衣机。
角色:用户。
前置条件:当前不执行其他功能。
主序列:
(1)用户按下关机键;
(2)灯灭 (111);
(3)蜂鸣器响。
非功能性需求:
无。
后置条件:停止等待。

2.1.2.3 注水用例

在用户给出关机关机指令后在给出注水指令,若无其他功能执行执行注水用例。

用例名:注水用例。
摘要:开始注水功能。
角色:用户。
前置条件:已执行开机用例,无其他功能执行。
主序列:
(1)用户按下开机键;
(2)灯点亮(001);
(3)调用计时用例。
(4)等待计时停止
非功能性需求:
无。
后置条件:等待其他指令。

2.1.2.4 洗涤用例

在用户给出关机关机指令后在给出洗涤指令,若无其他功能执行执行洗涤用例。

用例名:洗涤用例。
摘要:开始洗涤功能。
角色:用户。
前置条件:已执行开机用例,无其他功能执行。
主序列:
(1)按下洗涤键;
(2)灯显示 (010);
(3)调用计时用例。
(4)等待计时停止
非功能性需求:无。
后置条件:等待其他指令。

2.1.2.5 甩干用例

在用户给出关机关机指令后在给出洗涤指令,若无其他功能执行执行甩干用例。

用例名:甩干用例。
摘要:甩干衣物。
角色:用户。
前置条件:已调用开机用例,无其他功能执行。
主序列:
(1)用户按下甩干键;
(2)灯显示 (010);
(3)调用计时用例。
(4)等待计时停止
非功能性需求:
无。
后置条件:等待其他指令。

2.1.2.6 显示用例

在需要显示时利用七段数码管显示相关信息。

用例名:显示用例。
摘要:利用七段数码管显示计时时间。
角色:显示器。
前置条件:计时用例调用中。
主序列:
(1)关闭所有选通数码管;
(2)选中所需数码管;
(3)开启段选位;
(4)延时;
(5)关闭当前段选,开启下一位片选和段选。
非功能性需求:
无。
后置条件:等待其他指令。

2.1.2.7 计时用例

在需要利用计时器时计时并产生中断。

用例名:计时用例。
摘要:计时一段时间。
角色:计时器。
前置条件:执行洗涤、甩干或注水用例。
主序列:
(1)计数初值若为0,不再计时;
(2)若计时时间到,产生中断;
(3)计数初值减一;
(4)若计数为0,蜂鸣器响。
非功能性需求:
无。
后置条件:等待其他功能。

2.1.2.8 指令处理用例

在利用键盘接收用户指令并处理。

用例名:指令处理用例。
摘要:接收用户指令并加以处理。
角色:指令处理器。
前置条件:电源接通并开始仿真。
主序列:
(1)等待用户按键;
(2)判断用户按下哪个按键;
(3)执行对应按键的功能;
(4)回(1)。
非功能性需求:
能快速响应用户的指令。
后置条件:无。

2.1.3用例关系

综上所述,可得到系统用例图如图2-1所示。用户有五种选择:开机、注水、洗涤、甩干、关机。当用户选择开机按键时,对应的开机指示灯亮111,洗衣机启动,等待用户下一个操作的开启。当用户未进行开机按键时,系统不允许用户进行其他操作,即不可跳过开机键直接对注水、洗涤、甩干这三个功能进行操作。用户选择注水、洗涤、甩干操作基本一样。现以注水为例:首先用户按下注水按钮,对应的指示灯001亮,同时开启定时器和显示器,显示器为注水所需要的时间(分:秒)。当定时器过一秒,刷新一次显示器;当定时结束时,响蜂鸣器,显示器成关闭状态。洗衣机呈等待状态,指示灯为111,等待下一个操作值得注意的是:在执行注水、洗涤或者甩干过程中不允许其他操作的执行,只有在一个操作完成时才允许其他操作进行。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第1张图片
图2-1 系统用例图

各用例主要执行时序如图2-2所示。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第2张图片
图2-2 系统时序图

2.2 方案设计与优化
根据课程设计要求,可以设计如图 2-3 所示的系统,此时将所有外设通过8255与CPU连接,通过8255不同的工作方式实现对各个外设的控制,并在程序中通过循环计数实现对计时时间的控制。8255A口工作方式0控制数码管,B口工作方式0控制灯和蜂鸣器,通过不断改变C口工作方式实现分时的全双工通信, 从而利用线反转法处理键盘。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第3张图片
图2-3 系统结构图(优化前)

在课程设计的过程中,第一个版本的系统很容易实现,但是计时功能相对并不准确。为得到更精确的计时值并重分类用现有自用,可首先利用8086微处理器产生所有的总线控制信号。使用到的芯片有8253、8259、8255。其中8259做中断处理;8255芯片为可编程并行I/O接口芯片,用此来连接外设,使外设能跟CPU进行通信;8053芯片用于定时,此课程设计中用于定时一秒。
将所需外设可分为三类,显示系统、按键系统和响应完成状态系统,按键系统用2×3键盘组成,用于接收用户需要进行的操作类型;显示系统包括LED灯和七段数码管显示,七段数码管显示倒计时信息,LED灯用于显示洗衣机目前所处状态(关机、开机、注水、洗涤、甩干状态);响应完成系统用于在一个功能完成后做出提示,提示用户可进行下一个操作,如:洗衣机在完成注水操作后蜂鸣器响,用户听到后便可选择其他功能。
在这里插入图片描述

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第4张图片
图2-4 系统结构图(优化后)

2.3 软件流程

2.3.1 主程序流程

主程序流程如图2-5所示,洗衣机一直处于等待按键按下状态,当有键按下并且为开机按键时才可以再接受其他按键按下,当开机键按下后,对应的指示灯111亮,接着继续等待判断有无按键按下,如有,判断键值,若为注水、洗涤、或者甩干,进入中断,若为关机按键,则结束程序,这里对开机键盘已经不再做反应,当不是这些按键则重新判断有无按键按下。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第5张图片
图2-5 主程序流程图

2.3.2 中断流程

当进入中断时,如图2-6所示,首先定时器0写入初值,定时一秒,判断按键键值,若为注水按键,对应注水指示灯001亮,计数器1装入初值—,若为洗涤按键,对应洗涤指示灯010亮,计数器1装入初值—,若为甩干按键,对应甩干指示灯011亮,计数器1装入初值—,接着开启定时器0定时,判断计数器0定时一秒结束,即计时一秒结束,若结束,开启计数器1减一,并显示七段数码管,计数器1减一后,判断计数器1是否结束,若结束则蜂鸣器响,指示灯111亮,并且返回中断,若计数器1未结束计数,则继续执行定时器0开始定时。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第6张图片
图2-6 中断程序流程图

2.3.3 键盘处理流程

关于按键的扫描,若采用动态扫描技术。按键扫描如图2-7所示,其具体实现思路如下:
(1)检测有无按键按下。从PC—输出0,使—每列都为0,读入行线PC–的值,若PC—为全1,则没有按键按下。如果为非全1,则表示有按键按下。
(2)如果没有按键按下,则返回(1)步,等待按键。
(3)如果有键按下,则寻找是哪一个键。为此,采用列扫描方法找出被按下的键在矩阵中的位置,称为行列值或键值。先从0列开始,即向0列输出为0,其他列输出1,然后从输入端口读入扫描结果,检测PC–的电平:若PC0=0,表示S1键按下;同理若PC1为0,则分别表示S4键按下。若PC0、PC1的电平都为1,则说明这一列没有键按下,就对第二列进行扫描,于是向1列输出为0,其他列输出为1,再检测PC0、PC1的电平。依次逐列检测,直到找出被按下的键为止。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第7张图片
图2-7 线反转法流程图

线反转法键盘读取键值流程图见图 2-8,键值处理函数如图2-9,硬件电路中将键盘接双向 I/O 口 P1 口,可以采用线反转法对键盘按键进行读取。首先通过调用 longDelay()函数进行一段时间的延时,消除前端抖动。随后将列线作为输入线,行线作为输出线, 并将输出线输出为低电平,读列线状态,则列线电平为低的是按键所在的列。此后,将行线作为输入线,列线作为输出线,并将输出线输出为低电平,读行线状态,则行线中电平为低的是按键所在的行。由此可确定按键所在的行和列, 从而识别出所按下的键。如果有按键按下将对应的编码返回,如果没有按键按下返回 0。各按键的具体编码见下文表4-2。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第8张图片
图2-8 键值处理流程图

2.3.4 计时函数流程

计时函数流程如图2-9所示,首先对8253定时器0初始化并装入初值,随即开始计时等待计时结束,若计时结束产生中断,在中断处理程序中执行其他功能。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第9张图片
图2-9 计时函数流程图

3 源代码

3.1 无中断系统源码

在最初不含中断的系统中,利用循环计数进行演示控制,朱成勋运行在扫描按键的死循环中,最开始通过伪指令定义各个芯片的地址,然后执行整个程序。

PA8253 EQU 9000H
CTL8253 EQU 9006H
MODE53 EQU 01110100B
CTL55 EQU 8006H
PA55 EQU 8000H
PB55 EQU 8002H
PC55 EQU 8004H
CTL8253 EQU      9006H
CODE SEGMENT PUBLIC 'CODE'
        ASSUME CS:CODE,DS:DATA
        
START:
            MOV AX, DATA
            MOV DS, AX
            CALL KEY
            ;MAIN FUNCTION FLOW
            
;GET KEY EVENT AND COPE THEM
KEY PROC
;WAIT UNTIL ANY BUTTON PRESSED
SCAN:
        MOV DX,CTL55
        MOV AL,10001000B
        OUT DX,AL

        MOV DX,PC55
        MOV AL,00H
        OUT DX,AL
        IN AL,DX
        NOT AL
        AND AL,0F0H
        ;WHETHER ANY BUTTON PRESSED
        JZ SCAN
        JNZ CONVERT
;GET THE NUM OF THE BUTTON PRESSED
CONVERT:
              ;INIT 8255
	MOV AH,AL
	MOV DX,CTL55
	MOV AL,10000001B
	OUT DX,AL
	
	;INT PC
	MOV DX,PC55
	MOV AL,00H
	OUT DX,AL

	;GET PC
	IN AL,DX
	NOT AL
	AND AL,0FH
	CALL GET_KEY
	CALL COPE_FUNCTION

	;STARTED?
	CMP FLAG,1
	JNZ SCAN
	CMP AL,1
	JZ SCAN

	;DISPLAY
	MOV DX,PB55
	OUT DX,AL
	CALL TIME_SHOW
	JMP SCAN
KEY ENDP

;GET THE NUM OF KEY
GET_KEY PROC
       JMP L0
L0:
      AND AH,40H
      JNZ L1
      JZ L2
L1:
      MOV AH,1
      JMP L8
L2:
      MOV AH,4
      JMP L8
L8:
      MOV BL,AL
      AND AL,01H
      JNZ L3
      JZ L4
L3:
      MOV AL,0
      JMP L7
L4: 
      MOV AL,BL
      AND AL,02H
      JNZ L5
      JZ L6
L5:
      MOV AL,1
      JMP L7
L6:
      MOV AL,2
      JMP L7
L7:
      ADD AL,AH
      RET
GET_KEY ENDP

COPE_FUNCTION PROC
      CMP AL,1
      JZ C1
      CMP AL,2
      JZ C2
      CMP AL,3
      JZ C3
      CMP AL,4
      JZ C4
      CMP AL,5
      JZ C5
      CMP AL,6
      JZ C5
C1:
      CALL OPEN 
      RET
C2:
      CALL POUR
      RET
C3:
      CALL WASH
      RET
C4:
      CALL DRY
      RET
C5:
      CALL CLOSE
      RET
COPE_FUNCTION ENDP

;PROCESSES BELOW IS USE FOR COPE THE EVENTS
OPEN PROC
      MOV FLAG,1
      RET
OPEN ENDP
POUR PROC
      MOV TIME,5
      RET
POUR ENDP 
WASH PROC
      MOV TIME,10
      RET
WASH ENDP
DRY PROC
      MOV TIME,15
      RET
DRY ENDP
CLOSE PROC
      MOV FLAG,0
      MOV DX,PA55
      MOV AL,0FFH
      OUT DX,AL
             
      MOV DX,PB55
      MOV AL,0FH
      OUT DX,AL

      MOV BX,1500
LP1:
      SUB BX,1
      JNZ LP1
      RET
CLOSE ENDP
TIME_SHOW PROC
T:
      MOV DX,PA55
      MOV AL,TIME
      MOV BX,OFFSET LEDTAB
      XLAT
      OUT DX,AL
      MOV BX,280
M:
      SUB BX,1
      CMP BX,0
      JNZ M
      SUB TIME,1
      CMP TIME,0
      JNZ T
        
      MOV DX,PB55
      IN AL,DX
      AND AL,0FH
      OR AL,80H
      OUT DX,AL
      MOV BX,300
LP1:
      SUB BX,1
      JNZ LP1
      AND AL,0FH
      OUT DX,AL
      RET
TIME_SHOW ENDP

ENDLESS:
              JMP ENDLESS
CODE ENDS

DATA SEGMENT
        LEDTAB DB 
40H,79H,24H,30H,19H,12H,02H,78H,
00H,10H,08H,03H,46H,21H,06H,01H
        FLAG DB 0
        TIME DB 0
DATA ENDS
        END START

3.2 不产生循环中断系统源码

在不产生循环中断的系统中,除中断初始化和中断服务以外,其余和无中断版本一致,中断初始化代码段如下:

       MOV AX, DATA
       MOV DS, AX


       MOV   DX, CTL8253
       MOV   AL, MODE53
       OUT   DX, AL
       
       MOV AX, STACK
       MOV SS, AX
       MOV AX, TOP
       MOV SP, AX
       CLI
       PUSH  DS
       
       MOV   AX ,0
       MOV   DS ,AX
       MOV   BX, 128 	
       
       MOV   AX, CODE
       MOV   CL, 4
       SHL   AX, CL               	
       ADD   AX, OFFSET INTINC1   
       MOV   [BX], AX

       MOV   AX, 0
       INC   BX
       INC   BX
       MOV   [BX], AX            	
       
       MOV   AX ,0
       MOV   DS ,AX
       MOV   BX, 156 			
       
       MOV   AX, CODE
       MOV   CL, 4
       SHL   AX, CL               	
       ADD   AX, OFFSET INTINC2   
       MOV   [BX], AX

       MOV   AX, 0
       INC   BX
       INC   BX
       MOV   [BX], AX            
       
       POP DS
       CALL IINIT
       STI
IINIT:
       MOV   DX, CS8259A
       MOV   AL, ICW1
       OUT   DX, AL

       MOV   DX, CS8259B
       MOV   AL, ICW2
       OUT   DX, AL

       MOV   AL, ICW4
       OUT   DX, AL

       MOV   AL, OCW1
       OUT   DX, AL
       RET  
中断服务代码段如下:
INTINC1:
      CLI
      PUSH AX
      PUSH DX
      MOV DX,PA55
      MOV AL,TIME
      MOV BX,OFFSET LEDTAB
      XLAT
      OUT   DX, AL          
      SUB TIME,1
       CMP TIME,0
      JNZ  CM1
      JZ CM2
   CM1:
      CALL TIME_COUNTER
      
       MOV   DX, CS8259A
       MOV   AL, 20H         
       OUT   DX, AL
       POP DX
       POP AX
       STI
       IRET
   CM2:
      JMP SCAN
      MOV   DX, CS8259A
       MOV   AL, 20H         
       OUT   DX, AL
       POP DX
       POP AX
       STI
       IRET

3.2 循环中断系统源码

在产生循环中断的系统中,中断初始化部分与循环中断一致,但主循环和中断服务不同,此版本程序在扫描键盘的部分进行循环,但执行功能时将标志位置0,从而屏蔽其他按键的输入。
主循环中线反转法执行功能末尾改为:

CONVERT:
       ;INIT 8255
      MOV AH,AL
      MOV DX,CTL55
      MOV AL,10000001B
      OUT DX,AL
      
      ;INT PC
      MOV DX,PC55
      MOV AL,00H
      OUT DX,AL

      ;GET PC
      IN AL,DX
      NOT AL
      AND AL,0FH
      CALL GET_KEY
      CALL COPE_FUNCTION

      ;STARTED?
      CMP FLAG,1
      JNZ SCAN
      CMP AL,1
      JZ SCAN
     MOV TIME 0
     JMP SCAN

中断服务子程序改为:

INTINC1:
       CLI
       PUSH AX
       PUSH DX
       MOV   DX, PA8255
       MOV   AL, TIME
       MOV BX,OFFSET LEDTAB
       XLAT
       OUT   DX, AL          
       SUB TIME,1
       CMP TIME,0
       JNZ LO
       JZ  LTIME
LTIME:
       MOV FLAG,1
       JMP LO
LO:

       MOV   DX, CS8259A
       MOV   AL, 20H         
       OUT   DX, AL
       POP DX
       POP AX
       STI
       IRET

4 调试过程说明

本次课程设计,采用自顶向下、模块化的设计思路进行软件、硬件的调试。根据2.1.2中的用例,将整个系统分为计时模块、显示模块、键盘模块和中断模块进行调试。在具体的操作过程中,设计了中断计时版本和循环计时两个版本的系统。由接口两侧分析思想,在调试过程中,首先完成CPU与接口芯片的连接,然后依次调试各外设。

4.1 CPU与接口芯片调试

由2.2中的系统结构图可知,CPU需要通过8259、8254、8255完成与外设的连接与控制,根据接口两侧分析的思想,CPU与这些芯片的连接电路可固定下来,在具体调试时仅更改控制芯片与外设间的连接电路即可。此时的系统连线图如图4-1所示,利用地址线A0到A9为芯片分配地址,并利用74LS138做地址译码、74LS373做地址锁存器。在无中断及定时控制的版本中,只需使用8255做并行输出即可。CPU可扩展地址为8000H到FFFFH,8255包含三个输出端口以及一个控制端口,可依次将A、B、C口和控制端口地址分配为8000H、8002H、8004H、8006H。Ptoteus仿真连线图如图4-1所示。
为测试系统与各个接口芯片是否连接正常,可先对各个芯片做初始化并连接简单外设进行测试。首先通过8255PA、PB、PC口控制LED灯的点亮与熄灭。工作正常后即可进行其他部分的调试。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第10张图片
图4-1 CPU与接口芯片连线图(无中断与定时)

在含中断及定时控制的版本中,需要通过8253产生一秒中断,并利用8259处理其中断。此时,将地址A000H分配给8253,将地址C000H分配给8259。此时Proteus连线图如图4-2所示。此时同样需要先对8255进行测试,然后初始化8259,将IR0接在单脉冲下降沿上,在中断服务子程序中,只控制LED灯的闪烁。在8259工作正常后,将8259的IR0接在8253的OUT0初始化8253,设置工作方式3,循环产生1秒的中断,观察LED灯的状态。工作正常后,更改外设好中断服务子程序,从而进行其他模块的调试。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第11张图片
图4-2 CPU与接口芯片连线图(含中断与定时)

4.2数码管显示模块

4.2.1 LED 显示器显示原理

LED 显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中常用的是七段 LED。这种显示器有共阴极和共阳极两种。本次设计选用共阳极 LED 显示器,当发光二极管的阳极为高电平时, 发光二极管点亮。其显示字符时的段选码如表4-1所示。由于定时时间较短,本次课程设计使用静态显示方式工作,LED 静态显示方式下,每一位显示数据的段选线与单片机的一个 8 位并行口连接。这样,显示器的每一位均可以独立显示,只要该位的段选线上能够保持相应的段选码不变,则该位就能持续显示相应的字符。由于每一位字符由一个 8 位输出口控制,故在同一时刻各位显示器可显示不同字符。

表 4-1 七段 LED 显示器的段选码
显示字符 段选码 显示字符 段选码
0 40H 8 00H
1 79H 9 10H
2 24H A 08H
3 30H B 03H
4 19H C 46H
5 12H D 21H
6 02H E 06H
7 78H F 01H

4.2.2 LED 显示电路

本次设计中的数码管显示电路如图 4-3 所示,将数码管的段选位接在8255A口,地址为8000H,由于不需要进行小数显示,所以DP位不连接。图中1到7 分别连接PA0到PA6,连接好电路后,在程序中填写码表并对数码管进行测试,档期工作正常后,再进行程序其他部分的调试。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第12张图片
图 4-3 数码管显示电路图

4.2 矩阵键盘模块

本次设计的矩阵键盘电路如图 4-4 所示,本次设计中,需要五个按键以完成对应的功能选择。如果采用直接接线的方式,需要占用5个 I/O 口,不仅造成了 I/O 口的浪费,也是对硬件电路的极大浪费。因而选择使用图 4-4 中简化的矩阵式按键接法,多余的按键可以留作其他用处,也可在需求改变时用来扩展更多的键盘按钮,从而提高了硬件设计的复用性。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第13张图片
图 4-4 键盘接口电路图

矩阵式键盘对应按钮的读取方式有线扫描法和线反转法,由于 PC 口高低四位可以进行输入输出控制,可以采用线反转法的方式,得到对应按钮的值。对于按钮按下前后的消抖、响应等处理,均由软件实现。各个按钮的编码值见表4-2。

表 4-2 键盘中各个按钮的键码
1 列 2 列 3 列
1 行 0x41 0x42 0x44
2 行 0x81 0x82 0x84

4.3 功能响应模块

根据上文中分析得到的功能,可以设计三个LED灯,用以显示具体哪个按键按下,在计时结束时,可以控制蜂鸣器发声以提示用户选择其他功能。实验箱上的蜂鸣器是有源蜂鸣器,只要输出高电平即可发声,输出低电平即停止发声,可使用PB口工作方式0输出控制这些输出功能,在程序中的对应位置控制输出即可。蜂鸣器控制电路如图4-5所示。

图 4-5 蜂鸣器控制电路

LED控制电路如图4-6所示

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第14张图片
图 4-6 LED灯控制电路

4.4 整体调试

在各个外设、各个接口芯片均单独工作正常后,将所有外设和芯片与CPU连接在一起进行整体流程调试。由于之前已经保证了每个模块正常工作,此时只需要关注系统中流程的跳转即可。系统整体仿真图如图4-7所示。如图连接硬件与软件后开始仿真,并通过单步调试观察系统工作状态。

【微机组成原理】【课程设计】洗衣机控制模拟系统设计(汇编语言)_第15张图片
图 4-7 系统整体仿真图

5设计结果说明

本次课程设计我们完成了任务书中的所有要求,通过键盘扫描获取用户的指令,将用户按下的按键通过LED灯显示出来。在执行开机功能前以及执行关机功能后,系统均不接收或者处理任何的指令,在执行开机功能后以及执行关机功能前,系统可快速响应用户的指令需求,并给出相应的输出。在执行具体的功能时,对即时起设置不同的计数初值并开始倒计时,将倒计时的过程和结果都利用七段数码管进行输出,计时结束后蜂鸣器短暂发声,从而提示用户选择其他的功能。。在开机前和和开机后的等待状态,数码管全亮,LED灯全亮,蜂鸣器补发声,在关机后数码管和LED灯短暂熄灭,然后切换到开机前的等待状态。
本次课程设计遵循参考文献[1]中的软件生存周期,从需求分析出发,详细分析各用例模型后根据现有的硬件和软件资源设计完成了整个系统,是对软硬件综合分析设计能力的一次很好锻炼。在方案讨论过程中,小组成员仔细讨论,反复推敲,并共同完成了整个系统的设计。
本次设计存在的不足有:键盘的响应存在延时,且中断服务不能很好地执行,没有严格考虑各个寄存器的使用情况,存在资源的浪费,后续还应对系统进行进一步的优化。

6总结

本课程设计题目的主要内容是模拟一台洗衣机的运行控制,设计过程中,设计遵循软件生存周期,小组成员从需求分析出发,详细分析各用例模型后根据现有的硬件和软件资源设计完成了整个系统,是对软硬件综合分析设计能力的一次很好锻炼,也是对小组成员团队协作能力的提升。在方案讨论过程中,小组成员仔细讨论,反复推敲,并共同完成了整个系统的设计。此外,本次课程设计使用汇编语言进行程序的编写,采用了不同于高级程序设计的程序设计思路。在高级语言程序设计中,不关注系统具体如何执行各条语句,不关注各个变量在硬件中的存储位置,通常在系统资源充足时也不关注程序调转时系统堆栈的转换和使用,程序计数器PC对程序员是透明的。但在汇编语言程序设计中,需要时刻关注各个寄存器的状态并在程序调转时关注PC指针的值并保护系统堆栈。由于面向硬件寄存器,不能设计太多的函数调转以防止堆栈溢出。汇编程序设计的代码在编写上相对高级语言程序更精炼但可读性较差,高级程序设计语言为了提高可读性、信息封装等要求,要求函数尽可能精简并只执行简单的功能,但由此存在不必要的程序调转和大量的堆栈占用,因而影响程序的运行时间。此外,模块化的设计思想和接口两侧的分析思路使得设计过程清晰严谨,便于调试和扩展。利用节课欧连唱歌的分析思路,每次只关注一侧的程序调试,从而保证了程序可能出现的错误位置清晰可见。模块化的设计思想将整个系统设计的粒度变小,从而每次只关注某个部分的正确执行,在所有模块都正确的情况下, 只需关乎程序流程的问题就可以完成整个系统的设计,从而进一步简化了设计过程。

参考文献

  • [1]Gomaa,H.Real-Time Software Design for Embeded Systems[M].郭文海,林金龙.北京:机械工业出版社,2019.1
  • [2]杨晶浩.现代软件工程应用技术[M].北京:北京理工大学出版社,2017,5.
  • [3]李必信,廖力,王璐璐,孔祥龙,周颖.软件架构理论与实践[M].北京:机械工业出版社,2019,1.
  • [4]Gomaa,H.Real-Time Software Design for Embeded Systems[M].郭文海,林金龙.北京:机械工业出版社,2019.1
  • [5]陈红卫.微型计算机基本原理与接口技术(第2版),北京:科学出版社,主编,2013.
  • [6]邹逢兴.微机原理与接口技术经典实验案例集 ,北京:高等教育出社,2012
  • [7]Gamma,E.Helm,R.Johnson,R.Vlissides,J.Design Patterns:Elements of Reuseable Objet-Oriented Software[M]. 李英军,马晓星,蔡敏,刘建忠,吕健.北京:机械工业出版社,2019.3

你可能感兴趣的:(课程设计,汇编语言,嵌入式)