关于51单片机的外部中断使用方法
我是4位的数码管,位选在P1口,段选在P0口。 展开
2015-08-01 · 知道合伙人教育行家
使用方法:
单片机的P2.5,P2.6,P2.7口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P1.0口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。
中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P3.2口就行,这样,就满足了你的要求了。
外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。
灯不是一定要接到P3.2口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制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口默认是高电平,而要求是开始不亮,所以要将P1.0口开始设置为低电平。
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--);
}
#include<reg51.h>
#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口默认是高电平,而要求是开始不亮,所以要将P1.0口开始设置为低电平。
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--);
}
接线方法:
单片机的P2.5,P2.6,P2.7口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P1.0口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P3.2口就行,这样,就满足了你的要求了。
外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。
灯不是一定要接到P3.2口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。
嗯 就是让数码管停止就好了,好像用外部中断有点麻烦啊。我后来改成用定时器来做,就可以了,但是我要是把数码管和led灯放在一起一个中断程序里,就不行了啊 这是为什么?
用定时器是每隔一定的时间让数码管和LED轮流显示么?
2015-07-23 · 知道合伙人教育行家
其次你才是开启五个小中断ET0 ET1 ES INT0 INT1
只要你对应中断的接口接受到有效电平它就启动
设置这些优先级
推荐于2017-09-16 · 知道合伙人教育行家
sbit k1=P3^2;
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void key_scan(); //声明键盘扫描子函数
//=================================================
void main()
{
led=1; //上电初始化,led灯不亮
while(1)
{
key_scan();
delay_ms(3000);
}
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y;
for(x=xms;x>0;x--)
for(y=130;y>0;y--);}
//-------------------------------------------------
void key_scan() //键盘扫描子函数
{ if(k1==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k1==0) //确实是有键按下,则:
{led=!led; //翻转灯的状态
while(!k1);} //等待按键放开
}
}
//-------------------------------------------------