模拟电梯——接口设计
西北农林科技大学信息工程学院 微机原理与接口课程设计实习报告
题 目: 模拟电梯设计
学 号 姓 名 专业班级 指导教师 分 数
1
目 录
一、设计任务及要求 ................................................ 错误!未定义书签。 二、实现方法............................................................. 错误!未定义书签。
1、硬件电路图....................................................................... 错误!未定义书签。 2、程序流程图及程序代码................................................... 错误!未定义书签。
三、调试与运行 ........................................................ 错误!未定义书签。 四、设计总结............................................................. 错误!未定义书签。 五、附录 ..................................................................... 错误!未定义书签。
2
一、设计任务及要求
任务:在微机及接口实验箱上实现电梯模拟运行设计。数字键设定到达楼层号,电机模拟电梯运行,七段数码管显示楼层号,开关上下控制电梯升降,开关上下模拟电梯门开、关。
要求:在微机及接口实验箱上完成电梯模拟控制;完成接口电路的设计;完成对应控制程序编写。
二、实现方法
1、硬件电路图
3
2、程序流程图及程序代码
4
程序代码见附录
三、调试与运行
运行程序,用键盘输入想要去的楼层(1-15,对应键盘1到F的按键),用开关控制电梯向上或下运行。按启动键此时电机转动(上楼时顺时针转,下楼时逆时针转),如在电梯运行时出现问题或突然要提前下电梯可拨动开关控制电梯暂停。正常到达要去的楼层后,LED灯闪烁,蜂鸣器响三声提醒人们下电梯。
四、设计总结
本次实验,我用步进电机实现了15层电梯的运转,用开关控制电梯的上下,用开关将电梯制动。并扩展了LED灯及蜂鸣器提醒功能,在到达相应楼层后LED灯闪烁、蜂鸣器鸣叫三声提示人们下电梯。
设计过程中出现了很多问题,比如如何控制显示屏的显示、如何控制好电机运转,如何实现开关控制,如何让它更接近真实的情况等。
显示屏的显示部分,我查了Display8的代码然后将待显示的内容放置于buffer数组中,调用Display8子程序来显示。
步进电机的显示部分,借鉴了实习中的步进电机的控制方法,将要运转的楼层数的差值存储,然后乘以100作为电机运转的步数。以使电机每转动100步,上或下一层楼。这期间还遇到了步数调整的实现问题,在这里判断开关的状态,得到电梯上或下的命令,还要判断控制开关是否是暂停状态,另外要判断要去的楼层是否已经到达,如到达关中断电机停止运行然后给8255的B口赋值,让LED灯闪烁并伴随蜂鸣器鸣叫。这里的8255A口连接开关用来输入开关状态、B口用来控制LED灯和蜂鸣器、C口用来控制步进电机的运转。
5
本次实验,步进电机部分较难控制,我是在看懂实验代码后对其进行调整的,调整的过程中又引发了不少问题,这也让我更进一步的思考和规范自己的代码。在不断的完善电梯功能的同时,我也不断地发现错误,因此一次次地整理思路画流程图来帮助判断。尽管如此,仍然有好几次着急的想放弃但在与同学和老师们的交流中让我有了新的思路,又开始一点点的改进代码,完善功能了。在实验的同时不断纠正自己的问题,提升对硬件电路的理解,我想这才是实习课要教给我们的东西吧。很庆幸自己按时的完成了,只是在功能的扩展方面还应该再做些提升,有些小小的遗憾。不过还是要感谢老师和同学们,谢谢你们!
五、附录
.MODEL TINY
EXTRN Display8:NEAR, SCAN_KEY:NEAR IO8259_0 IO8259_1 Con_8253
EQU EQU EQU
0F000H
0F001H 0E003H
T0_8253 EQU IO8255_Con IO8255_PC IO8255_PB IO8255_PA
EQU EQU EQU EQU
0E000H
0D003H ;CS3
0D002H 0D001H 0D000H 0
.STACK 100 .DATA
DB
StepControl
;下一次送给步进电机的值 buffer
DB
8 DUP(0)
;显示缓冲区,8个字节 buffer1 DB
8 DUP(0)
buffer2 DB 8 DUP(0) SpeedNo DB Count DB 0 StepDelay StartStepDelay
DB DB
0 0 0
;StartStepDelay
;延时常数
5
;选择哪一级速度
StartStepDelay1 DB bFirst
DB
0 DB
;有没有转动过步进电机 0
bClockwise
; =1 顺时针方向 =0 逆时针方向转动 bNeedDisplay
DB
0
;已转动一步,需要显示新步数
6
StepCount DW 0
;需要转动的步数 StepDelayTab: DB 250,125,83,62,50,42,36,32,28,25,22,21 .CODE
START: MOV AX,@DATA
MOV DS,AX MOV ES,AX NOP
MOV
bFirst,1
;有没有转动过步进电机
MOV
bClockwise,1
;顺时针方向
MOV
StepControl,33H
;下一次送给步进电机的值 CALL Init8255 CALL Init8253 CALL Init8259 CALL WriIntver
MOV buffer,1 ;显示缓冲器初始化 MOV buffer2,1 MOV buffer+1,0 MOV buffer+2,1 MOV buffer+3,0 MOV buffer+4,10H
MOV buffer+5,10H MOV buffer+6,10H
MOV
buffer+7,0
STAR2: LEA SI,buffer LEA DI,buffer1
MOV
CX,8
MOV AL, BYTE PTR[buffer2] MOV BYTE PTR[buffer+2],AL MOV AL, BYTE PTR[buffer2+1] MOV BYTE PTR[buffer+3],AL REP MOVSB LEA SI,buffer1
CALL
Display8 STAR3: CALL Scan_Key JB STAR5 CMP bNeedDisplay,0 JZ STAR3 MOV bNeedDisplay,0 CALL Step_ADJ
JMP
STAR2 STAR5: CLI
7
;终止步进电机转动 CMP AL,0 JNZ SHI
JMP Exec SHI: CMP AL,10
JNB
STAR1
MOV buffer+1,0 MOV buffer,AL
JMP
JUD STAR1: CMP AL,16
JNB STAR3 MOV buffer+1,1
SUB AL,10
MOV buffer,AL
JUD:
MOV DX,IO8255_PA
IN AL,DX AND AL,02H CMP AL,0 JZ U1 ;上或下
D1: MOV byte ptr[buffer+7],0 MOV bClockwise,0 JMP STAR2 U1: MOV byte ptr[buffer+7],1 MOV bClockwise,1
JMP
STAR2
Direction: CMP
bClockwise,0
JZ Clockwise
MOV
bClockwise,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 bClockwise,1 MOV
buffer+7,0
CMP bFirst,0 JZ Clockwise1
MOV
StepControl,33H 8
JMP Direction1
Clockwise1: MOV AL,StepControl
ROL
AL,2
MOV
StepControl,AL
Direction1: JMP
STAR2
Speed_up: MOV AL,SpeedNo
CMP AL,11
JZ
Speed_up2
Speed_up1: INC
AL
MOV SpeedNo,AL
MOV
buffer+5,AL
Speed_up2: JMP
STAR2
Speed_Down: MOV AL,SpeedNo CMP AL,0
JZ Speed_Down1
DEC AL
MOV
SpeedNo,AL
MOV
buffer+5,AL
Speed_Down1: JMP
STAR2
Exec: MOV bFirst,0 CALL TakeStepCount
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
STI
;当前楼数 S1: MOV AL, BYTE PTR[buffer+2] MOV BYTE PTR[buffer2],AL
MOV AL, BYTE PTR[buffer+3]
;当前楼数 MOV BYTE PTR[buffer2+1],AL MOV AL,90H AND
AL,01H
CMP AL,0
JNZ S1
9
JMP STAR2
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,IO8255_PC
OUT DX,AL
CMP bClockwise,0 JNZ TIMER0_3
ROR AL,1
JMP
TIMER0_4 TIMER0_3: ROL AL,1
TIMER0_4: MOV
StepControl,AL
CMP StepCount,0 JZ TIMER0_1 MOV bNeedDisplay,1 DEC StepCount JNZ TIMER0_1
add
sp,8
;小写部分不允许使用单步、单步进入命令 popf cli pushf sub sp,8
nop
TIMER0_1: MOV
DX,IO8259_0
MOV AL,20H OUT DX,AL POP DX POP AX
IRET
Step_ADJ PROC
NEAR
MOV DX,IO8255_PA
IN AL,DX AND AL,01H CMP AL,1 JNZ CC
10
CLI CC: INC Count
MOV AL ,BYTE PTR[buffer+1] CMP BYTE PTR[buffer+3],AL JNZ CHU
MOV AL ,BYTE PTR[buffer] CMP BYTE PTR[buffer+2],AL JNZ CHU CLI
CALL RRING JMP STAR2 CHU: MOV BL,100 MOV AL,Count MOV AH,0 DIV BL CMP AH,0
JNZ Step_ADJ_1 MOV AL,BYTE PTR[buffer+7] CMP AL,1 JNZ DOWN
ADD BYTE PTR[buffer2],AL CMP BYTE PTR[buffer2],10 JB Step_ADJ_1
MOV BYTE PTR[buffer2+1],1 MOV AL,BYTE PTR[buffer2] SUB AL,10
MOV BYTE PTR[buffer2],AL JMP Step_ADJ_1 DOWN: CMP BYTE PTR[buffer2],0 JNZ SUBB
MOV BYTE PTR[buffer2+1],0 MOV BYTE PTR[buffer2],9 JMP Step_ADJ_1
SUBB: DEC BYTE PTR[buffer2] JMP Step_ADJ_1 Step_ADJ_1: RET Step_ADJ ENDP TakeStepCount
PROC
NEAR
MOV AL,BYTE PTR[buffer+1] MOV AH,0 MOV BL,10 MUL BL
ADD AL,BYTE PTR[buffer] MOV StepCount,AX MOV AL,BYTE PTR[buffer2+1]
11
MOV AH,0 MOV BL,10 MUL BL
ADD AL,BYTE PTR[buffer2] SUB StepCount,AX MOV AX,StepCount CMP AX,0 JNZ BB JMP STAR2 BB: CMP AX,0 JA ZHENG NEG AX ZHENG: MOV BL,100 MUL BL
MOV StepCount,AX
RET
TakeStepCount ENDP Init8255 PROC
NEAR
MOV DX,IO8255_Con MOV AL,90H OUT DX,AL ;8255 PC输出 DEC DX
MOV AL,0FFH OUT DX,AL ;0FFH->8255 PC DEC DX
MOV AL,0FFH OUT DX,AL ;0FFH->8255 PB
RET
Init8255 ENDP Init8253 PROC
NEAR
MOV DX,Con_8253
MOV AL,35H
OUT
DX,AL
;计数器T0设置在模式2状态,BCD码计数 MOV DX,T0_8253
MOV AL,10H OUT DX,AL
MOV AL,02H OUT DX,AL ;CLK0/210
RET
Init8253 ENDP Init8259 PROC NEAR
MOV DX,IO8259_0
MOV
AL,13H
12
OUT DX,AL
MOV DX,IO8259_1
MOV AL,08H OUT DX,AL
MOV AL,09H OUT DX,AL
MOV AL,0FEH 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 POP ES
RET
WriIntver ENDP DY PROC NEAR PUSH CX MOV CX,50000 LOOP $ POP CX RET DY ENDP
RRING PROC NEAR PUSH CX PUSH DX PUSH AX MOV CX,3
RING: MOV DX,IO8255_PB MOV AL,07FH OUT DX,AL CALL DY MOV AL,0FFH OUT DX,AL CALL DY LOOP RING POP AX POP DX POP CX
13
RET RRING ENDP
END
START
14
因篇幅问题不能全部显示,请点此查看更多更全内容