控制/MCU
8051的CPU在每个机器周期期间,顺序采样每个中断源,CPU在下一个机器周期按优先级顺序查询中断标志,如查询到某个中断标志为1,将在下一个机器周期期间按优先级来进行中断处理。在下列任一种情况存在时,中断申请将被封锁。
1、CPU正在执一个同级或高级的中断服务程序2、当前机器周期不是当前指令周期的最后一个机器周期,即要保证把当前指令执行完。
CPU响应中断, 由硬件自动将相应的中断矢量地址装入程序程序计数器PC,转入该中断服务程序进行处理。
对于有些中断源,CPU在响应中断后会自动清除中断标志,如定时器溢出标志TF0,TF1,以及部中断标志IE0,IE1。
而有些中断标志,不会自动清除,只能由用户用户软件清除,如串行口接收发送中断标志RI,T1。CPU执行中断服务程序之前,自动将程序计数器PC内容压入堆栈保护,然后将对应的中断矢量装入程序计数器PC,使程序转向该中断矢量地址单元中,以执行中断服务程序,中断服务程序从矢量地址开始执行,一直到返回指令“RETI”为止。“RETI”指令的操作,一方面告诉中断系统中断服务程序以执行完毕,另一方面把原来压入堆栈保护的断电地址从栈顶弹出,装入程序计数器PC,使程序返回被中断的程序断点处,以便继续执行。
外部中断响应时间外部中断INT0和INT1的电平在每个机器周期,经反向后锁存到IE0和IE1的标志位,CPU在下一个机器周期才会查询到新置入的IE0和IE1,这时如果满足响应条件,CPU响应中断时,要用二个机器周期执行一条硬件长调用指令“LCALL”。所以,从产生外部中断到开始执行中断程序至少需要三个完整的机器周期。如果在中断申请时,CPU正在长指令,如乘法和除法指令等四周期指令,则额外等待时间增加三个周期;若正在执行“RETI”指令或访问IE,IP的指令,则额外等待时间又增加两个周期。综上估计,在单一中断系统里,外部中断响应时间约在3-8个机器周期之间。
下面我们仍以打印机为例来说明外中断源的使用方法 。硬件连接和查询方式基本一致,只是因为程序中对外中断进行了初始化,所以,8051的端口引脚P3.2在这个例子中不再是一个普通的端口而是外中断的输入,另一个,打印机多了一个选通信号STB。对打印机来说,这个信号是个输入信号,其意义为:当打印机检测到该引脚上出现一个负跳变,即由高电平时,表示单片机以把打印数据送上数据总线,则打印机将BUSY引脚设置为1,告诉单片机打印机正在打印,然后,开始打印。
本例中,单片机并行接口P3的一位T0输出作为该信号的输入,打印缓冲区仍就在内部数据存储器的10H-11H单元,共三字节。下面我们来看看程序:
第一条指令ORG 0000H是一条伪指令,意义是:告诉编译系统紧跟其后的那条指令从程序存储器的0000H单元开始存放。
第二条指令LJMP MAIN的意义是:跳转到标号为MAIN的地址去运行。
第三条指令ORG 0003H是一条伪指令,意义是:告诉编译系统紧跟其后的那条指令从程序存储器的0003H单元开始存放。
指令LJMP SUBO的意义是:跳转到标号为SUBO的地址去运行。
指令ORG 0050H的意义是:告诉编译系统紧跟其后的那条指令从程序存储器的0050H单元开始存放。
MAIN是一个标号。
指令SETB EA意义为:对位地址EA置1,EA是8051单片机中断系统是总允许位,所以,该指令的物理意义是开放8051的中断系统。
指令CLR EX0意义为:对EX0位置1,其物理意义为允许外中断0中断。
指令CLR IT0意义为:对IT0位清1,其物理意义是设置外中断0的触发方式为边沿触发。
指令MOV R0,#11H的意义是:将数据11H送入工作寄存器R0中,物理意义为设定在中断服务程序中发送的一个数据的地址,即打印机缓冲区的第二字节 。因为必须在主程序上发送第一个字节之后,打印机才能发出第一次中断请求,如果单片机将所有数据都放在中断服务程序中发送,则会引起单片机和打印机相互等待,即打印机等待单片机将数据送上数据总线,并通过T0引脚发送一个负脉冲选通信号到打印机的STB引脚,打印机要在检测到该引脚上的负脉冲前沿后,才开始打印 。另一方面,单片机却在等待打印机打印完一个数据后,提出中断申请,才能在中断服务程序中发送第一个数据。
指令MOV P2,10H的意义是:将内部数据存储器10H单元送上并行接口P2,其物理意义是发送第一打印数据。
指令CLR P3.4的意义为:对端口P3.4,即T0引脚清0,其物理意义向打印机发送选通信号的前沿,打印机检测到选通信号的前沿后,置引脚BUSY的状态为高电平,然后开始打印。
指令SETB P3.4的意义为:对端口P3.4置1,其其物理意义向打印机发送选通信号的后沿。
指令LJMP §的意义是:跳转到本条指令,即主程序到此就进入死循环。请大家注意只要用户不关机的话,CPU就会不停的运行下去,不会因为用户程序到此结束,如果没有这条死循环指令的话,CPU就会从程序存储器的下一个单元取出一个数,把它当下一个指令的操作码处理,这样,程序就会出错,甚至死机 。所以,如果一个系统中本身没有死循环的话,一定要在主程序的最后认为加上一条死循环指令。
SUBO是一个标号,表示外中断0的真正起始地址。
指令MOV P2,@R0的意义是,把R0的内容作为内部数据存储器的地址,再把该地址的数据去出来送到端口P2,起物理意义是发送第二个打印数据。
指令CLR P3.4的意义是,对端口P3.4清0,物理意义是发送STB选通信号的前沿,打印机检测到该信号,置引脚BUSY为高电平,然后开始打印。
指令SETB P3.4的意义是 ,对端口P3.4置1,物理意义是发送STB选通信号的后沿。
指令INC R0的意义是:对R0的内容加1,物理意义是改变打印缓冲区中下一个待打数据的指针,这条指令运行后,R0中的内容为12H,即下一个待打印数据在12H单元中。
指令CJNE RO,#13H LAB1的意义是:判断R0的内容是否为13H,如是则继续往下运行,否则跳转到标号为LAB1的地方,物理意义为如果待打印数据的指针向13H,即表示所有的数据都打印完毕,则运行关中断指令,否则表示数据末打印完,则跳过关中断指令。
LAB1是一个标号。
指令RETI的意义是:中断返回,物理意义是清除外中断0的中断请求标志,并返回主程刚才被中断的地方,这是本程序经编译后的机器码指令,用仿真器把它固化到程序存储器后,就可以运行了。
全部0条评论
快来发表一下你的评论吧 !