关于51单片机的外部中断使用方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于51单片机的外部中断使用方法相关的知识,希望对你有一定的参考价值。
我是自己做的板,一开始时数码管是亮的,当有中断请求的时候数码管停止,让 led灯亮,这程序应该怎么写啊 ,我之前有用定时器写过,但是数码管不会停。另外我还想问下这个led灯要怎么接在单片机上,是接在中断的那个P3.2口吗?然后另外一个接电源,那是不是直接给P3.2一个低电平,就中断了,灯就亮了,但是我试了还是不亮的,所以不知道要怎么接,求解。
我是4位的数码管,位选在P1口,段选在P0口。
使用方法:
单片机的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口就行了。本回答被提问者采纳 参考技术B 首先我没明白你的中断请求是什么,听你描述的应该是外部中断来了就让LED亮,数码管停止(是不亮了还是停止计数呢)。先说电路怎么办,LED不能接到p32,要接到其他空闲的IO口(比如p20,要加一个串联的限流电阻一般使电流为4ma就行了,1k或4.7k的都可以)LED的另一端接高电平就可以了,p32口应该接一个按键的一端,按键另一端接地,可以加一个上拉电阻也可以不用。这样当按键按下的话产生一个下降沿来触发外部中断(程序里设定触发方式为下降沿触发),然后进入中断处理函数。软件的话就是在主循环里让数码管的段选位有效,数码管亮;让LED灭(p20为低)。在中断处理函数里让数码管的段选位失效,数码管灭;让LED亮。这是按你的说法的程序思想,不过结果应该和你之前的情况一样,因为中断处理的时间很短,你根本看不见LED亮就又进入主循环了,所以你会一直觉得数码管亮而LED不亮,这就是你设计的初衷的问题了,是不是应该来一次中断数码管亮再来一次中断LED亮呢?追问
嗯 就是让数码管停止就好了,好像用外部中断有点麻烦啊。我后来改成用定时器来做,就可以了,但是我要是把数码管和led灯放在一起一个中断程序里,就不行了啊 这是为什么?
追答用定时器是每隔一定的时间让数码管和LED轮流显示么?
追问是啊
追答我不知道你是怎么写的,你可以设置一个标志位(比如i)当每有一次定时中断(或者几次中断)后就将i取反;在主循环里判断i,当i为1时让数码管显示,i为0时让LED显示。
追问#include #include #define uchar unsigned char #define uint unsigned int uchar code table[]=0xf9,0xa4,0xb0,0x99; uchar n,i,t; sbit duan=P2^6; void delay(uint z) uint x,y;
#include #include #define uchar unsigned char #define uint unsigned int uchar code table[]=0xf9,0xa4,0xb0,0x99; uchar n,i,t; sbit duan=P2^6; void delay(uint z) uint x,y;
参考技术C 首先你要开总中断EA其次你才是开启五个小中断ET0 ET1 ES INT0 INT1
只要你对应中断的接口接受到有效电平它就启动
设置这些优先级 参考技术D #include <reg52.h>
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); //等待按键放开
//-------------------------------------------------
51单片机外部中断使用示例程序
51单片机外部中断使用示例程序
- 本实例来源以STC89演示示例,为了方便初学者更好的阅读,直接将其贴出来。
- 首先分享一份《 STC单片机资源一览表》
你也可以从https://www.stcisp.com/下载到,不过不能编辑只能看。如果需要作为个人阅读使用还是有办法的,将其另存为
.xlsx
,然后修改为后缀为.zip,或者.rar格式后,再进行解压进行处理,如何处理情况视频:
https://www.ixigua.com/6850385483143315981
【金山文档】 STC单片机资源一览表
https://kdocs.cn/l/ca0WAFHo6sUY
示例一(演示外部中断0的下降沿中断)
#include "reg51.h"
//External interrupt0 service routine
void exint0() interrupt 0 //INT0, interrupt 0 (location at 0003H)
P0++;
void main()
IT0 = 1; //set INT0 interrupt type (1:Falling 0:Low level)
EX0 = 1; //enable INT0 interrupt
EA = 1; //open global interrupt switch
while (1);
示例二(演示外部中断0的下降沿中断唤醒掉电模式)
#include "reg51.h"
#include "intrins.h"
//External interrupt0 service routine
void exint0( ) interrupt 0 //INT0, interrupt 0 (location at 0003H)
void main()
IT0 = 1; //set INT0 interrupt type (1:Falling 0:Low level)
EX0 = 1; //enable INT0 interrupt
EA = 1; //open global interrupt switch
while (1)
INT0 = 1; //ready read INT0 port
while (!INT0); //check INT0
_nop_();
_nop_();
PCON = 0x02; //MCU power down
_nop_();
_nop_();
P1++;
示例三(演示外部中断1的下降沿中断)
#include "reg51.h"
//External interrupt1 service routine
void exint1() interrupt 2 //INT1, interrupt 2 (location at 0013H)
P0++;
void main()
IT1 = 1; //set INT1 interrupt type (1:Falling only 0:Low level)
EX1 = 1; //enable INT1 interrupt
EA = 1; //open global interrupt switch
while (1);
示例四(演示外部中断1的下降沿中断唤醒掉电模式)
#include "reg51.h"
#include "intrins.h"
//External interrupt0 service routine
void exint1( ) interrupt 2 //INT1, interrupt 2 (location at 0013H)
void main()
IT1 = 1; //set INT1 interrupt type (1:Falling 0:Low level)
EX1 = 1; //enable INT1 interrupt
EA = 1; //open global interrupt switch
while (1)
INT1 = 1; //ready read INT1 port
while (!INT1); //check INT1
_nop_();
_nop_();
PCON = 0x02; //MCU power down
_nop_();
_nop_();
P1++;
中断查询次序号就是中断号
void Int0_Routine(void) interrupt 0;
void Timer0_Rountine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Rountine(void) interrupt 3;
void UART_Routine(void) interrupt 4;
void Timer2_Routine(void) interrupt 5;
void Int2_Routine(void) interrupt 6;
void Int3_Routine(void) interrupt 7;
以上是关于关于51单片机的外部中断使用方法的主要内容,如果未能解决你的问题,请参考以下文章