您的当前位置:首页步进电机自动控制系统

步进电机自动控制系统

2021-01-01 来源:小侦探旅游网
 步进电机自动控制系统 设计内容

设计用PC机对四相步进电机,方向,步数及自动化控制系统,并编写汇编程序实现相应轻能。

设计要求

(1)设计控制系统硬件电机。

(2)由8255键盘控制电机的方向,走的步数,并由数码管显示相应的参数。 (3)在命令执行结束后,由PC内部扬声器发出信号提示。

设备与器材

PC机一台,TPC-1实验台一个,并行接口8255一片,步进电机一个,LED数码管4个,74ls164按键11个, GAL芯片一个,74LS245一片。

硬件方案

硬件共分成5个模块:①译码驱动电路,②8255控制键盘模块③8255LED显示模块,④步电机驱动模块,⑤步进电机模块 a) 译码驱动电路

方案一 使用适当的门电路来实现不同地址的,用74LS245做数据驱动,缺点: 由于只使用门电路,电路连线非常复杂

方案二 使用76LS138和适当门电路实现译码,相对于方案一电路复杂度有一定的改观,在TPC实验箱上使用这种译码方案

方案三 使用可编程逻辑器件GAL16V8实现译码功能,用GAL优点:成本低,电路连线少。本设计选择这个方案来实现译码功能。

a) 键盘模块

方案一 用8255 12个口直接接按键,此方法成本高,不使用行列法,浪费端口,如用行列法只用7个端口。

方案二 使用2个74LS273或74LS373控制键盘,其中一个控制行,273反向从键盘中读数据,另一个控制列选,273正向向键盘发数据。

方案三 使用7281芯片同时控制键盘和数码,7281通过串行口和总线通信,端口使用少,且操作方便。

方案四 PC0~4,PB0~4分别控制16个按键。由于本模块技术已经成熟,在应用中广泛使用,所以本设计选择此方案来实现。

c) LED数码管显示模块

方案一 74LS138一片,ULN2803A一片和74HC573一片,来实现显示,74LS138译 码送UNL2083A通过UNL2083A控制位,通过74HC573控制数据,本方案,成本较高,要单片机中有使用比较多。

方案二 使用一片8255A控制两个74HC573和一个正相驱动器74LS07和一个反相驱 动器74LS06分别控制4个LED位选和编码数据传输。此方案用到了8255A由于模块②中用到的8255A3个口都以使用,再用一个8255A成本比较高。

方案三 通过一个片信号,两个74HC373和一个正相驱动器74LS06和一个反相驱动 器74LS07分别控制3个LED位选和编码数据传输。此方案成本低,但是软件实现的点复杂。 方案四 使用4个74HC373和控制4个LED编码数据,用8255A PC高位和总线片选信号控制数据输入位选,由于是静态显示,一般用于1个或2个数码管的显示。

方案五 使用4个74LS164,通过串行移位来实现LED显示。成本不高,使用端口少,可以直接通过8255PC7和PB7口,一个做为移位控制,一个送数据。本设计使用此方案

d) 步进电机驱动模块

方案一 使用4N25光电耦合,隔离步进电机和控制电路的电源,保护电源。使用达林顿管做为驱动。

方案二 使用TIP521光电耦合,隔离步进电机和控制电路的电源,并使用三极管9013进行驱动。这里用此方案。

e) 步进电机模块 方案一

方案二 实现判断键按下的先后。本设计使用此方案

㈠硬件方案论证

1 译码驱动电路

译码驱动电路如图001所示,有一片GAL16V8芯片和一片74F245芯片组成。 其中GAL16V8用于译码,在其内部烧入软件,如图把A2~A9接入并译码成/y0、,/y0做为片选信号地,细详地址编码如下表 /y0(8255) 二进制地址 10 0000 00×× 十六进制地址 200~203 74F245芯片用于驱动,由于总线数据信号和各芯片数信号弱,驱动能力差,所以必须

在8根总线数据线和各芯片数据线之间加一个双向驱动器74F245。74F245芯片用于总线和外扩芯片间数据交换时74F245芯片有效,/G为低电平有效,/G连接GAL,/gg端口通过A5A6 A7A8A9,IOW,IOR,AEN来控制,当符合/GG=A9*/A8*/A7*/A6*/A5*/IOR*/AEN+A9*/A8*/ A7*/A6*/A5*/IOW*/AEN这一公式,那么19端口输出为低,74F245允许数据并加强信号。IOR、IOW也通过GAL16V8进行信号驱动加强。

译码驱动电路如下:

2、8255控制键盘模块

8255控制键盘,在技术上的已经非常成熟,在这里设计为行列描法对键盘进行控制。其 中PC0、PC1、PC2、PC3控制行选,PC4、PC5、PC6控制列选。当列选中一列发出0信号时,三行读数据,如有键按下,相应行的电压为0V,即读数为“0”。反之,无按下那么三位读都为

“1”。键盘编码从第一行到第三行为0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F

3、8255LED显示模块

如图所示,下图为发光二极管控制电路,用于标志,任务号

74LS164为移位寄存器,当CLK来一个正脉冲74LS164移位一次,即我们要给8*4个脉冲信号,并在一次脉冲前给在PC7给出相应的“0”或“1”,在164和数码管之间加一个500欧的限流电阻。这里设计为阳极数据管。PC7控制CLK,PC6控制移位补充位。

4、步电机驱动模块

8255PA控制四相电机的数据,并通过74LS373锁存,PB0控制74LS373数据是否可以通过。 当PB0为高电平时,74LS373数据可以通过,并送出相应的数据。使用TIP521光电耦合,隔离步进电机和控制电路的电源,并使用三极管9013进行驱动,达到四相电机的驱动电流。

5、步进电机模块

步进电动机的工作原理及运用

步进电动机的励磁方式可分为全部励磁及半步励磁。其中全部励磁又有1相励磁及2相励磁之分,而半步励磁又称为1-2相磁。图为步进电动机的控制等效电路,适应控制A、B、/A、/B的励磁信号,即可控制步进电动机的转动。每输出一个脉冲信号,步进电动机只走一步。因此,依序不断送出脉冲信号,即可步进电动机连续转动。分述如下:

(1) 1相励磁法:在每一瞬间只有一个线圈导通。消耗电力小,精确度良好,

但转矩小,振动较大,每送一励磁信号可走1.8度。若以1相励磁法控制步进电动机正转,其励磁顺序如图所示。若励磁信号反向传送,则步进电动机反转。

励磁顺序:A->B->C->D->A

SETP 1 2 3 4 (2) A 1 0 0 0 B 0 1 0 0 C 0 0 1 0 D 0 0 0 1 2相励磁法:在每一瞬间会有两个线圈同时导通。因其转矩大,振动小,故目前使用最多的励磁方式,每送一励磁信号可走1.8度。若以2相励磁法控制步进电动机正转,其励磁顺序如图所示。若励磁信号反向传送,则步进电动机反转。

励磁顺序:AB->BC->CD->DA->AB SETP A B C D 1 2 3 4 (3)

SETP 1 2 3 4 5 6 7 8 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 四相双八拍顺序:AB->-ABC->BC->BCD->CD->CDA->DA->DAB

A 1 1 0 0 0 1 1 1 B 1 1 1 1 0 0 0 1 C 0 1 1 1 1 1 0 0 D 0 0 0 0 1 1 1 1 3、步进电动机的负载转矩与速度成反比,速度愈快负载转矩愈小,当速度快至其极限时,步进电动机不再运转。所以在每走一步后,程序必须DELAY一段时间。 在这里使用四相八拍步进电机。

(2)、软件方案论证

根据硬件所选的方案,软件共分成6个模块:①GAL16V8芯片译码电路的编程 ②主程序模块,③、初始化模块,④、电机数据设置模块⑤、8255四相电机控制模块⑥ 164和LED显示模块 ⑦ 键盘模块

GAL16V8芯片译码电路的编程源代码: GAL16V8

ADDRESS DECODER HZY 2005-07-12 DECODER

NC A9 A8 A7 A6 A5 A4 A3 A2 GND

NC GG IOWout IORout Y1 Y0 AEN IOW IOR VCC

/Y0=A9*/A8*/A7*/A6*/A5*/A4*/A3*/A2*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/A4*/A3*/A2*/IOW*/AEN

/Y1=A9*/A8*/A7*/A6*/A5*/A4*/A3*A2*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/A4*/A3*A2*/IOW*/AEN /IOWout=/IOW /IORout=/IOR

/GG=A9*/A8*/A7*/A6*/A5*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/IOW*/AEN DESCRIPTION

地址编码表 /y0(8255) /y1(8259) 二进制地址 10 0000 00×× 10 0000 01×× 十六进制地址 200~203 204~207

主程序模块

主程序模块主要实现三大子功能: ⑴对各芯片进行初始化操作

⑵根据硬件的连接和抢答的流程把各个功能模块有序的组织起来 ⑶读任务并根据任务向步进电机送电。

开始 初始化子程序 电机数据设置子程序(数据设置) Di=0 Di号任务步长=0? N 第DI个二极管亮读DI号任务转向 Y 调用正转子程序 调用反转子程序 Y Fin=00? Fin=00? N Di=di+1 N Di>5? N Y Y 继续? N 结束

电机数据设置模块

开 始 A SI=0 LED亮灭显示第三位并调用键盘函数 第SI个二极管亮,初始化显示区 LED亮灭显示第一位并调用键盘函数 按下C 按下a 按下B 按下D 其他 按下数字 按下D 按下其他 Step2=相应数字 Direct=0bh Direct=0ha LED亮灭显示第三位并调用键盘函数 LED亮灭显示第二位并调用键盘函数 按下其他 按下数字 按下C 按下其他 按下数字 按下D 按下C Step3=相应数字 Step1=相应数字 Y B A Steplong=Step1*100+step*10+step3,inc si N Si>=5?

B N 是否按下E? Y 结 束 N 返回子程序开始处 是否按下F? Y

以上为设置电机任务流程图,主要是设置转向,步数。由于人输入的是十进制的,而机器使用16进制计数,所以我们要把十进制转化为十六进制。在执行任务时,也一样,要把十六进制转化为十进制通过数码管显示。

四相电机八拍正反转动子模块 电机在本系统中,主要是控制方向和控制步数。主要是通过两子程序来完成,正向八拍子程序和反向八拍子程序,两个子程序没在的区别,主要是送数过程相反,在这里主要以正向程序进行分析。 以下为正转八拍流程图:

开 始 FIN=SI=0 8255送PSTB1第SI数 结 束 Step=step-1 SI=8? Step转化为十进制并存入显示缓冲出 FIN=01H,表示任务完成 并退出子程序 调用显示子和程序 SI=SI+1,STEP减1 STEP=0?

LS164和LED显示模块

设计选用LS164做为数码管的控制源,74LS164做为移位锁存驱动芯片,是8位串行输

入并行输出,并行口直接与数码管相连,这里有4 个数码管,用4个164,所以显示需改变,要重新移位送数4*8个。

开 始 DI=0 CX=8 读显示存储区第DI位 转化相应的编码存入AL 结 束 AL右移一位 N CF=1? Y PC6=1 PC7=1,PC=0一个高脉冲 Y CX=1? PC6=0

键盘模块

本方案使用4*4键盘,并过8255控制,其中PC0-4控制行,PB0-4控制列。在需要按键时

不断的扫描行(该行送0),并读PB口,如有位为“0”那么可通过送0位和读0位判断是哪个键按下,并将键值送入键盘缓冲区。

开 始 PC0123=0,BL=0 8255命令口送BL,bl未位=0,行扫描 读8255PB口 bl+1送命令口bl未位=1,终止扫描这一行 N PB低四位有0? Y 存入键盘缓冲区 N 结 束 Y Bl=7? BL=BL+1

调试分析:

在设计过程中,不管在硬件设计和软件设计过程中,需要一步一步,全面的设

计不能想到点做一点,要全面的考虑。如在硬件布局中,不能拿到芯片就向往上焊,需要先设计整体布整图在焊接。

GAL调试

出现的问题:在*.lst文件中的GAL管脚图中,发现10管脚不为GND,为A2 原因:在写程序时,多写了一个A6,使GAL出错 经验总结:以前地认为类似这种错误,在编译时会自动找到,会有出错提示, 有思维定式,所以以后写程序时,要注意尽量少出现类似的低级错误。 显示模块调试

出现的问题:在上电调试时,发现显示出错,从0到F显示乱码,只控制全灭和全亮。

原因查找思路:①可能是LEDTB出错,少写,移位或者把阳极编码写成阴极编码。

②硬件电路出错,移位输入口AB接错。

③显示子程序出错,在控制4*8次移位时出错多移或少移。 ④8255控制出错

原因:为①LED编码表出错,由于设计硬件使用右移方式,即从DP,G移到A,但是LEDTB中从高到低为G到A,右移时先移A,所以软硬件不统一,导致,显示出错。

经验总结:设行时思路要清楚,软硬件要统一。 再仔细察一次。

出现问题:光电耦合送1,送0,输出都为高。

原因查找思路:①输入输出接地线出错 ②输出上拉是阻过小

原因:用万用表查得,TIP521已烧掉,此时发现输入输出的限流电阻太小只有200欧,电流太大。

解决方案:限流电阻使用1K电阻

经验总结:设行时,要全面的考虑,要很好考虑上拉限流,防止出错。

附页

作品实物图:

源代码:

;---步进电机自动控制系统-------------------------------------------

;----向端口送数宏--------------------------------------------------------- wp macro port,dat mov dx, port mov al, dat out dx, al endm

;---读端口宏------------------------------------------------------------- rp macro port mov dx, port in al, dx endm

;---屏幕显示字符串宏----------------------------------------------------- info macro port mov ah,09h lea dx,port int 21h endm

;----延时宏--------------------------------------------------------------- delay macro port,dat push cx push ax

mov dx,port mov cx,dat mov ah,86h int 15h pop ax pop cx endm

;------------------------------------------------------------------------------ data segment

c8255_ctl equ 203h; 8255控制口 c8255_a equ 200h; 8255A口 c8255_b equ 201h; 8255B口 c8255_c equ 202h; 8255c口

pstb1 db 05h,15h,14h,54h,50h,51h,41h,45h; 四相双八拍正向加电代码 pstb2 db 45h,41h,51h,50h,54h,14h,15h,05h; 四相双八拍反向加电代码 pslong db 08h; 表示加电方式八相

steplong dw 0000h,0000h,0000h,0000h,0000h; 走的步数 step1 db 00h; 键盘输入时百位 step2 db 00h; 键盘输入时十位 step3 db 00h; 键盘输入时个位 step dw 0000h

direct db 5 dup (0ah); 旋转方向,0a为正向,0b为反向 dir db 0ah;

fin db 00h; 一次任务是否完成标志位,00是未完成,01为完成 keytb db 0ffh; 键盘输入存储区

playtb db 4 dup (00h); 显示缓存存放0到11h,10为全灭,11为全亮,4个数码管

dptb db 4 dup (00h); 存放playtb转换过来的LED编码 Ctb db 0feh,00h,0fdh,00h,0fbh,00h,0f7h,00h,0efh

Ctb1 db 0feh,0fdh,0fbh,0f7h,0efh;LED发光二极373输出代码 LEDtb db 003h,09fh,025h,00dh,099h,049h,041h,01fh;

db 001h,009h,011h,0c1h,063h,085h,061h,071h,0ffh,00h;---------0ff为全灭,11为全亮 data ends code segment

assume cs:code,ds:data start: mov ax, data mov ds, ax

call init; 初始化 main:

call setdata; 设置电机数据 mov di, 00h mov si, 00h runbegin:

wp 204h, ctb1[si]

wp c8255_ctl, 00001011b; PC5=0 关373 mov ax, steplong[di]; 读第di个任务步数 ;wp 204h,ctb[di] mov step, ax

cmp step, 0000h; 如果步数为0,执行下一个任务 je runnext

mov al, direct[si]; 读第di个任务的转向,并存入显示区 mov dir, al mov playtb+3,al cmp dir, 0ah

je run1; 是否正转 cmp dir, 0bh

je run2; 是否反转

run1: call move1; 正转操作 cmp fin,00h je run1 jmp runnext

run2: call move2; 反转操作 cmp fin, 00h je run2

jmp runnext runnext:inc di inc di inc si cmp di,09h ja goon

jmp runbegin

goon: mov playtb+2,0eh; mov playtb+1,0eh; mov playtb, 0eh;

mov playtb+3,0eh; 显示E call display

delay 0a000h, 0h; 延时0.005s mov playtb+2,0fh; mov playtb+1,0fh; mov playtb, 0fh;

mov playtb+3,0fh; 显示F call display

delay 0a000h, 0h; 延时0.005s call sound call keyset cmp keytb,0eh jne exit1

jmp main; 如果按下E继续 exit1: cmp keytb,0fh

jne goon; 如果按下F退出系统 exit: mov playtb+3,10h mov playtb, 10h mov playtb+2,10h mov playtb+1,10h call display

mov ah, 4ch; 返回DOS int 21h; 返DOS

;----初始化子程序--------------------------------------------- init proc

wp c8255_ctl, 10000010b; 8255PA,PC输出,PB输入 wp c8255_c, 0ffh

wp c8255_ctl, 00001010b; PC5=0 关373

wp c8255_ctl, 00001110b; pc7=0 关ls164 ret

init endp

;--初始化子程序------------------------------------------- ;--电机数据设置子程序------------------------------------- setdata proc

push si push ax push dx push cx mov direct,0ah mov direct+1,0ah mov direct+2,0ah mov direct+3,0ah mov direct+4,0ah

setst: mov si, 00h; 第几个任务 mov di, 00h

set: wp 204h, ctb[si]

mov playtb+2,00h; 设置步数百位00 mov playtb+1,00h; 设置步数十位0 mov playtb, 00h; 设置步数个位 set1: mov al, step1

mov playtb+2,al; 设置步数百位 mov al, step2

mov playtb+1,al; 设置步数十位 mov al, step3

mov playtb, al; 设置步数个位0 mov al,direct[di]; 设置正转反转

mov playtb+3,al; 设置正转反转0a call display

delay 0a000h, 0h; 延时0.005s

mov playtb+3,010h; 设置正转反转全亮全灭 call display

delay 0a000h, 0h; 延时0.005s call keyset

cmp keytb, 0eh; 是否确定 jne set10 jmp setok

set10: cmp keytb, 0ah; 是否为正转 je set2

cmp keytb, 0bh; 是否为反转 je set3;

cmp keytb, 0dh; 是否设置下一个量 je setstep1; 跳往设置步数百位 jmp set1

set3: mov direct[di], 0bh; 反转 mov playtb+3,0bh jmp setstep1

set2: mov direct[di], 0ah; 正转 mov playtb+3,0ah

setstep1:

mov al, step1

mov playtb+2,al; 设置步数百位 mov al, step2

mov playtb+1,al; 设置步数十位 mov al, step3

mov playtb, al; 设置步数个位0 mov al,direct[di]; 设置正转反转

mov playtb+3,al; 设置正转反转0a call display

delay 0a000h, 0h; 延时0.005s mov playtb+2,010h; 设置步数百位全灭 call display

delay 0a000h, 0h; 延时0.005s call keyset

cmp keytb, 0eh; 是否确定 jne setstep11 jmp setok setstep11:

cmp keytb, 0ch; 设置上一个量 jne setstep10 jmp set1 setstep10:

cmp keytb, 0dh; 设置下一个量 je setstep2 cmp keytb,09h ja setstep1 mov al,keytb mov playtb+2,al

mov step1,al; 设置步数百位 setstep2:

mov al, step1

mov playtb+2,al; 设置步数百位 mov al, step2

mov playtb+1,al; 设置步数十位 mov al, step3

mov playtb, al; 设置步数个位0 mov al,direct[di]; 设置正转反转

mov playtb+3,al; 设置正转反转0a call display

delay 0a000h, 0h; 延时0.005s mov playtb+1,010h; 设置步数百位全灭 call display

delay 0a000h, 0h; 延时0.005s

call keyset

cmp keytb, 0eh; 是否确定 jne setstep21 jmp setok setstep21:

cmp keytb, 0ch; 设置上一个量 jne setstep20 jmp setstep1 setstep20:

cmp keytb, 0dh; 设置下一个量 je setstep3 cmp keytb,09h ja setstep2 mov al,keytb mov playtb+1,al

mov step2,al; 设置步数十位

setstep3:; 设置步数个位info info_3 mov al, step1

mov playtb+2,al; 设置步数百位 mov al, step2

mov playtb+1,al; 设置步数十位 mov al, step3

mov playtb, al; 设置步数个位0 mov al,direct[di]; 设置正转反转

mov playtb+3,al; 设置正转反转0a call display

delay 0a000h, 0h; 延时0.005s mov playtb,010h; 设置步数个位全灭 call display

delay 0a000h, 0h; 延时0.005s call keyset

cmp keytb, 0eh; 是否确定 je setok

cmp keytb, 0ch; 设置上一个量 jne setstep4 jmp setstep2 setstep4:

cmp keytb,09h ja setstep3 mov al,keytb mov playtb,al

mov step3,al; 设置步数个位 jmp setstep3

setok: mov al, step1

mov playtb+2,al; mov al, step2

mov playtb+1,al; mov al, step3

mov playtb, al; mov al,direct[di]; mov playtb+3,al; call display; mov dl,100 mov al,step1 mul dl

mov steplong[si],ax mov dl,10 mov al,step2 mul dl

add steplong[si],ax mov al,step3 mov ah,00h

add steplong[si],ax; mov step1, 00h mov step2, 00h mov step3, 00h cmp di,04h jae setout inc di inc si inc si jmp set

setout: mov playtb+2,0eh; mov playtb+1,0eh; mov playtb, 0eh; mov playtb+3,0eh; call display

delay 0a000h, 0h; mov playtb+2,0fh; mov playtb+1,0fh; mov playtb, 0fh; mov playtb+3,0fh; call display

delay 0a000h, 0h; call keyset cmp keytb,0eh

je runst; cmp keytb,0fh

设置步数百位 设置步数十位 设置步数个位0 设置正转反转

设置正转反转0a

将步数转化为16进制并保存

显示E 延时0.005s

显示F 延时0.005s

按下E表示确定返回

jne setout

jmp setst; 按下F表示取消 runst: mov step1, 00h mov step2, 00h mov step3, 00h pop cx pop dx pop ax pop si ret setdata endp

;--电机数据设置子程序------------------------------------- ;--键盘扫描子程序------------------------------------------ keyset proc push si push ax push cx push bx

mov keytb, 0ffh

wp c8255_ctl,00000001b wp c8255_ctl,00000011b wp c8255_ctl,00000101b

wp c8255_ctl,00000111b; 将PC0123,置高 mov bx, 00h

ks0: wp c8255_ctl,bl; PC行输出0 rp c8255_b; 读PB口 mov ah, al inc bl

wp c8255_ctl,bl; PC相应行输出1 and ah,0fh; 屏蔽前4位 cmp ah,0fh jnz ks1 cmp bl, 07h je ksout inc bl

add bh, 04h; 标志行,一行有四位所以加4 jmp ks0

ks1: cmp ah, 0eh jne ks2

mov keytb, bh jmp ksout

ks2: cmp ah, 0dh jne ks3 inc bh

mov keytb, bh jmp ksout

ks3: cmp ah, 0bh jne ks4 add bh, 02h mov keytb, bh jmp ksout

ks4: cmp ah, 07h jne ksout add bh,3

mov keytb, bh ksout:

pop bx pop cx pop ax pop si ret

keyset endp

;---键盘扫描子程序------------------------------------------ ;--- LED显示子程序------------------------------------------ display proc push si push ax push cx push bx push di

mov di, 00h

dis: mov cx, 08h; 一个LED右移8位 mov al,playtb[di] mov ah,00h mov si,ax

mov al,ledtb[si]; 转换为相应的LED编码 mov dptb[di],al

dis0: mov al, dptb[di]

ror al, 1; 右移一位 jc dis1

mov dptb[di],al

wp c8255_ctl,00001100b; 移入位是0,pc6置低 数据位0 wp c8255_ctl,00001111b; pc7置高

wp c8255_ctl,00001110b; PC7置低,一个高脉冲 jmp dis2

dis1: mov dptb[di],al

wp c8255_ctl,00001101b; pc6置高 数据位1 wp c8255_ctl,00001111b; pc7置高

wp c8255_ctl,00001110b; 移入位是1,PC7置低,一个高脉冲 dis2: loop dis0

inc di; 前一个LED显示数据 cmp di,04h jne dis pop di pop bx pop cx pop ax pop si ret

display endp

;--- LED显示子程序------------------------------------------ ;--- -正转子程序--------------------------------------------- move1 proc push si push ax push cx push bx mov cx, 08h mov si, 00h

mov fin, 00h; mv1: wp c8255_a, pstb1[si]

dec step; 步数减1

call con; 十六进制换十进制并存入显示存储区 call display cmp step, 00h je mv10 inc si

delay 0140h,00h;??????????延时 loop mv1 jmp mv1out

mv10: mov fin, 01h mv1out:

pop bx pop cx pop ax pop si ret

move1 endp

;----正转子程序-------------------------------------------- ;----反转子程序-------------------------------------------- move2 proc push si

push ax push cx push bx mov cx, 08h mov si, 00h mov fin, 00h

mv2: wp c8255_a, pstb2[si] dec step; 步数减1

call con; 十六进制换十进制并存入显示存储区 call display cmp step, 00h je mv20 inc si

delay 0140h,0000h;??????????延时 loop mv1 jmp mv2out

mv20: mov fin, 01h mv2out:

pop bx pop cx pop ax pop si ret

move2 endp

;---十六进制转十进制并存入显示存储区------------------------------------------ con proc

push cx push ax mov ax, step mov cl, 100 div cl

mov playtb+2,al mov al,ah mov ah, 00h mov cl, 0ah div cl

mov playtb+1,al mov playtb, ah pop ax pop cx ret con endp

;----警告声子程序-------------------------------------------- sound proc

push ax push bx push cx push dx push di push si rp 61h mov ah, al or al, 3

wp 61h, al; 开内部扬声器

wp 43h, 10110110b; 内部8253初始化 wp 42h, 33h

wp 42h, 05h; 赋计数初值 delay 1a98h, 1h; 延时 mov al, ah

out 61h, al; 关闭内部扬声器 pop si pop di pop dx pop cx pop bx pop ax ret

sound endp code ends end start

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