微机原理课程基于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。