
8051没有专门的开中断和关中断的指令,中断的开放和关闭是由特殊功能寄存器IE来实现两级控制的。有个总开关EA,然后又有ES,ET1,EX1,ET0,EX0五个开关。为1表示开,为0表示关。
单片机在复位后,IE各位的状态为0,所以CPU处于关中断的状态。对于串口来说,其中断请求被响应后,CPU不能自动清除中断标志。用指令来实现关中断。其他中断源的中断标志在CPU响应中断后自动清除。
中断优先级由IP来控制旅碰,PS,PT1,PX1,PT0,PX0,置为1表示高优先级。
当几个中断源同时向CPU请求中断时,按所发生的实时事件的轻重缓急排队,优先处理最紧急事则乱件的中断请求,于是单片机规定每个中断源的优先级别。
当CPU正在处理一个中断请求,又发生另一个优先级比它高的中断请求,CPU暂时中止对前一中断处理,转而去处理优先级更高的中断请求,待处理完后,再继续执行原来的中断处理程序,这样的过程称为中断嵌拆盯谈套,这样的中断系统称为多级中断系统。
由于外界异步事件中断CPU正在执行的程序时随机的,CPU转向去执行中断服务程序时,除了硬件会自动把断电地址,即16位PC程序计数器的值压入堆栈之外,用户还得注意保护有关工作寄存器,累加器,标志位等信息,这个过程通常称为保护现场 。以便在完成中断服务程序后,恢复原工作寄存器,累加器,标志位等的内容,这个过程称恢复现场;最后执行中断返回指令,自动d出断电到PC,返回主程序,继续执行被中断的程序。
#include<reg51.h>团燃耐#include<塌春intrins.h>段丛
#define uchar unsigned char
uchar cnt,times
void delay()
{
uchar i
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
TR0=1
for(i=0i<timesi++)
{
while(TF0==0)
TH0=(65536-50000)/256
TL0=(65536-50000)%256
TF0=0
}
TR0=0
}
void ext0() interrupt 0
{
uchar i,j
P1=0xfe
times=8
for(i=0i<5i++)
{
for(j=0j<8j++)
{
P1=_crol_(P1,1)
delay()
}
}
}
void ext1() interrupt 2
{
uchar i,j
P1=0x7f
times=12
for(i=0i<3i++)
{
for(j=0j<8j++)
{
P1=_cror_(P1,1)
delay()
}
}
}
main()
{
EX0=1
EX1=1
IT0=0
IT1=1
PX0=0
PX1=1
while(1)
}
首先如果不是增强型具有键盘中断的51单片机,这个想法是不可能实现的。但是可以通过两种方式来实现假中断
1,扫描方式,在主程序中加上一段扫描循环,每隔一段时间扫描一次P1.0的电平状态,如果改变则跳转到你要执行的程序处执行程序执行完再跳回就好(不能用RETI)
主题程序如下(假设有信号是P1.0由高到低):
main:
.....
....
SETB C;尘芹先置C为1
MOV C,P1.O;把P1.0状态给慎者C
JNC LOOP;低电平跳转
......不是低电平则继续执行下面
....
AJMP MAIN ;循环判断
还有一种方法是把P1.O的信号同时通过反相器电容等接派孝毕到RST脚上(高电平有效)这样如果P1.0电平改变,就会使单片机复位,只要在复位后加个判断P1.0管脚电平同样可以起到假中断作用,程序和上面几乎一致
这两种办法都有局限性例如第一种反应时间就会根据你主程序的复杂程度而变化。第二种呢就有可能使一些程序做了一半。。。不过经验丰富的话还是可以当做中断用的。
如果是真的想扩展中断 还是用带键盘中断的增强型单片机吧
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)