微机原理课程基于80x86的步进电机控制系统

合集下载

基于8086的步进电机控制系统设计2说明书内容

基于8086的步进电机控制系统设计2说明书内容

目录一、电路总体设计 (2)1.1系统功能与实现方式 (2)1.2系统的总体组成 (2)二、各部分电路原理图设计 (3)2.1 8086最小方式系统 (3)2.2存储器的设计 (4)2.3步进电机控制电路 (6)2.4键盘和显示电路 (8)三、设计心得与总结 (9)四、参考资料 (9)一、电路总体设计1.1系统功能与实现方式该系统采用8086最小方式,用8255作为接口芯片,用于连接控制步进电机的变频控制器,芯片62256和2764分别作为数据存储扩展芯片和程序存储扩展芯片,步进电机的工作时间控制由82C54芯片来确定,步进电机的工作方式由按键板块接收操作信号,然后由程序判定并执行操作。

1.2系统的总体组成1)处理器芯片选用8086,当8086的MN/MX引脚接+5V电压时,8086工作在最小方式下:时钟发生器采用82C54芯片主微处理器CPU选用8086芯片数据收发器用来对数据进行缓冲和驱动,并控制数据发送和接收方向,向CPU传送I/O的数据或向IO传送CPU提供的数据。

同样由于8086中数据线只有8条,所以数据收发器只要一个8286就可以了。

地址译码器用74LS138,用地址线直接控制。

在最小方式下,8086CPU会直接产生全部总线控制信号。

2)只读存储器采用ROM芯片2764,随机存储器62256。

3)8255和82C54去控制步进电机4)键盘控电路5)时钟电路、加电复位和复位电路。

6)地址分配:8255: 00100---001FF2764: 01000---01FFF62256: 04000---07FFF键盘相关:100H—103H显示相关:140H—141H步进电机相关:200H—207H功能描述:在最小方式下,8086CPU产生全部总线控制信号,由2764和62256构成了8k的ROM和32KB 的RAM,在此基础上,分别实现接口逻辑。

本系统采用8086位处理器工作在最小方式系统下,采用8282、8286、8284构成了最小系统,形成总线逻辑。

微机原理3.80X86编程结构

微机原理3.80X86编程结构

2011-3-5
3
(3)专用寄存器: 专用寄存器: •指令指针寄存器 指令指针寄存器IP 指令指针寄存器 存放8086要执行的下一条指令的有效地址。程 存放8086要执行的下一条指令的有效地址。 8086要执行的下一条指令 序员不能修改它的值,只能由8086CPU中的 不能修改它的值 序员不能修改它的值,只能由 中的 BIU自动修改。 自动修改。 自动修改 •标志寄存器 标志寄存器FLAGS 标志寄存器
2011-3-5
8
80X86微处理器的寄存器结构 §2.3 80X86微处理器的寄存器结构
80X86系列微机的体系结构 第二章 80X86系列微机的体系结构
寄存器结构 一.8086CPU寄存器结构 寄存器
2.标志寄存器FLAGS格式及各位意义 2.标志寄存器FLAGS格式及各位意义 标志寄存器FLAGS
2011-3-5 11
80X86微处理器的寄存器结构 §2.3 80X86微处理器的寄存器结构
第二章 80X86系列微机的体系结构 80X86系列微机的体系结构
寄存器结构 一.8086CPU寄存器结构 寄存器
【例】 执行下面两个数的加法,给出各状态标志位的 执行下面两个数的加法,
值。 0101 0100 0011 1001 + 0100 1001 1010 1010
4 1 AF
2 0 PF
0 0 CF
12
80X86微处理器的寄存器结构 §2.3 80X86微处理器的寄存器结构
第二章 80X86系列微机的体系结构 80X86系列微机的体系结构
寄存器结构 一.8086CPU寄存器结构 寄存器
2.标志寄存器FLAGS格式及各位意义 2.标志寄存器FLAGS格式及各位意义 标志寄存器FLAGS

微机原理与接口技术第3章 80x86指令系统

微机原理与接口技术第3章 80x86指令系统

52234H 89H (操作数低8位) 52235H 67H (操作数高8位)
……
运行结果:(AX) = 6789H
图3-11 基址变址寻址
图3-12 DEBUG下基址变址指令的输入、汇编及执行
5、相对基址变址寻址
EA = 基址 + 变址 + 位移量
例如:(DS)=5000H,(BX)=1234H,(SI)=1000H ,则: MOV AX,[BX+SI+2000H]
I/O端口寻址
间接端口寻址:采用这种寻址方式时,端口地址为16 位(0~0FFFFH)。
必须先将端口地址存放到寄存器DX中。
例如:
MOV DX,1000H ;端口地址为1000H OUT DX,AL ;间接端口寻址
小结
1. 立即寻址方式:MOV AX,0FF00H 2. 寄存器寻址方式: MOV DX,AX 3. 直接寻址方式: MOV AX,[2000H] 4. 寄存器间接寻址方式: MOV BX,[SI] 5. 寄存器相对寻址方式: MOV AL,COUNT[BX] 6. 基址变址寻址方式: MOV AX,[BX][SI] 7. 相对基址变址寻址方式:
SS
SP
栈顶(低地址)
堆 栈
已入栈 的数据
……

栈底(高地址)
图3-20 堆栈结构
➢ 指令格式:PUSH 16位/32位源操作数 POP 16位/32位目的操作数
源操作数:16位或32位通用寄存器、段寄存器或存储器操作 数
386以上系统允许PUSH指令的源操作数为立即数 目的操作数:16位或32位通用寄存器、段寄存器或存储器操 作数 只有386以上的处理器才能使用32位的操作数

微机原理课件第二章 80X86微处理器

微机原理课件第二章 80X86微处理器
SF=1:记录运算结果的符号为负。 SF=0:记录运算结果的符号为正。

ZF(Zero Flag)零标志
ZF=1:运算结果为0。 ZF=0:运算结果不为0。

CF(Carry Flag)进位标志 CF=1:记录运算时从最高有效位产生进位值。
CF=0:记录运算时从最高有效位不产生进位值。
8086/8088微处理器的基本结构
返回
8086/8088微处理器的基本结构
3、寄存器结构
(1) 通用寄存器组
AX、BX、CX、DX 作为通用寄存器。
用来暂存计算过程中所用到的操作数,结果或其它信息。 访问形式: 可以用16位的访问; 或者可以用字节(8位)形式访问, 它们的高8位记作 : AH 、 BH 、 CH 、 DH 。 它们的低8位记作 : AL 、 BL 、 CL 、 DL 。
8086/8088微处理器的基本结构 CX——Count可以作计数寄存器使用。 在循环LOOP指令和串处理指令中用作隐含计数器。 例: MOV CX , 200H AGAIN: …… …… LOOP AGAIN ;(CX)-1(CX),结果0转 AGAIN DX——Data可以作为数据寄存器使用。 一般在双字长乘除法运算时, 把DX和AX组合在一起存放一个双字长(32位)数,DX用来存 放高16位; 对某些I/O操作DX可用来存放I/O的端口地址(口地址 256)。 例: MUL BX ; (AX)(BX)(DX)(AX) 例: IN AL , DX
执行部件EU从指令队列取指 令,并执行。
8086/8088微处理器的基本结构
1、总线接口单元
BIU(Bus Interface Unit)
(1).功能:负责与 M、I/O 端口传送数据。

80x86微机原理与接口技术课程设计

80x86微机原理与接口技术课程设计

80x86微机原理与接口技术课程设计
摘要
本文主要介绍80x86微机原理和接口技术的课程设计。

80x86微机是指由
Intel公司推出的一系列x86架构的微处理器,是现代计算机的基础。

通过本次课
程设计,学生将学会如何搭建一个基于80x86微机的系统,包括软件和硬件的设计与实现。

该课程的目的是让学生深入了解80x86微机的原理和接口技术,并能够独立完成微处理器系统的设计。

引言
80x86微机是指由Intel公司推出的一系列x86架构的微处理器,是现代计算
机的基础。

80x86微机的原理和接口技术是计算机专业中的经典课程之一,非常重要。

在学习过程中,我们将首先了解80x86微机的基本组成、工作原理和指令集。

然后,我们将学习80x86微机的接口技术,主要包括硬件接口和软件接口,并通过实践掌握80x86微机的应用和调试技术。

最后,我们将通过课程设计来应用所学知识,实现一个基于80x86微机的系统。

课程设计目的
80x86微机原理和接口技术的课程设计的主要目的是: - 让学生深入了解
80x86微机的原理和接口技术; - 培养学生独立完成微处理器系统的设计和实现
能力; - 让学生掌握80x86微机的应用和调试技术; - 提高学生的工程实践能力。

课程设计任务
本次课程设计的任务是使用80x86微机设计和实现一个基于汇编语言的游戏程序。

具体要求包括: - 设计和搭建一个基于80x86微机的硬件系统,包括CPU、
1。

微机原理课程设计报告_基于80X86汇编语言的动画图形设计

微机原理课程设计报告_基于80X86汇编语言的动画图形设计

微机原理与接口技术一、课题名称基于80X86汇编语言的动画图形设计二、设计任务书课程设计任务书1 课题名称:基于80X86汇编语言的动画图形设计2 课程设计目的通过本课程设计,初步掌握《微机原理及接口技术》这门课程课堂所学的理论知识具体运用到实践中去的基本方法。

掌握利用BIOS实现微型计算机显示器和键盘接口程序设计的方法;掌握利用CPU汇编语言设计较大程序的一般方法;进一步加深对学习过程中的基本知识、基本理论、基本方法的理解;从而为今后从事微型计算机软硬件的设计、维护、调试和应用等打下良好的基础。

3内容简述利用汇编语言设计一动画图形,具体内容由学生自己确定,原则上应为以下形式之一:⑴图形按照一定规律自行运动且由键盘控制图形的起、停;⑵键盘作为功能键,控制图形的过程运动和功能变化;⑶交互式动画图形,既通过按下键盘上不同的按键后,能使图形按照不同的方向运动和静止。

5设计方案提示⑴利用DOS系统功能调用和BIOS的INT16H实现按键的识别。

⑵利用BIOS的INT10H完成图形绘制。

⑶CRT工作方式04H为:320×200(彩色);CRT工作方式10H为:640×350(16色);CRT工作方式12H为:640×480(16色)(推荐);三、内容提要摘要:本实验主要讲述了基于80X86汇编语言动画的设计。

主要采用了两种BIOS调用:INT 10H(显示中断)和INT 16H(键盘中断)。

在与CPU和其各寄存器的配合工作下,完成动画图形。

关键字:BIOS中断子程序宏调用字符图形Abstract: The present work describes the animation design based on 80X86 assembly language. It mainly uses two BIOS calls: INT 10H (show interrupts) and the INT 16H (keyboard interrupt). With the cooperating of CPU and its various registers, the animation graphics work can be completed.Keywords: BIOS interrupts; subroutine; macro; call; Character Graphics四、目录正文1、概述所作题目的意义、系统的主要功能、及使用方法;2、硬件电路设计及描述;3、软件设计流程及描述;4、源程序代码(要有注释)。

微型计算机原理及接口技术第3章 80X86指令系统及汇编语言

微型计算机原理及接口技术第3章  80X86指令系统及汇编语言

第3章 80X86指令系统及汇编语言
..
操作码 2000 ∶ 0FFFH 50H 2000∶ 1000H
2000 ∶ 1050H 操作码
CS + IP +
20 00 10 00
50 21 05 0
.. .. ..
图3.8 段内相对寻址
第3章 80X86指令系统及汇编语言
2.段内间接寻址 在段内间接寻址方式中,转移地址的段内偏移地 址要么存放在一个16位的寄存器中,要么存放在存贮 器的两个相邻单元中。存放偏移地址的寄存器和存贮 器的地址将按指令码中规定的寻址方式给出。此时, 寻址所得到的不是操作数,而是转移地址。 例:JMPCX 其过程如图3.9所示。
第3章 80X86指令系统及汇编语言
3.1.2转移地址的寻址方式 1.段内相对寻址 在段内相对寻址方式中,指令应指明一个8位或16
位的相对地址位移量DISP(有正负符号, 用补码表示)。此时,转移地址应该是代码段寄存
器CS内容加上指令指针IP内容,再加上相对地址位移 量DISP。
例:JMPDISP1 其过程如图3.8所示。
第3章 80X86指令系统及汇编语言
2.交换指令 XCHG OPRD1,OPRD2 交换指令把一个字节或一个字的源操作数与目的 操作数相交换。这种交换能在通用寄存器与累加器之 间、通用寄存器之间、通用寄存器与存贮器之间进行, 但是段寄存器不能作为一个操作数。例如:
XCHGAL,CL XCHGAX,DI XCHGBX,SI XCHGAX,BUFFER XCHGBX,DATA[SI]
第3章 80X86指令系统及汇编语言
立即数
段寄存器 CS,DS,SS,ES
通用寄存器 AX,BX,CX,DX,BP,SP,SI,DI AH,AL,BH,BL,CH,CL,DH,DL

基于80x86微机接口电路的数字PWM控制器设计.doc

基于80x86微机接口电路的数字PWM控制器设计.doc

目录1引言 .......................... 错误!未定义书签。

2课程设计目的............ 错误!未定义书签。

3课题名称和设计要求. 错误!未定义书签。

4课题分析和设计思想.. (4)4.1 本课题分析: (4)4.2 本课题的设计思想: (5)5硬件电路实施方案..... 错误!未定义书签。

5.1 分模块阐述实现方法................................... 错误!未定义书签。

5.1.18255A模块错误!未定义书签。

5.1.2AD0809模块错误!未定义书签。

5.1.38254模块65.2 电路图 .............................................. 错误!未定义书签。

6控制软件程序清单..... 错误!未定义书签。

6.1 8254计时模块........................................ 错误!未定义书签。

6.2 PWM输出模块......................................... 错误!未定义书签。

6.3 AD转换模块.......................................... 错误!未定义书签。

6.4 测速模块............................................. 错误!未定义书签。

6.5 完整程序............................................. 错误!未定义书签。

6.6 ASM程序............................................. 错误!未定义书签。

7遇到问题和解决办法. 错误!未定义书签。

8收获和体会 .. (17)9参考文献................... 错误!未定义书签。

基于80x86微机接口电路的数字PWM控制器设计第1章设计要求及实施方案1.1 课程设计的目的课程设计是本科教学全过程中的重要环节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理课程基于80x86的步进电机控制系统《微机原理与接口技术》课程设计姓名:厉小洋学号:0945533117班级:09电气1班专业:电气工程及其自动化学院:电气与信息工程学院江苏科技大学张家港校区2012年9月目录一理论部分 (2)1课题要求与内容 (2)2 系统方案设计 (3)3 系统硬件的设计 (4)4 系统软件设计 (5)二实践部分 (6)1 系统硬件原理简介 (6)2 系统硬件调试中出现的问题及解决措施 (10)3 系统软件 (11)3.1 软件设计 (11)3.2软件调试中出现的问题及解决措施 (14)三附录 (15)题目:《基于80x86的步进电机控制系统》第一章、理论部分一微机原理课程设计课题要求与内容内容要求:(1)使用8255A控制步进电机的运转。

(2)使用数码管LED显示速度的大小。

(3)使用8253定时器调节速度的大小。

(4)使用4个独立按键控制步进电机,即“正传”、“反转”、“停止”、“调速”。

(5)使用8259A产生中断控制按键;(6)使用DAC0832显示速度的波形。

拓展功能:(1)按键部分可以增加“加速”、“减速”等功能;(2)考虑可以加蜂鸣器来区分“正转”和“反转”;(3)其他可以有自己特色的功能均可。

二系统方案设计在课程要求的前提下,步进电机为四相八拍步进电机,这样可以用8255的一个端口控制电机的驱动,LED显示为十六位图1系统流程图在8255中可用两个端口控制,按键单元可与电机共用一个八位端口,由8254产生可编程脉冲,进入8259产生中断,反馈给80x86,控制8255。

再执行到步进电机及其LED显示上,一个脉冲步进电机一拍。

由按键读入系统状态。

具体的系统设计如图1为系统概况流程图三系统硬件设计在硬件设计中,主要是通过步进电机模块、8255模块、LED模块、8254模块。

在8255芯片上用A,B口控制数码管的显示(A为位选B为段选),C口的高四位为四个按键单元,低四位作为输出,控制步进电机。

片选CS接IOY2。

在8259和8254上,采用一个脉冲一拍的方式。

给8254一个1.8432MHZ在CLK2,OUT2输出给CLK0,由OUT0给8259的INT,输出一个脉冲,经由IR0给80x86的中断口INTR。

如图2为硬件连接图,如下硬件连接:8254,8255,8259的CS分别接在IOY2,IOY0,IOY18255芯片连接:8255的A,B控制LED,A口接位选,B口接段选,将C 口分为两段,高四位读取按键,低四位控制步进电机,按键分为四个如下表1所示图2硬件连接图四系统软件设计图3软件系统工作流程图过8255读取按键的信号,来控制步进电机的开关,正转,反转,速度的大小。

通过8254计数器工作在方式0的状态下来控制每拍运行的时间,步进电机速度不同,赋给8254的初始值不同,同时8255的PA,PB口向LED接口输出信号,LED数码管显示步进电机每分钟的转速。

8254计数器每次运行结束,向8259发出一个高电平,8259IR0接口检测到高电平信号,即进入中断服务程序,在中断服务程序里,执行对下一拍给步进电机信号的赋值。

在每次循环中,执行键盘按键检测程序,如有按键,退出程序,否则,反复循环。

如图3为软件系统的工作流程图第二章实践部分一系统硬件原理简介1.1步进电机的简介及其工作原理步进电机的驱动原理是通过它每相线圈的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲来控制,所以调节脉冲的频率便可改变步进电机的转速,微控制器最适合控制步进电机。

另外,由于电机的转动惯量的存在,其转动速度还受驱动功率的影响,当脉冲的频率大于某一值时,电机便不再转动。

本次课程设计中电机共有四个相位(A,B,C,D),按转动步骤可分单4拍(A->B->C->D->A),双4拍(AB->BC->CD->DA->AB)和单双8拍(A->AB->B->BC->C->CD->D->DA->A).此模块的主要功能是通过接收8255的C口输入信号来控制步进电机的转动,A,B,C,D分别代表不同的四个相位,分别接入到PC0,PC1,PC2和PC3实现转动控制表 2如上述表2所示,通过编程对8255的输出进行控制,使输出按照相序表给驱动电路供电,则步进电机的输入也和相序表一致,这样步进电机就可以正向转动,反之,则反向转动。

1.2实验所用芯片的介绍及其控制方式1.2.1 8254的简介8254是Intel公司生产的课可编程定时器,8254芯片主要由四部分组成:1 数据总线缓冲器数据总线缓冲器是一个三态、双向8位寄存器主要作用是与CPU进行数据交换,8位数据线D7~D0与CPU的系统数据总线连接,构成CPU和8254之间信息传送的通道,CPU通过数据总线缓冲器向8254写入控制命令、计数初始值或读取计数值。

2 读写逻辑读写逻辑是芯片的控制部分,编程人员通过控制信号的选择来选择芯片的工作方式。

读/写控制逻辑用来接收CPU系统总线的读、写控制信号和端口选择信号,用于控制8254内部寄存器的读/写操作。

3 控制字寄存器控制寄存器是一个只能写不能读的8位寄存器,系统通过指令将控制字写入控制寄存器,设定8254的不同工作方式。

4 计数器8254内部有三个结构完全相同而又相互独立的16位减“1”计数器,每个计数器有六种工作方式,各自可按照编程设定的方式工作。

1).有3个独立的16位计数器2).每个计数器可按十进制或二进制计数3).8254每个计数器允许最高计数为10MHZ4).8254 有读回指令,还可以读出状态寄存器的内容5).每个计数器可编程工作于6中不同的方式6)计数脉冲可以是有规律的时钟信号,也可以是随机信号,计数初值公式为n=fclki/fouti(fclki是输入时钟脉冲的频率,fouti是输出波形的频率)工作方式的分类:1)方式0:计数到0结束输出正跳跃信号方式2)方式1:硬件可重触发单稳方式3)方式2:频率发生器4)方式3:方波发生器5)方式4:软件触发选通方式6)方式5:硬件触发选通方式8254的控制字有两个:一个用来设置计数工作方式称为方式控制字。

另一个用来设置读回命令,称为读回控制字。

如下表3是控制方式表格表3 8254的方式控制字格式8255的简介及其控制8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O 口。

具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。

其各口功能可由软件选择,使用灵活,通用性强。

8255可作为单片机与多种外设连接时的中间接口电路。

8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。

同时必须具有与外设连接的接口A、B、C口。

由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。

8255可编程外围接口芯片是通用并行口芯片,具有A、B、C三个并行接口,有三种工方式。

方式0——基本的输入输出。

方式1——选通输入输出。

方式2——双选通工作方式表格2为控制字格式,如下图4 、图5分别为8255工作方式控制字格式和8255 C口按位置位/复位控制字格式。

图4、8255工作方式控制字格式图5 8255 C口按位置位/复位控制字格式8259的简介及其控制方式8259A是专门为了对8085A和8086/8088进行中断控制而设计的芯片,它是可以用程序控制的中断控制器。

单个的8259A能管理8级向量优先级中断。

在不增加其他电路的情况下,最多可以级联成64级的向量优级中断系统。

8259A有多种工作方式,能用于各种系统。

各种工作方式的设定是在初始化时通过软件进行的。

在总线控制器的控制下,8259A芯片可以处于编程状态和操作状态,编程状态是CPU使用IN或OUT指令对8259A芯片进行初始化编程的状态。

功能:就是在有多个中断源的系统中,接受外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请求送到CPU的INTR端;当CPU响应中断并进入中断子程序的处理过程后,中断控制器仍负责对外部中断请求的管理。

二系统硬件调试中出现的问题及解决措施问题一步进电机运转不流畅原因:分析后发现,程序执行中的中断无法连续执行,因为8254采用方式3发出的中断信号,脉冲时间太短,解决方法:在调整8254的计数器采用方式1后,一旦检测信号,重新将计数器装入初值问题二数码管显示乱码原因:查看显示数据发现,当8255输出一个段码后,下一次出现的是上一次输出的值解决方法:在以后每次输出之后,都输出一个00A,以清除8255寄存器中的值,以达到清除乱码的效果问题三程序执行中有计数器赋初值,所以每次计数器都不能执行完发出中断原因:赋初值在循环当中解决方法:将计数器赋初值放到循环外面,引用FLAG来判断是否进入中断,如果进入,则重新将计数器赋初值问题四:读取按键混乱原因:用PC7-PC4来读取按键。

读出的按键数值在高四位,于我们用低四位处理相冲突解决方法:将读出的数值右移四位三系统软件3.1 软件设计3.1.1 8255控制模块如图6所示,8255主要负责不停的读取按键状态检测速度的大小。

口2如图6 8255流程图3.1.2 8254延时模块设置8254的控制字,通过8254设置延时,产生延时频率,最后再接入到8255控制步进电机的运转与停止,速度大小主要通过对8254装入初值的不同来控制,流程如下图7,与上图6衔接(图7分别于图6最后连接)1PC7图7 8254模块流程3.1.3 LED显示模块LED模块的主要功能是前四位显示步进电机的转速(r/min)度的值。

此模块用8255A、B口的控制LED数码管的位码,采用动态扫描方式让数码管显示出速度值。

利用8255的端口A、B口各八位,共十六位控制数码管的显示,其中A 口为位选控制,B口为段选控制,直接显示步进电机的转速。

数码管的显示控制对应于下图8图8 数码管对应图3.1.4 8259中断模块中断模块的82598254的信号产生中断,给步进电机,如图9图93.2软件调试中出现的问题及解决措施问题一程序运行中反复执行MOV BX,OFFSET TTABLEL.原因:放在最高的级别的大循环当中,所以会反复执行。

解决方法:引用CX计数,当CX由08H变成00H时,才返回执行MOV BX,OFFSET TTABLEL问题二跳转指令无法达到期望位置,提示错误。

原因:JZ,JNZ指令只能跳转255,而我们程序跳转跳远,超出范围。

解决方法:使用JMP语句,在中间插入,多次跳转,以达到跳转位置附录(源程序)IOY1 EQU 3040H ;片选IOY0对应的端口始地址MY8255_A EQU IOY1+00H*4 ;8255的A口地址MY8255_B EQU IOY1+01H*4 ;8255的B口地址MY8255_C EQU IOY1+02H*4 ;8255的C口地址MY8255_MODE EQU IOY1+03H*4 ;8255的控制寄存器地址IOY2 EQU 3080H ;片选IOY1对应的端口始地址MY8254_COUNT0 EQU IOY2+00H*4 ;8254计数器0端口地址MY8254_COUNT1 EQU IOY2+01H*4 ;8254计数器1端口地址MY8254_COUNT2 EQU IOY2+02H*4 ;8254计数器2端口地址MY8254_MODE EQU IOY2+03H*4 ;8254控制寄存器端口地址INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字IOY0 EQU 3000H ;片选IOY0对应的端口始地址MY8259_ICW1 EQU IOY0+00H ;实验系统中8259的ICW1端口地址MY8259_ICW2 EQU IOY0+04H ;实验系统中8259的ICW2端口地址MY8259_ICW3 EQU IOY0+04H ;实验系统中8259的ICW3端口地址MY8259_ICW4 EQU IOY0+04H ;实验系统中8259的ICW4端口地址MY8259_OCW1 EQU IOY0+04H ;实验系统中8259的OCW1端口地址MY8259_OCW2 EQU IOY0+00H ;实验系统中8259的OCW2端口地址MY8259_OCW3 EQU IOY0+00H ;实验系统中8259的OCW3端口地址STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENTMES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量IM_BAK DB ? ;保存INTR原中断屏蔽字的变量TTABLE1 DB 01H,03H,02H,06H,04H,0CH,08H,09H ;正转编码TTABLE2 DB 09H,08H,0CH,04H,06H,02H,03H,01H ;反转编码FLAG DB 00H ;标志位DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET MES ;显示退出提示MOV AH,09HINT 21HCLIMOV AX,0000H ;替换INTR的中断矢量MOV ES,AXMOV DI,INTR_IVADDMOV AX,ES:[DI]MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址MOV AX,OFFSET MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址ADD DI,2MOV AX,ES:[DI]MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址MOV AX,SEG MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口段地址MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR 的屏蔽位IN AL,DXMOV IM_BAK,AL ;保存INTR原中断屏蔽字AND AL,INTR_IMOUT DX,ALMOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1MOV AL,13H ;边沿触发、单片8259、需要ICW4OUT DX,ALMOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICWMOV AL,08HOUT DX,ALMOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4MOV AL,01H ;非自动结束EOIOUT DX,ALMOV DX,MY8259_OCW3 ;向8259的OCW3发送读取IRR 命令MOV AL,0AHOUT DX,ALMOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1MOV AL,0FEH ;打开IR0的屏蔽位OUT DX,ALSTIMOV DX,MY8255_MODE ;初始化8255工作方式MOV AL,88H ;工作方式0,A口输出,B口输出,C高四位输入,低四位输出OUT DX,ALA:MOV AH,1 ;判断是否有按键按下INT 16HJNZ WAIT1 ;无按键则跳回继续执行,有则退出MOV CX,08H ;计数初值MOV DX,MY8255_CIN AL,DX ;读C口高4位的数据SHR AL,1 ;转向C口的低4位SHR AL,1SHR AL,1SHR AL,1PUSH BXMOV BL,AL ;BL保存AL中的数据MOV BH,BL ;BH中保存AL的数据AND BL,01H ;取开关状态CMP BL,00HJZ A ;如果是0,则跳转到AAND BH,02H ;取正反转状态CMP BH,00HJZ FORWARD ;如果是0,跳正转JNZ BACKWARD ;如果是1,跳反转POP BXFORWARD:MOV BX,OFFSET TTABLE1 ;将的TTABLE1首地址赋给BXJMP B ;跳转到B取速度BACKWARD:MOV BX,OFFSET TTABLE2 ;将的TTABLE2首地址赋给BXJMP B ;跳转到B取速度B: MOV CX,08H ;计数初值MOV FLAG,00H ;中断结束后给FLAG赋值00HMOV DX,MY8255_CIN AL,DX ;读C口数据SHR AL,04H ;将数据左移四位AND AL,0CH ;取高两位MOV AH,AL ;保存AL中的数据AND AL,08H ;取最高位CMP AL,00H ;与00比较JZ CAMP1JNZ CAMP2CAMP1: AND AH,04H ;取第二位CMP AH,00HJZ SPEED1C ;00速度1, 跳SPEED1CJNZ SPEED2C ;01速度2,跳SPEED2C CAMP2: AND AH,04H ;取第二位CMP AH,00HJZ SPEED3C ;10速度3,跳SPEED1CJNZ SPEED4C1 ;11速度4,跳SPEED1C SPEED1C:MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,0B6H ;计数器2,方式3OUT DX,ALMOV DX,MY8254_COUNT2 ;装入计数初值MOV AL,24H ;36分频OUT DX,ALMOV AL,00HOUT DX,ALMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,30H ;计数器0,方式1OUT DX,ALMOV DX,MY8254_COUNT0 ;装入计数初值MOV AL,0FFH ;255OUT DX,ALMOV AL,00HOUT DX,ALJMP SPEED1SPEED2C:MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,0B6H ;计数器2,方式3OUT DX,ALMOV DX,MY8254_COUNT2 ;装入计数初值MOV AL,48H ;72分频OUT DX,ALMOV AL,00HMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;计数器0,方式1OUT DX,ALMOV DX,MY8254_COUNT0 ;装入计数初值MOV AL,0FFH ;255OUT DX,ALMOV AL,00HOUT DX,ALJMP SPEED2A1: JMP ASPEED4C1:JMP SPEED4SPEED3C:MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,0B6H ;计数器2,方式3OUT DX,ALMOV DX,MY8254_COUNT2 ;装入计数初值MOV AL,90H ;144分频OUT DX,ALMOV AL,00HOUT DX,ALMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;计数器0,方式1OUT DX,ALMOV DX,MY8254_COUNT0 ;装入计数初值MOV AL,0FFH ;255OUT DX,ALMOV AL,00HOUT DX,ALJMP SPEED3SPEED4C:MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,0B6H ;计数器2,方式3OUT DX,ALMOV DX,MY8254_COUNT2 ;装入计数初值MOV AL,0FFH ;288分频OUT DX,ALOUT DX,ALMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;计数器0,方式1OUT DX,ALMOV DX,MY8254_COUNT0 ;装入计数初值MOV AL,0FFH ;255OUT DX,ALMOV AL,00HOUT DX,ALJMP SPEED4A2: JMP A1SPEED1:MOV AL,[BX]MOV DX,MY8255_C ;给步进电机输入信号OUT DX,ALDEC CX ;每输入一次信号CX减1CMP CX,00H ;将CX的值与00H比较,如果跳转8次,跳转到A,重新开始扫描按键JZ ACMP FLAG,OOH ;判断是不是已经进入中断,如果进入,跳转到B,如果没有,继续执行LED的显示JNZ BMOV DX,MY8255_AMOV AL,0EFH ;段选3号位OUT DX,ALMOV DX,MY8255_BMOV AL,06H ;显示数字1OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALMOV DX,MY8255_AMOV AL,0F7H ;段选2号位OUT DX,ALMOV DX,MY8255_BMOV AL,5BH ;显示数字2OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALMOV DX,MY8255_AMOV AL,0FBH ;段选1号位OUT DX,ALMOV DX,MY8255_BMOV AL,3FH ;显示数字0OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALJMP A1A3: JMP A2SPEED2:MOV AL,[BX]MOV DX,MY8255_C ;给步进电机输入信号OUT DX,ALDEC CX ;每输入一次信号CX减1CMP CX,00H ;将CX的值与00H比较,如果跳转8次,跳转到A,重新开始扫描按键JZ ACMP FLAG,OOH ;判断是不是已经进入中断,如果进入,跳转到B,如果没有,继续执行LED的显示JNZ BMOV DX,MY8255_AMOV AL,0F7H ;段选2号位OUT DX,ALMOV DX,MY8255_BMOV AL,7DH ;显示数字6OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALMOV DX,MY8255_AMOV AL,0FBH ;段选1号位OUT DX,ALMOV DX,MY8255_BMOV AL,3FH ;显示数字0OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALJMP A2SPEED3:MOV AL,[BX]MOV DX,MY8255_C ;给步进电机输入信号OUT DX,ALDEC CX ;每输入一次信号CX减1CMP CX,00H ;将CX的值与00H比较,如果跳转8次,跳转到A,重新开始扫描按键JZ ACMP FLAG,OOH ;判断是不是已经进入中断,如果进入,跳转到B,如果没有,继续执行LED的显示JNZ BMOV DX,MY8255_AMOV AL,0F7H ;段选2号位OUT DX,ALMOV DX,MY8255_BMOV AL,4FH ;显示数字3OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALMOV DX,MY8255_AMOV AL,0FBH ;段选1号位OUT DX,ALMOV DX,MY8255_BMOV AL,3FH ;显示数字0OUT DX,ALMOV AL,00HOUT DX,ALJMP A3A4: JMP A3SPEED4:MOV AL,[BX]MOV DX,MY8255_COUT DX,ALDEC CX ;每输入一次信号CX减1CMP CX,00H ;将CX的值与C00H比较,如果跳转8次,跳转到A,重新开始扫描按键JZ ACMP FLAG,OOH ;判断是不是已经进入中断,如果进入,跳转到B,如果没有,继续执行LED的显示JNZ BMOV DX,MY8255_AMOV AL,0F7H ;段选2号位OUT DX,ALMOV DX,MY8255_BMOV AL,06H ;显示数字5OUT DX,ALMOV AL,00H ;消除锁存值OUT DX,ALMOV DX,MY8255_AMOV AL,0FBH ;段选1号位OUT DX,ALMOV DX,MY8255_BMOV AL,6DHOUT DX,AL ;显示数字1MOV AL,00HOUT DX,AL ;消除锁存值JMP A4QUIT: CLIMOV AX,0000H ;恢复INTR原中断矢量MOV ES,AXMOV DI,INTR_IVADDMOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址MOV ES:[DI],AXADD DI,2MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址MOV ES:[DI],AXMOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字MOV AL,IM_BAKOUT DX,ALSTIMOV AX,4C00H ;返回到DOSINT 21HMYISR PROC NEAR ;中断处理程序MYISR PUSH AXIR0ISR:MOV AL,30H ;IR0处理,显示字符串STR0 MOV AH,0EHINT 10HMOV AL,20HINT 10HINC BX ;列表向后移一格MOV FLAG,01HJMP OVEROVER: MOV DX,INTR_OCW2 ;向试验箱上8259发送中断结束命令MOV AL,20HOUT DX,ALMOV AL,20H ;向PC机内部8259发送中断结束命令OUT 20H,ALPOP AXIRETMYISR ENDPCODE ENDSEND START。

相关文档
最新文档