关于51单片机的外部中断使用方法

关于51单片机的外部中断使用方法,第1张

使用方法:

单片机的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--);

}

//你原来的b2,b2都是死循环,这是不行的,只有主函数才可以死循环。

//你的主函数结构也有问题。

//为你增加了一个按键检测的函数。

//下列程序通过了实验测试。

//b1输出的周期大约09s。

//b2输出的周期大约06s。

//K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,

//按第一次触动开关时红灯亮、b1输出,

//按第二次绿灯亮、为b2输出,

//按第三次都关闭

#include <reg51h>

#define uint unsigned int

#define uchar unsigned char

uint a;

void b1();

void b2();

sbit t = P1^0;

sbit k = P3^5;

sbit reg = P3^3;

sbit bice = P3^2;

void delay(uchar z)

{

uint x,y;

for(x = z; x > 0; x--) for(y = 110; y > 0; y--);

}

bit key()

{

bit kkk;

kkk = k; //读入按键

if(kkk == 1) return 0;//没有按下

delay(5); //延时

if(k == kkk) return 1;//两次相等

return 0;

}

void main()

{

while(1) {

P3 = 0xff;

while(!key()); //静等按下第一次

reg = 0;

bice = 1;

while(!key()) b1(); //没有按下第二次就循环等待

reg = 1;

bice = 0;

while(!key()) b2(); //没有按下第三次就循环等待

}

}

void b1()

{

P1 = 0xfe; a = 50000; while(a--);

P1 = 0xff; a = 50000; while(a--);

}

void b2()

{

P1 = 0xfe; a = 30000; while(a--);

P1 = 0xff; a = 30000; while(a--);

}

51单片机数码管循环左移是指将一个数码管依次向左移动一个位置,同时将最右边的数移到最左边,形成类似于滚动的效果。以下是51单片机数码管循环左移的详细实现方法:

1 定义一个八位二进制数字并赋初值0xFF,用来驱动八个数码管的显示。

2 设定一个循环,将八个数码管的八位数据按顺序向左移动一个位置。具体实现时,可以将数字左移一位,并在最右边补0,同时将最右边的一位数保存,以便在移动完成后加到最左边。

3 将移动完成后保留的最右边的一位数添加到最左边,重新组合成一个可以用来驱动数码管显示的八位数码。

4 使用延时函数控制数码管显示的时间间隔。

通过不断重复以上 *** 作,可以实现数码管的循环左移效果。当需要停止循环左移时,可以加入相应的控制语句,例如按下停止按钮等。

1、连接硬件电路,可以使用一个或多个LED灯,将其连接到51单片机的I/O端口上,P0口或P1口。

2、编写程序,可以使用C语言或汇编语言编写控制LED灯的程序,程序需要通过控制端口的电平状态来实现LED灯的亮灭,可以使用定时器来控制LED灯的闪烁频率和亮度等参数。

3、实现灯光效果,飞机场灯的灯光效果通常为闪烁或循环闪烁,可以在程序中使用循环语句和条件语句来实现不同的灯光效果,循环闪烁、交替闪烁、顺序闪烁等。

4、调试程序,在实现飞机场灯效果之前,需要测试和调试程序,确保LED灯可以正确地亮灭,并实现预期的灯光效果。

5、安装硬件,将LED灯安装到飞机场灯的模型或实际场地上,连接到51单片机的I/O端口上,运行程序,即可实现飞机场灯效果。

以上就是关于关于51单片机的外部中断使用方法全部的内容,包括:关于51单片机的外部中断使用方法、51单片机C语言程序、51单片机数码管循环左移详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10215439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存