
当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的部件称为中断系统,申请CPU中断的请求源称为中断源,单片机的中断系统一般允许多个中断源,当多个中断源同时向CPU请求中断时,就存在一个中断优先权的问题。通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。
假设你的外部晶振为12M(时钟频率为1M),用复合定时法,即把小值定时叠起来void t0() interrupt 1{中断服务程序;}主函数:TMOD=0x01 //设置为定时器0工作方式1for(t=20t>0t--){ TH0=(65536-50000)/256 TL0=(65536-50000)%256//赋初值使一次定时为50ms TR0=1 //开定时器t0 while(!TF0) //等待置位 TR0=0 //关定时 TF0=0 //清标志位}TF0=1 //亲自置位TF0,是打开中断前提IE=0x82 //开允许位EA,ET0若想精确一些,由于中断置位的 *** 作会花3~8个时钟周期;所以可把初值增大3~8,即TH0=(65536-49997)/256TL0=(65536-49997)%256还可用编译软件调试(先设置外部晶振值为12M)测量延时时间方法类似,补写程序如下:#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
led=p0^0
sbit
led1=p0^1
void
delay1ms
(uint
z)
{
uint
x,y
for
(x=zx>0x--)
for
(y=110y>0y--)
}
void
exter()
interrupt
2
{
delay1ms(600)
led=0
delay1ms(200)
led=1
}
void
exter0()
interrupt
0
{
delay1ms(600)
led1=1
delay1ms(200)
led1=0
}
main()
{
ea=1
//开总中断
ex1=1
//开外部中断1
ex0=1
//开外部中断0
it1=0
//外部中断边沿触发,下降沿触发
it0=0
//外部中断0边沿触发,下降沿触发
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)