您的当前位置:首页正文

模拟电梯——接口设计

来源:华佗健康网


西北农林科技大学信息工程学院 微机原理与接口课程设计实习报告

题 目: 模拟电梯设计

学 号 姓 名 专业班级 指导教师 分 数

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

因篇幅问题不能全部显示,请点此查看更多更全内容