#include"reg51h"sbita1=P3^2;intXn,SUM;voidtime0_initial()//定时{TMOD=0x01;TH0=(65535-5000)/256;//定时器0定时5msTL0=(65535-5000)%256;EA=1;}voidinterrupt_0_initial(){IT0=0;EX0=1;EA=1;}voidmain(void){interrupt_0_initial();time0_initial();while(1);}voidtime0()interrupt1{TH0=(65535-5000)/256;//定时器0定时5msTL0=(65535-5000)%256;Xn++;}voidinterrupt_0()interrupt0{do{ET0=1;TR0=1;}while(a1==0)ET0=0;TR0=0;SUM=Xn;Xn=0;}
外部中断,计数器定时器中断,串口行中断。具有不一样的中断向量,具有不一样的中断优先级,处理不一样的中断响应。中断请求是根据你自身对中断的配置好之后,只要发生符合条件的事件,就会触发中断,跳转到中断处理程序。
#include
void
InitTimer0(void)//定时100us
{
TMOD
=
0x01;
TH0
=
0x0FF;
TL0
=
0x9C;
EA
=
1;
ET0
=
1;//允许定时器中断
TR0
=
1;//启动定时器0
}
void
InitUART(void)
{
TMOD
=
0x20;
SCON
=
0x50;
TH1
=
0xF3;//配置波特率为4800
TL1
=
TH1;
PCON
=
0x80;//启用波特率加倍
EA
=
1;
ES
=
1;//开启串口中断
TR1
=
1;//启动定时器1
}
void
InitIrt(void)
{
EA=1;
IT0=0;//低电平触发
EX0=1;//开启外部中断
}
void
main(void)
{
InitTimer0();
InitUART();
InitIrt();
while(1);
}
void
Timer0Interrupt(void)
interrupt
1//处理定时器1中断的程序,当定时器计数到100us时程序跳到这里
{
TH0
=
0x0FF;
TL0
=
0x9C;
//add
your
code
here!
}
void
UARTInterrupt(void)
interrupt
4//当发生串口中断时,程序跳转到这里
{
if(RI)
{
RI
=
0;
//add
your
code
here!
}
else
TI
=
0;
}
void
IntInterrupt(void)
interrupt
0//当外部引脚P3^0有低电平的时候,程序跳转到这里
{
//add
your
code
here!
}
1、打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUPA51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
2、导入51单片机的头文件,否则后续使用的端口都会出现未定义的情况,然后在主函数中,使得EA=1,即总中断允许,打开中断的总开关。
3、分别打开外部中断0和外部中断1的分开关,即EX0=1和EX1=1,同时设置中断的触发方式为跳沿触发,可以避免增加额外的电路。
4、如果不添加别的代码的话,此时这两个中断的优先级是外部中断0>外部中断1,如果一个中断正在执行来了另外一个中断是不会打断前一个中断的执行过程的,这里需要为中断设置优先级。
5、编写完主函数后,我们要为两个中断分别编写对应的中断服务函数,才能在中断发生后产生相应的响应,注意外部中断0和外部中断1的中断号分别是0和2。
6、然后到Project菜单中的output项目中勾选Create Hex File,OK后点击编译按钮,如果没有错误,即可生成可以烧录或者仿真的hex文件。
7、最后把生成出的hex烧入进51单片机进行运行或者装载入Proteus仿真系统进行仿真。
void guangdian() interrupt 2
{ TR0=1;//开启定时器
flag=1;//标志位置1
while(flag==1)
{
fmq=1;//蜂鸣器响
}//使蜂鸣器不断响
}
程序有两个致命问题:
1、中断里面不要使用while,否则其他中断就执行不了了,就是你描述的“高级中断无法打断低级中断”
2、中断里面不要使用延时,中断里面的延时没有执行完,又来中断,导致程序执行效率低下,延时和while等 *** 作尽量放到主程序里执行
使用方法:
单片机的P25,P26,P27口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P10口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。
中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P32口就行,这样,就满足了你的要求了。
外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。
灯不是一定要接到P32口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。
代码如下:
#include
#define
uchar
unsigned
char
sbit
led=P1^0;
uchar
code
duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar
code
wei[3]={0x06,0x05,0x03};
void
delay(uchar
c);
void
ini_()
//初始化函数,设置中断触发方式,开中断
{
EA=1;
IT0=0;
EX0=1;
}
void
main()
{
uchar
i;
ini_();
led=0;
//由于单片机上电之后,所有的IO口默认是高电平,而要求是开始不亮,所以要将P10口开始设置为低电平。
while(1)
{
for(i=0;i<3;i++)
动态数码管闪烁
{
P2=wei[i];
P0=duan[i];
delay(35);
}
}
}
void
led_()
interrupt
0
//外部中断0函数,中断函数不需要申明
{
uchar
i;
led=1;
//在中断中让灯亮起来
while(1)
{
for(i=0;i<3;i++)
{
P2=wei[i];
P0=duan[i];
delay(1);
}
}
}
void
delay(uchar
c)
{
uchar
a,b;
for(c;c>0;c--)
for(a=38;a>0;a--)
for(b=80;b>0;b--);
}
以上就是关于开启外部中断的基本流程全部的内容,包括:开启外部中断的基本流程、关于单片机中断的问题、MCS-51单片机外部中断的触发方式如何设定和选择等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)