使用方法:
单片机的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单片机数码管循环左移详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)