项目8手控信号灯控制.ppt
项目8 手控信号灯控制,主要内容中断的基本概念和功能。中断系统的结构和控制方式。中断系统的中断处理过程。用C51编写控制程序的基本方法。用Proteus实现单片机控制信号灯的仿真。用Keil软件进行单片机控制程序的调试。,项目8 手控信号灯控制,学习目标了解中断的基本概念和功能。理解中断系统的中断处理过程。掌握中断系统的结构和控制方式。掌握中断系统的初始化步骤。掌握用C51编写控制程序的基本方法。掌握用中断系统实现手控信号灯控制的方法。,项目8 手控信号灯控制,主要操作实例用外部中断方式控制信号灯,项目8 手控信号灯控制,教学重点和难点中断系统结构与控制方式中断系统的初始化步骤用C51编写控制程序教学方法讲授法、演示法教学学时6课时,项目8 手控信号灯控制 8.0 复习 8.1 项目引入 8.2 MCS-51中断系统 8.3 单片机的C语言程序设计,8.0 复习,汇编语言程序具有顺序结构、循环结构、分支结构和子程序结构四种结构形式。实际的应用程序一般都由一个主程序和多个子程序构成,即采用模块化的程序设计方法。,8.0 复习习 题,1.程序设计语言有哪几类?各有什么特点?2.汇编语言有哪两类语句?各有什么特点?3.汇编语言源程序有哪两类汇编?各采用什么方法来实现?4.汇编语言程序设计一般分哪几个步骤?5.有两个4位十六进制数分别存放在片内RAM 20H、21H单元和30H、31H单元内,请编程求它们的和,并将和存放到片内RAM 40H、41H单元。6.有一个16位二进制负数的原码存放在片内RAM 60H、61H单元内,请编程求它的补码,并将它存放到片内RAM 70H、71H单元。7.片内RAM中存放有20个数据,首地址为40H,请编程将数据块传送到片外RAM以50H为首地址的存储单元中。8.片外RAM中存放有20个数据,首地址为40H,请编程将数据块传送到片外RAM以5000H为首地址的存储单元中,同时将片外RAM以40H为首地址的20个存储单元中的内容全部清零。9.片内RAM区30H34H单元中存放有5个十六进制数,请编程计算这5个数的算术平均值,结果存放到片内RAM区35H单元中。10.请分别编写延时1 min、1 h的子程序,晶振频率12MHz。,11.自变量X为一无符号数,存放在片内RAM区30H单元,函数Y存放在31H单元。请编写满足如下关系的程序:X95时,Y=1;95X105时,Y=2;X105时,Y=3。12.在片内RAM区从30H单元开始存放了50个数据,请编程找出某一关键值并将该值在片内RAM区存储单元的地址存放到片内RAM区70H单元中。13.编写双字节无符号数加法子程序。14.编写双字节无符号数减法子程序。,8.0 复习习 题,实训 手控信号灯的控制 1实训目的(1)利用单片机的中断控制系统,实现对信号灯的复杂控制。(2)通过程序调试,学会外部中断的使用。(3)通过中断程序调试,熟练掌握中断的基本概念及相应控制方式。2实训设备与环境(1)实训设备:微机。(2)实训环境:proteus、keil。,8.1 项目引入,3.实训要求要求:P1口做输出口控制八只信号灯依次循环点亮,时间间隔为1s。利用按钮产生外部中断信号,改变八只信号灯的控制规律。晶振频率6MHz。(1)从外部中断0请求输入端(P3.2)输入中断请求信号从右向左循环点亮两只信号灯。(2)从外部中断1请求输入端(P3.3)输入中断请求信号从左向右循环点亮两只信号灯。2)方法:用外部中断控制方式编制主控程序,实现对信号灯的控制。系统采用6MHz晶振,采用软件延时方式,延时1s。,8.1 项目引入,4.实验参考电路,P1口做输出口接发光二极管的阴极,P1口的管脚输出低电平时对应的发光二极管点亮。两只按钮分别接P3.2和P3.3。按钮输出下降沿有效。实验电路图如图8-1所示。,图8-1 手控信号灯控制实验电路,5.参考源程序,#include#include void delay(void);void main()EA=1;EX0=1;EX1=1;PX1=1;IT0=1;IT1=1;P1=0 xFE;dodelay();P1=_crol_(P1,1);while(1);,C参考代码:,void service_int0()interrupt 0 using 1 unsigned char x,z1;z1=P1;P1=0 xFC;for(x=0;x7;x+)delay();P1=_crol_(P1,1);P1=z1;,void service_int1()interrupt 2 using 1 unsigned char y,z2;z2=P1;P1=0 x3F;for(y=0;y7;y+)delay();P1=_cror_(P1,1);P1=z2;,void delay()#pragma asm MOV R3,#10 L1:MOV R5,#200 L2:MOV R6,#123 NOP L3:DJNZ R6,L3 DJNZ R5,L2 DJNZ R3,L1#pragma endasm,6 实训总结与分析本项目和项目3相比,硬件电路基本一致,效果相似,但二者软件的编制方法不同。后者采用查询方式实现对信号灯的不同控制;前者采用中断方式,提高了CPU的工作效率,更有利于精确实时控制。二者工作机理不同,设置方式也不同,相比之下外部中断方式无论是方便程度还是精确程度都高于查询方式。,一、概述1、什么叫中断?举例:某同学正在教室写作业,忽然被人叫出去,回来后,继续写作业。这就是生活中中断的例子。与上对比,单片机中也有同样的问题。CPU正在执行原程序,突然,被意外事情打断,转去执行新程序。CPU执行新程序结束后,又回到原程序中继续执行。这样的过程就叫中断。,8.2 MCS-51 中 断 系 统,MCS-51单片机的中断系统,执行主程序,主程序,继续执行主程序,断点,中断请求,中断响应,执行中断处理程序,中断返回,引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。,“中断”之后所执行的相应的处理程序通常称之为中断服务或中断处理子程序,原来正常运行的程序称为主程序。主程序被断开的位置(或地址)称为“断点”。引起中断的原因,或能发出中断申请的来源,称为“中断源”。中断源要求服务的请求称为“中断请求”(或中断申请)。,调用中断服务程序的过程类似于调用子程序,其区别在于调用子程序在程序中是事先安排好的,而何时调用中断服务程序事先却无法确定,因为“中断”的发生是由外部因素决定的,程序中无法事先安排调用指令,因此,调用中断服务程序的过程是由硬件自动完成的。,2中断的特点1)分时操作 中断可以解决快速的CPU与慢速的外设之间的矛盾,使CPU和外设同时工作。CPU在启动外设工作后继续执行主程序,同时外设也在工作。每当外设做完一件事就发出中断申请,请求CPU中断它正在执行的程序,转去执行中断服务程序中断处理完之后,CPU恢复执行主程序,外设也继续工作。这样,CPU可启动多个外设同时工作,大大地提高了CPU的效率。,2)实时处理 在实时控制中,现场的各种参数、信息均随时间和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请,请求CPU及时处理中断请求。如中断条件满足,CPU马上就会响应,进行相应的处理,从而实现实时处理。3)故障处理 针对难以预料的情况或故障,如掉电、存储出错、运算溢出等,可通过中断系统由故障源向CPU发出中断请求,再由CPU转到相应的故障处理程序进行处理。,对突发事故,做出紧急处理。根据现场随时变化的各种参数、信息,做出实时监控。CPU与外部设备并行工作,以中断方式相联系,提高工作效率。解决快速CPU与慢速外设之间的矛盾。在多项外部设备同时提出中断请求情况下,CPU能根据轻重缓急响应外设的中断请求。,由中断的特点可知其作用有:,3.中断源 通常,计算机的中断源有如下几种:(1)一般的输入/输出设备。如键盘、打印机等,它们通过接口电路向CPU发出中断请求。(2)实时时钟及外界计数信号。如定时时间或计数次数一到,在中断允许时,由硬件则向CPU发出中断请求。(3)故障源。当采样或运算结果溢出或系统掉电时,可通过报警、掉电等信号向CPU发出中断请求。,(4)为调试程序而设置的中断源。调试程序时,为检查中间结果或寻找问题所在,往往要求设置断点或进行单步工作(一次执行一条指令),这些人为设置的中断源的申请与响应均由中断系统来实现。MCS-51的5个中断源详述如下:(1):外部中断0请求,由P3.2脚输入。通过IT0脚(TCON.0)来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向CPU申请中断,并建立IE0标志。(2):外部中断1请求,由P3.3脚输入。通过IT1脚TCON.2)来决定是低电平有效还是下跳变有效。一旦输入信号有效,就向CPU申请中断,并建立IE1标志。,(3)TF0:定时器T0溢出中断请求。当定时器0产生溢出时,定时器0中断请求标志位(TCON.5)置位(由硬件自动执行),请求中断处理。(4)TF1:定时器1溢出中断请求。当定时器1产生溢出时,定时器1中断请求标志位(TCON.7)置位(由硬件自动执行),请求中断处理。(5)RI或TI:串行中断请求。当接收或发送完一串行帧时,内部串行口中断请求标志位RI(SCON.0)或TI(SCON.1)置位(由硬件自动执行),请求中断。,中断源的中断请求,如何通知CPU?,利用中断请求标志位来通知!,由图可知,与中断有关的寄存器有4个,分别为中断源寄存器TCON和SCON、中断允许控制寄存器IE和中断优先级控制寄存器IP;中断源有5个,分别为外部中断0请求、外部中断1请求、定时器0溢出中断请求TF0、定时器1溢出中断请求TF1和串行中断请求RI或TI。5个中断源的排列顺序由中断优先级控制寄存器IP和顺序查询逻辑电路共同决定,5个中断源分别对应5个固定的中断入口地址。,二、中断控制,对于MCS-51单片机中断系统的组成可以用一句话来讲,叫做:“五源中断,两级管理”,五个中断源:入口地址 外部中断0(/INT0)0003H T0溢出中断 000BH 外部中断1(/INT1)0013H T1溢出中断 001BH 串口中断 0023H,中断请求源(“五源中断”),TCON,1、中断源请求标志位(1)定时器控制寄存器,TCON为定时器T0和定时器T1的控制寄存器,同时也锁存定时器T0和定时器T1的溢出中断标志及外部中断0和1的中断标志等。与中断有关位如下:(1)TCON.7 TF1:定时器1的溢出中断标志。T1被启动计数后,从初值做加1计数,计满溢出后由硬件置位TF1,同时向CPU发出中断请求,此标志一直保持到CPU响应中断后才由硬件自动清0。也可由软件查询该标志,并由软件清0。,SCON,SCON是串行口控制寄存器,其低两位TI和RI锁存串行口的发送中断标志和接收中断标志。,(2)串行口控制寄存器SCON,在中断源与CPU之间有二级中断允许控制逻辑电路,类似开关,其中第一级为一个总开关,第二级为五个分开关,由IE控制。,2、中断允许控制,IE,(1)IE.7 EA:总中断允许控制位。EA=1,开放所有中断,各中断源的允许和禁止可通过相应的中断允许位单独加以控制;EA=0,禁止所有中断。(2)IE.4 ES:串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。(3)IE.3 ET1:定时器1中断允许位。ET1=1,允许定时器1中断;ET1=0,禁止定时器1中断。,若为“1”,开关接通,允许例如 SETB EA若为“0”,开关断开,不允许例如 CLR IE.7,(4)IE.2 EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。(5)IE.1 ET0:定时器0中断允许位。ET0=1,允许定时器0中断;ET0=0,禁止定时器0中断。,3、中断优先级,P S 串口的中断优先级别PT1 定时/计数器T1的中断优先级别PX1 外部中断1 的中断优先级别PT0 定时/计数器T0的中断优先级别PX0 外部中断0 的中断优先级别,该位是“1”时,为高级优先级该位是“0”时,为低级优先级,为什么要有中断优先级?,实训中用到中断,优先级设定采用的是自然优先级,因为其有两个中断源,有必要考虑优先级的问题。如果程序中没有中断优先级设置指令,则中断源按自然优先级进行排列。实际应用中常把IP寄存器和自然优先级相结合,使中断的使用更加方便、灵活。,如果几个同一优先级的中断源同时向CPU申请中断,CPU 通过内部硬件查询逻辑,按自然优先级顺序确定先响应哪个中断请求。自然优先级由硬件形成,排列如下:,同一级中的5个中断源的优先顺序是:,中断优先原则:(概括为四句话)1、低级不打断高级2、高级不睬低级3、同级不能打断4、同级、同时中断,事先约定。,实现中断嵌套 当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。,四、中断处理过程,中断处理过程可分为中断响应、中断处理和中断返回三个阶段。不同的计算机因其中断系统的硬件结构不同,因此,中断响应的方式也有所不同。这里,仅以8051单片机为例进行叙述。1.中断响应 中断响应是CPU对中断源中断请求的响应,包括保护断点和将程序转向中断服务程序的入口地址(通常称矢量地址)。CPU并非任何时刻都响应中断请求,而是在中断响应条件满足之后才会响应。,(1)中断响应条件 CPU响应中断的条件有:a有中断源发出中断请求。b中断总允许位EA=1。c申请中断的中断源允许。满足以上基本条件,CPU一般会响应中断,但若有下列任何一种情况存在,则中断响应会受到阻断。,(1)CPU正处理相同级别或更高级别的中断;(2)正在执行指令,还未到最后一个机器周期;(3)正在执行的指令是RETI或访问IP、IE指令,则执行完上述指令后,再执行一条指令后,才会响应新中断。,若存在上述任何一种情况,中断查询结果即被取消,CPU不响应中断请求而在下一机器周期继续查询,否则,CPU在下一机器周期响应中断。,2)中断响应过程 中断响应过程包括保护断点和将程序转向中断服务程序的入口地址。首先,中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护(不保护累加器A、状态寄存器PSW和其它寄存器的内容),然后,将对应的中断入口地址装入程序计数器PC(由硬件自动执行),使程序转向该中断入口地址,执行中断服务程序。MCS-51系列单片机各中断源的入口地址由硬件事先设定,分配如下:,中断源 入口地址外部中断0 0003H定时器T0中断 000BH 外部中断1 0013H 定时器T1中断 001BH 串行口中断 0023H 使用时,通常在这些中断入口地址处存放一条绝对跳转指令,使程序跳转到用户安排的中断服务程序的起始地址上去。,实训中采用外部中断0和1中断,其中断入口地址为0003H和0013H,中断服务程序名为INT00和INT11,因此,指令形式为:ORG 0003H;外部中断0中断入口 AJMP INT00;转向中断服务程序ORG 0013H;外部中断0中断入口 AJMP INT11;转向中断服务程序2中断处理中断处理就是执行中断服务程序。中断服务程序从中断入口地址开始执行,到返回指令“RETI”为止,一般包括两部分内容,一是保护现场,二是完成中断源请求的服务。,通常,主程序和中断服务程序都会用到累加器A、状态寄存器PSW及其它一些寄存器,当CPU进入中断服务程序用到上述寄存器时,会破坏原来存储在寄存器中的内容,一旦中断返回,将会导致主程序的混乱,因此,在进入中断服务程序后,一般要先保护现场,然后,执行中断处理程序,在中断返回之前再恢复现场。,编写中断服务程序时还需注意以下几点:(1)各中断源的中断入口地址之间只相隔8个字节,容纳不下普通的中断服务程序,因此,在中断入口地址单元通常存放一条无条件转移指令,可将中断服务程序转至存储器的其它任何空间。,(2)若要在执行当前中断程序时禁止其它更高优先级中断,需先用软件关闭CPU中断,或用软件禁止相应高优先级的中断,在中断返回前再开放中断。(3)在保护和恢复现场时,为了不使现场数据遭到破坏或造成混乱,一般规定此时CPU不再响应新的中断请求。因此,在编写中断服务程序时,要注意在保护现场前关中断,在保护现场后若允许高优先级中断,则应开中断。同样,在恢复现场前也应先关中断,恢复之后再开中断。实训中的中断服务程序与主程序共用累加器,所以,须保护现场,在程序中有保护和恢复现场的指令。,小结一下:响应过程:(假设已使某中断请求标志置1)(1)先使相应优先级状态触发器置1;(2)执行一个硬件子程序的调用;1)硬件清零相应中断请求标志(TI、RI除外)2)将当前PC内容压入堆栈保护断点;3)将中断服务子程序入口地址送PC转移。,返回过程:(RETI执行后)(1)使相应优先级状态触发器清0。(2)从堆栈中弹出栈顶的两个字节内容送PC恢复断点。(3)CPU接着中断处继续执行原程序。,3中断返回 中断返回是指中断服务完后,计算机返回原来断开的位置(即断点),继续执行原来的程序。中断返回由中断返回指令RETI来实现。该指令的功能是把断点地址从堆栈中弹出,送回到程序计数器PC,此外,还通知中断系统已完成中断处理,并同时清除优先级状态触发器。特别要注意不能用“RET”指令代替“RETI”指令。中断处理过程如图8-2所示。,图8-2 中断处理过程流程图,4中断请求的撤除 CPU响应中断请求后即进入中断服务程序,在中断返回前,应撤除该中断请求,否则,会重复引起中断而导致错误。MCS-51各中断源中断请求撤消的方法各不相同,分别为:1)定时器中断请求的撤除 对于定时器0或1溢出中断,CPU在响应中断后即由硬件自动清除其中断标志位TF0或TF1,无需采取其它措施。,2)串行口中断请求的撤除 对于串行口中断,CPU在响应中断后,硬件不能自动清除中断请求标志位TI、RI,必须在中断服务程序中用软件将其清除。3)外部中断请求的撤除 外部中断可分为边沿触发型和电平触发型。对于边沿触发的外部中断0或1,CPU在响应中断后由硬件自动清除其中断标志位IE0或IE1,无需采取其它措施。,对于电平触发的外部中断,其中断请求撤除方法较复杂。因为对于电平触发外中断,CPU在响应中断后,硬件不会自动清除其中断请求标志位IE0或IE1,同时,也不能用软件将其清除,所以,在CPU响应中断后,应立即撤除或引脚上的低电平。否则,就会引起重复中断而导致错误。而CPU又不能控制或引脚的信号,因此,只有通过硬件再配合相应软件才能解决这个问题。图8-3是可行方案之一。,图8-3 撤除外部中断请求的电路,由图可知,外部中断请求信号不直接加 或 引脚上,而是加在D触发器的CLK端。由于D端接地,当外部中断请求的正脉冲信号出现在CLK端时,Q端输出为0,或 为低,外部中断向单片机发出中断请求。利用P1口的P1.0作为应答线,当CPU响应中断后,可在中断服务程序中采用两条指令:ANL P1,#0FEH ORLP1,#01H,来撤除外部中断请求。第一条指令使P1.0为0,因P1.0与D触发器的异步置1端SD相连,Q端输出为1,从而撤除中断请求。第二条指令使P1.0变为1,=1,Q继续受CLK控制,即新的外部中断请求信号又能向单片机申请中断。第二条指令是必不可少的,否则,将无法再次形成新的外部中断。实训中采用外部中断,其中断请求的撤除由硬件自动完成,无须采取其它措施。,5中断响应时间 中断响应时间是指从中断请求标志位置位到CPU开始执行中断服务程序的第一条指令所持续的时间。CPU并非每时每刻对中断请求都予以响应,另外,不同的中断请求其响应时间也是不同的,因此,中断响应时间形成的过程较为复杂。以外部中断为例,CPU在每个机器周期的S5P2期间采样其输入引脚 或 端的电平,如果中断请求有效,则置位中断请求标志位IE0或IE1,然后在下一个机器周期再对这些值进行查询,这就意味着中断请求信号的低电平至少应维持一个机器周期。,这时,如果满足中断响应条件,则CPU响应中断请求,在下一个机器周期执行一条硬件长调用指令“LACLL”,使程序转入中断矢量入口。该调用指令执行时间是两个机器周期,因此,外部中断响应时间至少需要3个机器周期,这是最短的中断响应时间。如果中断请求不能满足前面所述的三个条件而被阻断,则中断响应时间将延长。例如一个同级或更高级的中断正在进行,则附加的等待时间取决于正在进行的中断服务程序的长度。如果正在执行的一条指令还没有进行到最后一个机器周期,则附加的等待时间为1 3个机器周期(因为一条指令的最长执行时间为4个机器周期)。,五、外部中断源的扩展 8051单片机仅有两个外部中断请求输入端和,在实际应用中,若外部中断源超过两个,则需扩充外部中断源,这里介绍两种简单可行的方法。1用定时器作外部中断源 MCS-51单片机有两个定时器,具有两个内中断标志和外计数引脚,如在某些应用中不被使用,则它们的中断可作为外部中断请求使用。此时,可将定时器设置成计数方式,计数初值可设为满量程,则它们的计数输入端T0(P3.4)或T1(P3.5)引脚上发生负跳变时,计数器加1便产生溢出中断。利用此特性,可把T0脚或T1脚作为外部中断请求输入线,而计数器的溢出中断作为外部中断请求标志。,例 将定时器T0扩展为外部中断源。解:将定时器T0设定为方式2(自动恢复计数初值),TH0和TF0的初值均设置为FFH,允许T0中断,CPU开放中断,源程序如下:MOVTMOD,#06HMOVTH0,#0FFHMOVTL0,#0FFHSETBTR0SETBET0SETBEA,当连接在T0(P3.4)引脚的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0置1,向CPU发出中断申请,同时,TH0的内容自动送至TL0使TL0恢复初值。这样,T0引脚每输入一个负跳变,TF0都会置1,向CPU请求中断,此时,T0脚相当于边沿触发的外部中断源输入线。同样,也可将定时器T1扩展为外部中断源。2中断和查询相结合 利用两根外部中断输入线(和脚),每一中断输入线可以通过线或的关系连接多个外部中断源,同时,利用并行输入端口线作为多个中断源的识别线,其电路原理图如图8-4所示。,图8-4 一个外中断扩展成多个外中断的原理图,由图可知,4个外部扩展中断源通过4个OC门电路组成线或后再与(P3.2)相连,4个外部扩展中断源EXINT0 EXINT3中有一个或几个出现高电平则输出为0,使脚为低电平,从而发出中断请求,因此,这些扩充的外部中断源都是电平触发方式(高电平有效)。CPU执行中断服务程序时,先依次查询P1口的中断源输入状态,然后,转入到相应的中断服务程序,4个扩展中断源的优先级顺序由软件查询顺序决定,即最先查询的优先级最高,最后查询的优先级最低。,中断服务程序如下:ORG0003H;外部中断0入口 AJMPINT0;转向中断服务程序入口 INT0:PUSHPSW;保护现场 PUSHACC JNB P1.0,EXT0;中断源查询并转相应中断服务程序,JNBP1.1,EXT1 JNBP1.2,EXT2 JNBP1.3,EXT3EXIT:POPACC;恢复现场 POPPSW RETI EXT0:;EXINT0中断服务程序 AJMPEXIT,EXT2:;EXINT2中断服务程序AJMPEXIT EXT3:;EXINT3中断服务程序 AJMP EXIT 同样,外部中断1也可作相应的扩展。,8.4 单片机的C语言程序设计,8.4.1 概述 8.4.2 C51程序设计的基本语法8.4.3 C51程序设计的基本语句8.4.4 应用实例,8.4.1 概述,ANSI C标准的关键字(32个)存储种类声明 auto const extern register static 数据种类声明 char double enum float int long short signed struct typedef union unsigned void volatile程序语句 break case continue default do else for goto if return switch while运算符 sizeof,8.4.1 概述,Keil Cx51编译器的扩展关键字(20个)存储器种类声明 DATA BDATA IDATA PDATA XDATA CODE存储器声明 SMALL COMPACT LARGE 位变量声明 bit sbit特殊功能寄存器声明 sfr sfr16寄存器组定义 using中断函数声明 interrupt再入函数声明 reentrant函数特性声明 alien多任务优先声明 _priority_任务声明 _task_地址定位 _at_,8.4.2 C51程序设计的基本语法,基本数据类型字符型charsigned char-128+127unsigned char0255整型intshort与int相同signed int-32768+32767unsigned int065535长整型longsigned long-2147483648+2147483647unsigned long 04294967295浮点型floatdouble与float相同指针型,8.4.2 C51程序设计的基本语法,扩充数据类型位类型bit0或1特殊功能寄存器sfr 025516位特殊功能寄存器sfr16 065535可寻址位sbit 0或1隐式转换字节少的类型向字节多的类型转换bit char int long floatsigned unsigned,8.4.2 C51程序设计的基本语法,常量整型常量十进制整数、十六进制整数、长整数浮点型常量十进制数表示形式、指数表示形式字符型常量单引号、反斜杠字符串型常量双引号,8.4.2 C51程序设计的基本语法,变量及其存储模式变量的定义格式储存种类 数据类型 存储器类型 变量名表;储存种类自动auto外部extern静态static寄存器register,8.4.2 C51程序设计的基本语法,变量及其存储模式存储器类型DATA直接寻址的片内RAM(128B)BDATA位寻址区(16B)IDATA间接寻址的片内RAM(256B)PDATA分页寻址的片外RAM(256B)XDATA片外RAM(64KB)CODEROM(64KB),8.4.2 C51程序设计的基本语法,变量及其存储模式存储模式SMALL变量被定义在片内RAMCOMPACT变量被定义在分页寻址的片外RAM、堆栈位于片内RAMLARGE变量被定义在片外RAM,8.4.2 C51程序设计的基本语法,变量的定义从变量的作用范围分全局变量、局部变量从变量的存在时间分静态存储变量、动态存储变量一般,全局变量为静态存储变量、局部变量为动态存储变量,8.4.2 C51程序设计的基本语法,运算符与表达式赋值运算符=算术运算符+-*/%增量和减量运算符+-关系运算符=&|复合赋值运算符+=-=*=/=%=&=|=,8.4.2 C51程序设计的基本语法,运算符与表达式逗号运算符,条件运算符?:指针和地址运算符*&强制类型转换运算符()sizeof运算符 sizeof,8.4.3 C51程序设计的基本语句,表达式语句表达式;空语句;循环语句后加分号 While();,8.4.3 C51程序设计的基本语句,复合语句语句1;语句2;语句3;语句n;复合语句允许嵌套复合语句内定义的变量为局部变量,8.4.3 C51程序设计的基本语句,条件语句分支语句if(条件表达式)语句;if(条件表达式)语句1 else 语句2;if(条件表达式1)语句1 else if(条件表达式2)语句2;else if(条件表达式3)语句3;else if(条件表达式n)语句m;else 语句n;,8.4.3 C51程序设计的基本语句,开关语句多分支语句switch(表达式)case 常量表达式1:语句1 break;case 常量表达式2:语句2 break;case 常量表达式n:语句n break;deflault:语句d,8.4.3 C51程序设计的基本语句,循环语句while(条件表达式)语句;do 语句 while(条件表达式);for(初值设定表达式;循环条件表达式;更新表达式)语句goto 语句标号;,8.4.3 C51程序设计的基本语句,返回语句return(表达式);return;一个函数内可以有多个return语句,也可以没有return语句。,应用实例,Vision2的函数reg51.hintrins.h_crol_(unsigned char c,unsigned char b)左循环_cror_(unsigned char c,unsigned char b)右循环预处理命令#pragma asm#pragma endasm,应用实例,中断服务函数函数类型 函数名(形式参数)interrupt n using n中断号n取值:0、1、2、3、4寄存器组号n取值:0、1、2、3进入中断函数时,以下SFR保存入栈ACC、B、DPH、DPL、PSW若不使用using,中断函数中用到的全部工作寄存器都保存入栈,应用实例,P1口做输出口控制八只信号灯依次循环点亮,利用按钮产生外部中断信号,改变八只信号灯的控制规律。晶振频率6MHz。控制要求如下:(1)从外部中断0请求输入端(P3.2)输入中断请求信号从右向左循环点亮两只信号灯。(2)从外部中断1请求输入端(P3.3)输入中断请求信号从左向右循环点亮两只信号灯解:开关1的低电平脉冲信号作为外部中断信号由INT0(P3.2)管脚输入,开关2的低电平信号作为外部中断信号由INT1(P3.3)管脚输入。中断允许寄存器IE中相应的EA、EX1、EX0位设置为1。外部中断0为低优先级,IP中的PX0位设置为0;外部中断1为高优先级,IP中的PX1位设置为1。外部中断0的中断触发方式设为边沿触发,控制位IT0应设置为1;外部中断1的中断触发方式设为边沿触发,控制位IT1应设置为1。,应用实例,#include#include void delay(void);void main()EA=1;EX0=1;EX1=1;PX1=1;IT0=1;IT1=1;P1=0 xFE;dodelay();P1=_crol_(P1,1);while(1);,应用实例,void service_int0()interrupt 0 using 1 unsigned char x,z1;z1=P1;P1=0 xFC;for(x=0;x7;x+)delay();P1=_crol_(P1,1);P1=z1;,应用实例,void service_int1()interrupt 2 using 1 unsigned char y,z2;z2=P1;P1=0 x3F;for(y=0;y7;y+)delay();P1=_cror_(P1,1);P1=z2;,应用实例,void delay()#pragma asm MOV R3,#10 L1:MOV R5,#200 L2:MOV R6,#123 NOP L3:DJNZ R6,L3 DJNZ R5,L2 DJNZ R3,L1#pragma endasm,项目小结,1、MCS-51单片机中断系统有几个中断源?分别是什么?事先约定的优先顺序是怎样的?2、如何进行中断允许控制?如何进行中断优先级控制?3、中断优先的规则是什么?,理论作业,P1312、3、6,