汇编--输入输出程序设计.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的和内容
1. 掌握输入输出指令的使用;
2. 上网查 3相步进电机的工作原理;
3. 用 emu8086工具运行步进电机程序;
4. 对步进电机程序进行改进,精确控制其转速。
二、实验原理及基本技术路线图(方框原理图步进电机的工作原理:
三、所用仪器、材料(设备名称、型号、规格等
1. 操作系统平台:Windows 7
2. 汇编环境:emu8086
四、实验方法、步骤
1. 打开 emu8086汇编开发环境;
2. 打开 emu8086例子程序中的步进电机的源程序:
D:\emu8086\examples\stepper_motor.asm
3. 运行该程序,观察运行情况,并结合步进电机的工作原理,阅读并理解程序的执行逻辑,读懂程序中的注释;
4. 尝试修改该程序,以精确控制步进电机的转速;
5. 运行修改后的程序,观察运行结果,并分析;
6. 记录实验过程,并完成实验报告。
五、实验过程原始记录 (数据、图表、计算等
1. 打开步进电机的控制程序:
2. 运行调试该程序,观察结果:
3. 阅读该程序, 并添加注释 (下面为了保存原版程序, 打开程序的一个副本进行修改 :
添加注释后的源代码如下:
; 这是一个输出控制的例子
; 它向虚拟的 I/O端口输出值
; 以控制步进电机
; d:\emu8086\devices\stepper_motor.exe 在 7号端口#start=stepper_motor.exe#
name "stepper"
#make_bin#
steps_before_direction_change = 20h ; 十进制的 32 jmp start
; ========= 数据 ===============
; 二进制的数据用以控制步进电机
; 顺时针以半步循环方式 (半个步距角转动 :
datcw db 0000_0110b ;BC-->C-->AB-->B-->BC
db 0000_0100b
db 0000_0011b
db 0000_0010b
; 二进制的数据用以控制步进电机
; 逆时针以半步循环方式 (半个步距角转动 :
datccw db 0000_0011b ;AB-->A-->BC-->B-->AB
db 0000_0001b
db 0000_0110b
db 0000_0010b
; 二进制的数据用以控制步进电机
; 顺时针以整步循环方式 (一个步距角转动 :
datcw_fs db 0000_0001b ;A-->AB-->BC-->0-->A
db 0000_0011b
db 0000_0110b db 0000_0000b ; 二进制的数据用以控制步进电机 ; 逆时针以整步循环方式(一个步距角转动: datccw_fs db 0000_0100b ;C-->BC-->AB-->0-->C db 0000_0110b db 0000_0011b db 0000_0000b start: mov bx, offset datcw ; 开始以顺时针半步循环方式执行 mov si, 0 mov cx, 0 ; 初始化计数器 next_step: ; 获取步进电机控制信号最高位, 若为 1, 则表示就绪 wait: in al, 7 test al, 10000000b jz wait mov al, [bx][si] out 7, al inc si cmp si, 4 jb next_step mov si, 0 inc cx cmp cx,
steps_before_direction_change jb next_step mov cx, 0 add bx, 4 ; 下一组控制数据 cmp
bx, offset datccw_fs jbe next_step mov bx, offset datcw ; 返回顺时针半步循环方式执行 jmp next_step 4. 尝试修改该程序,以精确控制步进电机的转速: -6-
修改说明:在原程序的 OUT 7, AL 一句后面加入如上图所示的代码,试图通过调用 DOS 系统中的 INT 15H 的 86H 号功能,即延时功能来控制步进电机每一步转动的时间,这里为了观察方便,设置每一秒转动一步(半步或整步)。
5. 运行调试修改后的程序,观察运行结果:(1)当程序运行起来之后,在程序进入延时程序时,暂停: -7-
(2)当然在运行调试之前首先要把 emu8086 的调试的延时设为零(如下图)。
如下图所示,此时延时程序即将完成,可以看到:当前步进电机正在以半步顺时针方式转动,因为(BX=02H 是第一组控制信号的偏移量;当前第一组控制信号被执行的次数尚无法确定,因为延时程序正在使用 CX 寄存器;刚刚输出了控制信号 (0000_0100b,这里 (AL=04H 存储了刚才输出的控制信号,易知下一个要输出的控制信号为(0000_0011b。
(3)此时步进电机暂停执行,1 秒钟之后步进电机转动一步,再过 1 秒钟,再转动一步,如此循环,从而完成了步进电机转速的简单控制。
如果要设置其他转速,可以根据要求计算相应的延时时间(单位:微秒)然后将这一时间置于 CX : DX 中,,调用 INT 15H 的 86H 号功能,设置延时即可。
如下图,因为下一个要输出的控制信号为(0000_0011b,所以下图中将要通电(变红)的相为 A 相和 B 相(即图中的 0 和 1)。
-8-
INT 15H 的 86H 号功能介绍:功能描述:延迟入口参数:AH=86H CX:DX =千分秒出口参数:CF=0 表示操作成功,AH=00H 六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸) 1. 在对外设的管理与控制中, CPU 时常要对设备接口进行直接控制、驱动或与之联络,此时需要设计输入输出程序,汇编语言直接控制硬件的能力使得用它编写高性能 I/O 程序成为我们的最佳选择。
本实验用一个控制步进电机的简单例子,展示了汇编语言在这方面的出色能力,也使得我们对输入输出程序的设计有了更加深刻的理解和认识。
2. 本实验使用的 emu8086 模拟了 8086 的汇编语言环境,所以程序中用到的 7 号输出端口是一个虚拟的输出端口,当然步进电机也是由虚拟
的演示程序实现。
但这些模拟对我们以后真正的实际应用有很大的帮助作用。
程序修改后的不足之处在于对步进电机的转速控制上仍然不够精确和方便,这一点有待改进。
-9-。