在8051芯片中,撤销中断可以通过以下几种方式来实现:
硬件自动撤销:定时/计数器中断属于内部中断,当定时/计数器溢出时会产生中断请求。在进入中断服务程序后,硬件会自动将对应的中断请求标志位清零,从而撤销中断请求。例如,当定时器0溢出产生中断,进入中断服务程序后,定时器0的中断请求标志位TF0会由硬件自动清0,撤销该中断请求。
软件干预:可以通过在中断服务程序中重新设置定时/计数器的初值来间接影响中断的撤销。如果希望提前结束定时/计数器中断,可以重新设置初值使得定时/计数器在短时间内不会再次溢出,从而相当于撤销了当前的中断请求。例如,在定时器1的中断服务程序中,重新给TH1和TL1赋较大的值,这样定时器1就不会很快再次产生溢出中断。
低电平触发方式:如果外部中断采用低电平触发方式,在进入中断服务程序后,要撤销中断请求,必须使外部中断源的引脚电平恢复到高电平。因为只要外部中断引脚保持低电平,中断请求就会一直存在。例如,通过将连接到外部中断0引脚INT0的外部设备输出电平拉高,即可撤销外部中断0的中断请求。
边沿触发方式:对于边沿触发的外部中断,硬件会在CPU响应中断后自动清除中断请求标志位。但要注意,如果外部中断源在中断服务期间再次产生有效的边沿信号,又会引发新的中断请求。所以在这种情况下,有时需要在中断服务程序中采取措施来屏蔽外部中断,防止再次触发,比如使用软件关闭外部中断允许位。
- 串行口中断在进入中断服务程序后,不会自动撤销中断请求标志位TI(发送中断标志)或RI(接收中断标志),需要在中断服务程序中用软件将TI或RI清零来撤销中断请求。例如,在串行口发送数据的中断服务程序中,在完成数据发送处理后,要执行“CLR TI”指令来清除发送中断标志,以撤销串行口发送中断请求;对于接收中断,则执行“CLR RI”来撤销接收中断请求。
- 可以通过操作中断允许寄存器IE来关闭相应的中断。例如,如果要撤销定时器0的中断,可以将IE寄存器中的ET0位清0,即执行“ANL IE,#0FEH”指令,这样就禁止了定时器0的中断请求,相当于撤销了该中断。这种方式可以在任何时候根据需要灵活地禁止或允许某个中断源的中断请求。
- 可以通过设置中断优先级寄存器IP来改变中断优先级,从而间接影响中断的撤销。如果将某个中断的优先级设置为最低,当有其他高优先级中断发生时,该低优先级中断可能会被暂时挂起或撤销。不过这种方式一般不是直接用于撤销中断,而是用于协调多个中断源之间的优先级关系,在某些情况下可以达到类似撤销的效果。