网站大量收购闲置独家精品文档,联系QQ:2885784924

单片机原理与应用设计(C51编程+Proteus仿真)(第4版)课件 张毅刚 第5章 开关、键盘与显示接口设计;第6章 中断系统;第7章 定时器计数器.ppt

单片机原理与应用设计(C51编程+Proteus仿真)(第4版)课件 张毅刚 第5章 开关、键盘与显示接口设计;第6章 中断系统;第7章 定时器计数器.ppt

  1. 1、本文档共276页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

因为响应串口中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位来判定,然后才清除。所以串口中断请求撤销只能使用软件在中断服务程序中把串行口中断标志位TI、RI清0。6.8中断函数为直接使用C51编写中断服务程序,C51中定义了中断函数。由于C51编译器在编译时对声明为中断服务程序的函数自动添加相应现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小编写中断服务程序烦琐程度。中断服务函数的一般形式为:函数类型函数名(形式参数表)interruptnusingn关键字interrupt后面的n是中断号,对于8051单片机,n的取值为0~4,编译器从8×n+3处产生中断向量。AT89S51中断源对应的中断号和中断向量见表6-3。AT89S51内部RAM中可使用4个工作寄存器区,每个工作寄存器区包含8个工作寄存器(R0~R7)。关键字using后面的n用来选择4个工作寄存器区。using是一选项,如不选,中断函数中的所有工作寄存器内容将被保存到堆栈中。表6-3AT89S51单片机的中断号和中断向量中断号n中断源中断向量(8*n+3)0外部中断00003H1定时/计数器T0000BH2外部中断10013H3定时/计数器T1001BH4串行口0023H其他值保留8*n+3关键字using对函数目标代码的影响如下:在中断函数的入口处将当前工作寄存器区内容保护到堆栈中,函数返回前将被保护的寄存器区内容从堆栈中恢复。使用using在函数中确定一个工作寄存器区须十分小心,要保证任何工作寄存器区的切换都只在指定的控制区域中发生,否则将产生不正确的函数结果。例如,外中断1()中断服务函数如下:voidint1()interrupt2using0 //中断号n=2,选择0区工作寄存器区中断调用与标准C的函数调用是不一样的,当中断事件发生后,对应的中断函数被自动调用,即没有参数,也没有返回值,会带来如下影响。(1)编译器会为中断函数自动生成中断向量。(2)退出中断函数时,所有保存在堆栈中的工作寄存器及特殊功能寄存器被恢复。(3)在必要时特殊功能寄存器Acc、B、DPH、DPL以及PSW的内容被保存到堆栈中。编写中断程序,应遵循以下规则:(1)中断函数没有返回值,如果定义一个返回值,将会得到不正确结果。建议将中断函数定义为void类型,明确说明无返回值。(2)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(3)任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由汇编语言指令RETI完成的。RETI指令会影响AT89S51硬件中断系统内的不可寻址的中断优先级寄存器的状态。如没有实际中断请求情况下,直接调用中断函数,也就不会执行RETI指令,其操作结果有可能产生一个致命错误。(4)如在中断函数中再调用其他函数,则被调用的函数所用的寄存器区必须与中断函数使用的寄存器区不同。6.9中断系统的应用本节通过几个例程介绍有关中断应用程序的编写。6.9.1单一外中断的应用【例6-1】在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。原理电路及仿真结果见图6-9。图6-9利用中断控制8只LED交替闪烁1次的电路参考程序如下:#includereg51.h#defineucharunsignedcharvoidDelay(unsignedinti) //延时函数Delay(),i形式参数,不能赋初值{ unsignedintj; for(;i0;i--) for(j=0;j333;j++)//晶振为12MHz,j选择与晶振频率有关 {;} //空函数}voidmain() //主函数{ EA=1; //总中断允许 EX0=1; //允许外部中断0中断 IT0=1; /

您可能关注的文档

文档评论(0)

xiaobao + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档