
中断分为4个步骤:中断请求→中断相应→中断处理→中断返回(先做更重要的事)
1、数据的输入/输出传送方式
外部中断要看对应引脚外部的电平状态。
例如:外部中断0(INT0)对应的引脚是P32,
当出现 低电平 ,即P32引脚连接的地方是 低电平 ,进入相应的中断函数;
当出现 下降沿 ,即P32引脚连接的地方 由高电平变为低电平 ,进入相应的中断函数
内部中断源要看单片机内部的定时器/计数器
中断允许寄存器IE
定时器/计数器0/1控制寄存器TCON
对同时发生多个中断申请时:
不同优先级的中断同时申请:先高后低
相同优先级的中断同时申请:按序执行
正处理低优先级中断又接到高级别中断:高打断低
正处理高优先级中断又接到低级别中断:高不理低
初始化的意思如图所示
实现思路
查看上方 P3第二功能各引脚功能定义 ,P33是外部中断1 (INT1)的外部输入引脚
编写一个程序,使得 S2按键按下 时,某个IO口(下面程序选择了P37这个IO口) 产生跳变沿 (由1变0)。P33与P37用跳线连接,使P33口与P37口同时产生跳变沿。
#include "reg51h"
sbit a1=P3^2;
int Xn,SUM;
void time0_initial() //定时
{
TMOD=0x01;
TH0=(65535-5000)/256; //定时器0定时5ms
TL0=(65535-5000)%256;
EA=1;
}
void interrupt_0_initial()
{
IT0=0;
EX0=1;
EA=1;
}
void main(void)
{
interrupt_0_initial();
time0_initial() ;
while(1);
}
void time0() interrupt 1
{
TH0=(65535-5000)/256; //定时器0定时5ms
TL0=(65535-5000)%256;
Xn++;
}
void interrupt_0() interrupt 0
{
do
{
ET0=1;
TR0=1;
}while(a1==0)
ET0=0;
TR0=0;
SUM=Xn;
Xn=0;
}
#include "reg52h"
sbit key=P3^2;
void main()
{
IT0=1; //外部中断0连沿触发方式
EX0=1; //使能外部中断0
EA=1; //开部中断
while(1) ;
}
void int0() interrupt 0
{
int tab[]={0xff,0x7f,0xbf,0x3f,0xdf,0x5f,0x9f,0x1f,0xef,0x6f,0xaf,0x2f,0xcf,0x4f,0x8f,0x0f} ;
int count=15;
long int i;
while(1)
{
if(key==0)
for(i=0;i<10000;i++);
if(key==0)
{ count--;
if(count==0)
count=15;
P3= tab[count] ;
while(key==0);
}
}
}
外部中断,要求是低电平/下降沿触发。
你应该把按键改成接地,不要接电源。
另外,程序缺少延时,这样,按一下键,会加上很多次的。
试试如下程序:
#include <reg52h>
unsigned char code tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char a, b, c;
//-------------------------------
void delay(unsigned int k)
{
unsigned int i, j;
for(i = 0; i < k; i++)
for(j = 0; j < 121; j++);
}
//-------------------------------
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
while(1) {
P0 = tab[c];
}
}
//-------------------------------
void key()interrupt 0
{
c++;
if(c > 10) c = 0;
delay(200); //延时一会
}
//-------------------------------
以上就是关于51单片机之中断系统,外部中断全部的内容,包括:51单片机之中断系统,外部中断、外部中断和定时器中断在一起的程序怎么写、用外部中断1做一计数器的c语言程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)