实现功能:
若洗衣机定时到,停机并发出音响信号,用两个数码管显示洗涤预置时间(分钟),按倒计时方式作计时显示,用3只LED灯表示“正转”、“反转”、“暂停”三个状态。能按键设置洗衣机定时时间,倒计时显示分和秒;能按键调整洗衣机的转速;洗衣机每转动一定的时间,会自动改变转动方向。
具体设计:
1 CPU与各芯片连接电路图:
CPU通过总线与8255A芯片(片选CS1)、8253芯片(片选CS2)、8259A芯片(片选CS3)、74HC273芯片(片选CS5)以及实验箱连接。8253为定时器,设置T0、T1两个计数器,将OUT0连接8259A的IR0端以及8253的CLK1端,触发中断给电机送出数据,控制电机旋转,T1实现1s定时,将OUT1连接8259A的IR1端,每过1s触发中断,改变计数变量,实现计时功能。8255控制数码管的显示以及键盘的扫描。74HC273控制LED灯的显示和蜂鸣器。
2.8255A控制数码管及键盘
8255A的工作方式为:PA口和PB口方式0输出,用于控制数码管;PC口低四位方式0输入,用于接收按键信息,PC口高四位方式0输出,用于控制电机。
3.步进电机模拟风扇转,步进电机的A、B、C、D分别与8255的PC4、PC5、PC6、PC7相连。
4.74HC273控制LED灯和蜂鸣器
74HC273的输出端与F4区的8个发光二极管以及蜂鸣器相连。
程序流程图:
完整汇编代码:
.MODEL TINY
EXTRN InitKeyDisplay:NEAR, GetKeyA:NEAR, DisPlay8:NEAR
IO8259_0 EQU 0250H
IO8259_1 EQU 0251H
Con_8253 EQU 0263H
T0_8253 EQU 0260H
T1_8253 EQU 0261H
Con_8255 EQU 0273H
PA_8255 EQU 0270H
PB_8255 EQU 0271H
PC_8255 EQU 0272H
ADDR_273 EQU 0230H
.STACK 100
.DATA
GREEN DB 11111110B ;绿灯亮,正转
YELLOW DB 11111101B ;黄灯亮,反转
RED DB 11111011B ;红灯亮,停止
XIANG DB 11110111B ;停止时蜂鸣器响
StepControl DB 0 ;下一次送给步进电机的值
buffer DB 8 DUP(0) ;8字节显示缓冲区
SpeedNo DB 0 ;选择哪一级速度
StepDelay DB 0 ;转动一步后,延时常数
StartStepDelay DB 0 ;若选择速度过快,延时由长到短,最终使用对应延时常数
StartStepDelay1 DB 0 ;StartStepDelay
bFirst DB 0 ;有没有转动过步进电机
bRatation DB 0 ;转动状态 0 反转 1 正转
ReDisplayFlag DB 0 ;0表示计数值不变,1表示计数值发生改变
bChange DB 0 ;改变转向的时间
AutoFlag DB 0 ;自动改变转向的标志
StepTime DB 0 ;倒计时分
Second DB 0 ;倒计时秒
StepDelayTab: DB 100,91,75,62,50,42,36,32,28,24 ;转速级别
DriverTab: DW Speed_up ;提高转速
DW Speed_Down ;降低转速
DW Direction ;转动方向
DW Exec ;步进电机根据方向、转速、步数开始转动
DW Reset ;重启
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL InitKeyDisplay ;初始化键盘、数码管控制器(8255)
MOV bFirst,1 ;有没有转动过步进电机
MOV bRatation,1
MOV StepControl,33H ;下一次送给步进电机的值
MOV SpeedNo,5 ;第五级速度
CALL Init8253
CALL Init8259
CALL WriIntver
MOV bChange,30
MOV StepTime,30 ;初始30分钟
MOV buffer,0 ;显示缓冲器初始化
MOV buffer+1,0 ;秒用两位
MOV buffer+2,0
MOV buffer+3,0 ;分用两位
MOV buffer+4,10H
MOV AL,SpeedNo
MOV buffer+5,AL ;显示速度级别
MOV buffer+6,10H
MOV buffer+7,0 ;显示转动方向
MOV DX,ADDR_273
MOV AL,RED
OUT DX,AL
BUFFUP: LEA SI,buffer
CALL Display8
CMP AutoFlag,1
MOV AutoFlag,0
JZ JIXU
ANJIAN:
CALL GetKeyA
JB SHUZI
CMP ReDisplayFlag,0
JZ ANJIAN
MOV ReDisplayFlag,0
CALL LedDisplay
JMP BUFFUP
JIXU: MOV bChange,30
CALL LedLight
JMP TIMER1_2
SHUZI: CLI
PUSH DX
PUSH AX
MOV DX,ADDR_273
MOV AL,RED
OUT DX,AL
POP AX
POP DX
CMP AL,10
JNB CAOZUO
MOV AH,buffer+2
MOV buffer+3,AH
MOV buffer+2,AL
MOV Second,0
MOV buffer+1,0
MOV buffer,0
JMP BUFFUP
CAOZUO: CMP AL,15
JNB BUFFUP
LEA SI,DriverTab
SUB AL,10
SHL AL,1
XOR AH,AH
MOV BX,AX
JMP CS:[SI+BX]
Direction:
CMP bRatation,0
JZ Clockwise
MOV bRatation,0
MOV buffer+7,1
AntiClockwise: CMP bFirst,0
JZ AntiClockwise1
MOV StepControl,91H
JMP Direction1
AntiClockwise1: MOV AL,StepControl
ROR AL,2
MOV StepControl,AL
JMP Direction1
Clockwise: MOV bRatation,1
MOV buffer+7,0
CMP bFirst,0
JZ Clockwise1
MOV StepControl,33H
JMP Direction1
Clockwise1: MOV AL,StepControl
ROL AL,2
MOV StepControl,AL
Direction1:JMP BUFFUP
;提高转速
Speed_up: MOV AL,SpeedNo
CMP AL,9
JZ Speed_up2
Speed_up1: INC AL
MOV SpeedNo,AL
MOV buffer+5,AL
Speed_up2: JMP BUFFUP
;降低转速
Speed_Down: MOV AL,SpeedNo
CMP AL,1
JZ Speed_Down1
DEC AL
MOV SpeedNo,AL
MOV buffer+5,AL
Speed_Down1: JMP BUFFUP
;运行电机
Exec: MOV bFirst,0
CALL TakeStepTime
LEA BX,StepDelayTab
MOV AL,SpeedNo
XLAT
MOV StepDelay,AL
CMP AL,50
JNB Exec1
MOV AL,50
Exec1: MOV StartStepDelay,AL
MOV StartStepDelay1,AL
CALL LedLight
STI
JMP BUFFUP
Reset: JMP START
STOP: CLI
PUSH DX
PUSH AX
PUSH CX
MOV CX,3
MOV DX,ADDR_273
THREE: MOV AL,XIANG
OUT DX,AL
CALL Delay1
MOV AL,0FFH
OUT DX,AL
CALL Delay0
LOOP THREE
MOV AL,RED
OUT DX,AL
POP CX
POP AX
POP DX
JMP BUFFUP
TIMER0: PUSH AX
PUSH DX
DEC StartStepDelay
JNZ TIMER0_1
MOV AL,StartStepDelay1
CMP AL,StepDelay
JZ TIMER0_2
DEC AL
MOV StartStepDelay1,AL
TIMER0_2: MOV StartStepDelay,AL
MOV AL,StepControl
MOV DX,PC_8255
OUT DX,AL
CMP bRatation,0
JNZ TIMER0_3
ROR AL,1
JMP TIMER0_4
TIMER0_3:
ROL AL,1
TIMER0_4:
MOV StepControl,AL
TIMER0_1: MOV DX,IO8259_0
MOV AL,20H
OUT DX,AL
POP DX
POP AX
IRET
zhuanxiang: MOV AutoFlag,1
JMP Direction
TIMER1: PUSH AX
PUSH DX
CMP Second,0
JNZ TIMER1_1
CMP StepTime,0
JZ STOP
MOV Second,60
DEC StepTime
TIMER1_1:DEC Second
DEC bChange
JZ zhuanxiang
TIMER1_2: MOV ReDisplayFlag,1
MOV DX,IO8259_0
MOV AL,24H
OUT DX,AL
POP AX
POP DX
IRET
LedLight PROC NEAR
PUSH DX
PUSH AX
MOV DX,ADDR_273
CMP bRatation,1
JZ LedLight1
MOV AL,GREEN
JMP LedLight2
LedLight1: MOV AL,YELLOW
LedLight2: OUT DX,AL
POP AX
POP DX
RET
LedLight ENDP
;根据输入的数字计算分钟
TakeStepTime PROC NEAR
MOV AL,buffer+3
XOR BX,BX
MOV BL,10
MUL BL
ADD AL,buffer+2
CMP AL,0
JZ TakeStepTime_1
MOV StepTime,AL
TakeStepTime_1: RET
TakeStepTime ENDP
LedDisplay PROC NEAR
PUSH AX
XOR AX,AX
MOV AL,StepTime
MOV BL,10
DIV BL
MOV buffer+2,AH
MOV buffer+3,AL
XOR AX,AX
MOV AL,Second
MOV BL,10
DIV BL
MOV buffer+0,AH
MOV buffer+1,AL
POP AX
RET
LedDisplay ENDP
;不同长短的延时
Delay0 PROC NEAR
PUSH CX
MOV CX,30000
Delay0_1: LOOP Delay0_1
POP CX
RET
Delay0 ENDP
Delay1 PROC NEAR
PUSH CX
MOV CX,2
Delay11: CALL Delay0
LOOP Delay11
POP CX
RET
Delay1 ENDP
;8253初始化
Init8253 PROC NEAR
MOV DX,Con_8253
MOV AL,35H ;00110101B T0控制字
OUT DX,AL ;计数器T0设置在模式2
MOV DX,T0_8253 ;TO端口地址
MOV AL,00H ;低8位
OUT DX,AL
MOV AL,02H ;高8位,初值200
OUT DX,AL
MOV DX,Con_8253
MOV AL,77H ;0111,0111B T1控制字
OUT DX,AL ;计数器T1设置在模式2
MOV DX,T1_8253
MOV AL,00H ;低8位
OUT DX,AL
MOV AL,50H ;高8位,初值5000
OUT DX,AL
RET
Init8253 ENDP
;8259初始化
Init8259 PROC NEAR
MOV DX,IO8259_0 ;
MOV AL,13H ;00010011
OUT DX,AL
MOV DX,IO8259_1
MOV AL,08H ;00001000
OUT DX,AL
MOV AL,09H ;00001001
OUT DX,AL
MOV AL,0FCH ;11111100
OUT DX,AL
RET
Init8259 ENDP
WriIntver PROC NEAR
PUSH ES
MOV AX,0
MOV ES,AX
MOV DI,20H
LEA AX,TIMER0
STOSW
MOV AX,CS
STOSW
LEA AX,TIMER1
STOSW
MOV AX,CS
STOSW
POP ES
RET
WriIntver ENDP
END START