当前位置:文档之家› 西南科技大学单片机原理实实验四及代码

西南科技大学单片机原理实实验四及代码

2.1实验四中断实验一、实验目的加深对MCS-51单片机中断系统基础知识的理解。

二、实验设备Keil C单片机程序开发软件。

Proteus仿真软件DP51-PROC单片机综合实验仪。

三、实验容和步骤容:利用外部中断输入引脚(以中断方式)控制步进电机的转动。

要求:每产生1次中断,步进电机只能步进1步。

实验程序:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。

设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。

②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。

③步进电机的转动控制由外部中断的服务程序来实现。

④当前步进电机的相位通电状态信息可以使用片RAM中的一个字节单元来存储。

设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1预习:1)编写好实验程序。

2)根据编写的程序和实验步骤的要求制定调试仿真的操作方案。

实验单元电路:1) 步进电机驱动电路。

步进电机共有4相,当以A →B →C →D →A →B …的顺序依次通电时,电机就会正转,若按相反的顺序依次通电,电机就会反转。

每顺序切换一相(1步),电机旋转18°,切换的频率决定电机的转速(切换的频率不能超过电机的最大响应频率)。

根据图2.4中的电路,当BA (插孔)输入为高时,对应的A 相通电。

2) SW 电路开关SW X 拨在下方时,输出端SWX 输出低电平,开关SW X 拨在上方时,输出端SWX 输出高电平。

其中SW1和SW3具备消除抖动电路,这样,SW1或SW3每上下拨动一次,输出端产生单一的正脉冲(上升沿在前,下降沿在后)。

3) LED 和KEY 电路步骤:1) 在S : \ STUDY \ Keil 文件夹中新建Ex04文件夹(该文件夹用于保存本次实验的所有容),通过网上邻居将服务器上本次实验共享文件夹下的所有文件拷贝到S : \ STUDY \ Keil \ Ex04文件夹中。

2) 在Keil C 中创建一个新工程,新工程保存为S : \ STUDY \ Keil \ Ex04\Ex04.uv2,然后选择单片机型号为Generic 中的8051。

3) 设置工程选项,将工程选项设置如下:图2.5 单脉冲电路原理图+5V+5V图2.4 步进电机驱动电路原理图LED1 LED8+5V图2.6 LED 和KEY 电路+5VTarget页夹:Xtal= 12 MHzOutput页夹:Create HEX FileDebug页夹:根据步骤的需要正确设定(参见实验1中步骤5、6、7)BL51 Locate页夹:取消Use Memory Layout from Target Dialog设置Code Range属性为0x40-0xFFF如用C51编程,才需设置此页夹。

4)创建新文件并输入编写的实验程序,然后保存在与工程相同的文件夹中(文件名为Ex04 . ASM或Ex04 . C),最后将其加入到工程中并通过编译。

5)按预习制定的调试方案利用Keil自身的软件仿真功能调试程序,确认实验程序能够运行(操作方法参见实验1中步骤5,此步骤建议在预习时完成)。

6)利用Proteus调试程序,确认实验程序能够实现功能(操作方法参见实验1中步骤6,此步骤建议在预习时完成)。

7)利用实验仪运行程序,观察真实环境的工作现象。

①检查实验仪与计算机之间的通信线连接,然后打开实验仪电源。

②测试实验仪中涉及本次实验的电路是否完好。

I.利用C2区的逻辑笔测试D1区的SW1和SW3信号完好。

操作方法:分别将SW1或SW3连接到C2区的TEST,上下拨动开关,通过观察逻辑笔的指示灯是否正常变化来判别被测信号的完好。

(发现有问题,应马上关闭实验仪电源,然后告知老师解决)II.利用测试程序检测单片机的外部中断和步进电机及其驱动实验电路完好。

图2.7 中断实验连接线路1操作方法:i.关闭实验仪电源,按图2.7连接电路后重新打开实验仪电源。

ii.双击S: \ STUDY \ Keil \ Ex04 \ Test4 \ Test4_0.Uv2文件。

iii.在新窗口中进入调试,然后连续运行程序。

iv.在实验仪上观察连接到P1端口的8个LED是否循环向左或向右依次熄灭,同时观察步进电机的转动情况。

如果发现某个LED常亮或常灭,则意味着P1端口的对应位损坏;如果发现LED不能向右依次熄灭,说明INT1损坏,反之,INT0损坏,此时应向教师示意。

v.测试完成后退出调试,然后关闭这个用于测试的Keil窗口。

vi.连接线路保留(在后面将会使用)。

注意:I.在本次实验中如果发现P1.0 ~ 3有损坏,可用P1其它完好的位替代完成实验(实验程序及其他相关操作都应做出调整)。

II.检测中如果步进电机不转动,说明电机或其驱动电路损坏,实验时仍然可通过观察与P1端口连接的LED的工作情况来推断步进电机的转动情况。

③关闭实验仪电源,按图2.8连接电路(图2.7的电路连线仍然保留)后重新打开实验仪电源。

图2.8 中断实验连接线路2④运行实验程序,观察真实的步进电机转动与开关拨动的关系(操作方法参见实验1中步骤7)。

8)[选作] 观察在真实环境中,由普通按钮开关直接产生中断现象的不同。

操作方法:①关闭实验仪电源,将图2.8中的SW1和SW2分别替换成KEY1和KEY3重新连线,再次打开实验仪电源,用逻辑笔测试KEY1、KEY3信号的完好。

②运行实验程序,分别按动KEY1和KEY3,观察此时步进电机的转动现象(特别是LED的工作情况变化与单脉冲中断时的不同)。

四、实验报告要求1、工整书写实验程序并画出其流程图。

2、叙述步骤6、7中观察到的现象,分析原因。

3、[选作]叙述步骤8中观察到的现象,分析原因。

五、参考实验程序架构(汇编):;资源定义 **************************************;位变量 ********************************;字节变量 ******************************PHASE_OUT EQU 30H ;步进电机相位通电状态VAR_END EQU 30H ;最后一个字节变量的位置,;应根据实际需要修改;堆栈定义 ******************************STACK_INI EQU VAR_END+1 ;须保证足够的空间;程序 ******************************************ORG 0000H ;复位入口LJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 040H ;复位处理程序RESET: MOV SP,#STACK_INI ;设置栈底指针;初始化外部设备 ********************************;中断设置 ******************************;此处添加设置中断触发方式的指令(IT0, IT1);此处添加设置中断许可的指令(EX0, EX1);此处添加设置中断优先的指令(PX0, PX1);初始化变量 ****************************;如果定义了变量, 此处添加对变量的初始化指令;开中断 ********************************SETB EA;主程序 ****************************************MAIN:SJMP MAIN;INT0中断服务程序 **************************INT_EX0:;此处添加保护现场容的指令(如果需要);此处添加正向步进驱动的指令(A→B→C→D→A→B…);此处添加恢复现场容的指令(如果需要)RETI;INT1中断服务程序 **************************INT_EX1:;此处添加保护现场容的指令(如果需要);此处添加反向步进驱动的指令(A→D→C→B→A→D…);此处添加恢复现场容的指令(如果需要)RETI;程序结束 **************************************END代码:/***********************************************************************文件名: Demo_Ex04.C(C51程序框架)功能: 在DP_51PRO实验仪上利用外部中断控制步进电机转动:每中断一次电机步进1步。

***********************************************************************/#include <reg51.h>//全局变量定义unsigned char bPhaseOut; // 步进电机相位通电状态/************************************************************************* 函数名称: main()** 入口参数: 无** 出口参数: 无***********************************************************************/void main(void){TCON = 0x00;IT1 = 1;IT0 = 1; //下降沿触发中断IE = 0x00;EX0 = 1;EX1 = 1;//允许外部中断IP = 0x00; //中断优先级(设置低级):INT0高于INT1bPhaseOut = 1 << 3;EA = 1; //总中断while( 1 ); // 等待}typedef unsigned int uint;typedef unsigned char uchar;void delay1ms(uint p)//12mhz{uchar j;uint i;for(i=0;i<p;i++)for(j=0;j<124;j++);}void INT_INT0(void) interrupt 0 using 1{P1 = bPhaseOut;bPhaseOut >>= 1;if(!bPhaseOut)bPhaseOut = 0x80;// P3 &= (1<<2);// delay1ms(10);// P3 |= 1<<2;// delay1ms(10);// P3 &= (1<<2);// delay1ms(10);// P3 |= 1<<2;delay1ms(10);//INT0 = 1;}void INT_INT1(void) interrupt 2 using 1 {P1 = bPhaseOut;bPhaseOut <<= 1;if(!bPhaseOut)bPhaseOut = 1;//P3 &= ~(1 << 3);delay1ms(10);}。

相关主题