电气自动化技术《3.1.2中断程序设计及仿真(C51)》

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

中断程序设计与仿真
一、中断函数
C51编译器支持在C源程序中直接开发中断程序。

中断效劳程序是一个按规定语法格式定义的函数。

中断效劳程序的函数定义格式如下:
返回值函数名([参数]) interrupt m[using n]
{
}
“interrupt m〞是C51函数中非常重要的一个修饰符,是中断函数与其它函数区别的标志。

在C51程序设计中,如果函数定义时使用“inter rupt m〞修饰符,那么在系统编译时,会把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。

在该修饰符中,m的取值为0~31,对应的中断情况如下:
0——外部中断0
1——定时/计数器T0
2——外部中断1
3——定时/计数器T1
4——串行口中断
5——定时/计数器T2
其它值预留。

编写51中断函数注意如下:
〔1〕中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。

〔2〕中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。

〔3〕在任何情况下都不能直接调用中断函数,否那么会产生编译错误。

因为中断函数的返回是由51单片机的RETI指令完成的,RETI 指令影响51单片机的硬件中断系统。

如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。

〔4〕如果在中断函数中调用了其它函数,那么被调用函数所使用
的存放器必须与中断函数相同,否那么会产生不正确的结果。

〔5〕C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。

中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。

如中断函数加using n修饰符,那么在开始将PSW入栈后还要修改PSW中的工作存放器组选择位。

〔6〕C51编译器从绝对地址8m+3处产生一个中断向量,其中m 为中断号,也即interrupt后面的数字。

该向量包含一个到中断函数入口地址的绝对跳转。

〔7〕中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明,以防止其它程序调用。

“using n〞选项用于实现工作存放器组的切换,n是中断效劳子程序中选用的工作存放器组号〔0 ~ 3〕。

在许多情况下,响应中断时需保护有关现场信息,以便中断返回后,能使中断前的源程序从断点处继续正确地执行下去。

这在51单片机中,能很方便地利用工作存放器组的切换来实现。

即在进入中断效劳程序前的程序中使用一组工作存放器,进入中断效劳程序后,由“using n〞切换到另一组存放器,中断返回后又恢复到原存放器组。

这样互相切换的两组存放器中的内容彼此都没有被破坏。

二、中断程序设计
【例1】如图1所示,将P1端口的P1.4~P1.7作为输入,P1.0~P1.3作为输出。

要求将开关S0~S3的状态读入单片机,并通过P1.0~P1.3输出,驱动发光二极管点亮。

现要求采用下降沿触发方式,每中断一次,完成一次读/写操作。

图1 中断应用实例图
编程思路:外部中断请求从0
INT输入,并采用硬件消抖电路。

当开关S闭合时,发出中断请求信号。

当CPU响应中断后,将P1.4~P1.7口线所对应的开关状态读入,并通过P1.0~P1.3输出低电平,使相应的发光二极管就会点亮。

参考程序如下:
#include<reg51.h>
//外部中断0函数
void INT_0() interrupt 0
{
unsigned char state;
EX0=0;
P1=0xff;
state=P1&0xf0;
P1=state>>4;
EX0=1;
}
//主程序
main()
{
EA=1;
IT0=1;
EX0=1;
P1=0xff;
while(1);
}
三、中断程序仿真
1. 程序的编译
在Keil usion4软件中新建工程文件并命名为“Intpt〞,输入上述汇编语言源程序,以“Intpt.C〞为文件名存盘。

单击编译图标,即可生成“Intpt.hex〞文件。

2. Proteus仿真
〔1〕在Proteus仿真环境下画出电路图
电路所需元器件,如表2所示。

按图1给出硬件接线图,可省略晶振电路和复位电路,如图2所示。

表2 元器件清单
元件名类子类参数备注
AT89C51 Microprocessor ICs8051 Family代替A T89S51
RES Resistors Generic 200Ω,10KΩ限流电阻SW-SPST Switches & Relays Switches 4个
SW-SPDT Switches & Relays Switches 1个
LED-RED Optoelectronics LEDs 红色发光二极管
74LS00 TTL 74LS series Gates&Inverters 与非门
〔2〕将编译后的“Intpt.hex〞文件参加Proteus中,进行虚拟仿真。

双击AT89C51单片机芯片,可翻开元件编辑对话框,选取目标代码文件“Intpt.hex〞。

在Proteus仿真界面中的仿真工具栏中单击按钮,全速启动仿真,按相应键观察LED显示状态是否正确。

图2 中断程序仿真电路图。

相关文档
最新文档