51单片机实验3-中断控制的LED灯(单一外部中断控制LED灯,两个外部中断控制LED灯,交通管制路口)

实训目的:

1、编写程序通过单一外部中断控制LED灯,每按一次开关,中断服务程序中,低4位led和高4位led交替闪烁5次;

2、编写程序利用两个外部中断控制LED灯。上电后8个led以流水灯方式点亮间隔100ms,K1按下,流水灯反向显示1次间隔50ms;按下K2,8个led同时闪烁3次,间隔50ms。

实训步骤:

(一)单一外部中断控制LED灯

电路连接如下:

主要器件:AT89C51、RES、LED-GREEN、BUTTON

程序代码如下:

#include<reg51.h>
void delay(unsigned int x)   // 延时函数
{	
	unsigned int i,j;
	for(i=x;i>0;i--)
		for(j=333;j>0;j--);
}
void main()
{	
	EX0=1;     // 设置外部中断INT0允许
	EA=1;      // 开启总中断
	IT0=0;     // 设置INT0的触发方式为电平触发
	while(1)
	{
		P1=0;   // 将单片机P1口输出设为0,控制LED灯熄灭
	}
}
void int0() interrupt 0   // 中断服务程序,处理外部中断INT0
{	
	unsigned char m;       
	EX0=0;                  // 禁止INT0外部中断
	for(m=0;m<5;m++)        // 循环执行5次
	{	
		P1=0x0f;             // 将单片机P1口输出设置为0x0f,控制LED灯低四位点亮    0x0f =0000 1111
		delay(200);
		P1=0xf0;             // 将单片机P1口输出设置为0xf0,控制LED灯高四位点亮   0xf0=1111 0000
		delay(200);
	}
	EX0=1;               // 允许INT0外部中断
}
//1进入while循环中,将P1输出设置为0,此时LED灯处于关闭状态。
//2当外部中断INT0被触发,跳转到中断服务程序int0()中执行相应的操作。
//3在int0()服务程序中禁止INT0外部中断,并循环5次进行指定的操作。
//4操作每次点亮单片机P1口输出低四位或高四位,形成LED灯的闪烁效果。
//5在每次操作后使用延时函数delay延时一段时间。
//6循环结束后允许INT0外部中断,并返回到while循环中。
//不断重复2-6步骤,实现LED灯的闪烁效果。

(二)两个外部中断控制LED灯

电路连接如下:

 程序代码如下:

#include<reg51.h>
#include<intrins.h>
sbit K1=P3^2;       // 定义P3口第2个引脚为按键K1所对应的IO口
sbit K2=P3^3;       // 定义P3口第3个引脚为按键K2所对应的IO口
void delay(unsigned int m)  // 延时函数
{	unsigned int i;
	while(m--)
	{	for(i=0;i<333;i++);
	}
}
void main()
{	EX0=1;      // 打开外部中断0(INT0)
	IT0=1;      // 设置INT0为下降沿触发方式
	PX0=1;      // 设置INT0为优先级低的中断
	EX1=1;      // 打开外部中断1(INT1)
	IT1=0;       //设置INT1为低电平触发
	EA=1;        //  打开总中断允许 
	P1=0xfe;     //初始设置P1口LED灯亮,除最后一位外都亮  0xfe为11111110
	while(1)
	{	delay(100);      //延时100ms
		P1=_crol_(P1,1);   //将P1口LED灯向左移动一位(循环移位)
	}
}
void int0() interrupt 0  // 定义INT0中断服务函数     流水灯反向显示一次
{	unsigned char i,j;
	j=P1;                    // 保存当前P1口LED灯状态
	delay(10);               // 等待一段时间,避免按键抖动,消抖
	P1=0x7f;                 // P1口前七个灯亮     0x7f=0111 1111
	for(i=0;i<8;i++)
	{	delay(50);
		P1=_cror_(P1,1);       // 将P1口LED灯向左移动一位(循环移位)
	}
	P1=j;                    //把原来保存的p1值再传给p1
}
void int1() interrupt 2    // 定义INT1中断服务函数       8个led同时闪烁
{	unsigned char i,j;
	j=P1;                    //保存当前P1口LED灯状态
	for(i=0;i<3;i++)
	{	P1=0x00;               // 将P1口所有LED灯都熄灭
		delay(50);
		P1=0xff;               // 将P1口所有LED灯都点亮
		delay(50);
	}
	while(!K2)               // 等待按键K2释放
	P1=j;                    // 恢复P1口LED灯状态
}

(三)交通管制路口

有个十字路口,设有一组红绿灯,无人操作时自动通过红黄绿灯控制交通;设置按钮K0和K1,其中K1用于交通管制状态,按下后红绿灯不再轮换点亮,可以固定在南北方向或东西方向通行;K0按钮用于恢复正常交通状态。

电路连接如下:

 代码如下:

#include<reg51.h>
#include<intrins.h>
sbit K0=P3^2;
sbit K1=P3^3;
void delay(unsigned int m)
{	unsigned int i;
	while(m--)
	{	for(i=0;i<333;i++);
	}
}

void main()
{	
	EX0=1;
	IT0=1;
	PX0=1;
	EX1=1;
	IT1=1;
	EA=1;
	while(1)
	{	P1=0x7e;
		delay(40);
		P1=0xbe;
		delay(20);
		P1=0xdb;
		delay(40);
		P1=0xdd;
		delay(20);
	}
}
void ji_xu() interrupt 0
{	
	delay(1);
	}
void guan_zhi() interrupt 2
{	
	while(1);
	}

### 关于51单片机外部中断控制LED的示例 以下是基于51单片机使用外部中断控制LED的一个完整示例程序。该程序展示了如何配置外部中断并编写相应的中断服务子程序。 #### 配置说明 为了使外部中断正常工作,需要完成以下几个步骤: - 初始化外部中断的相关寄存器。 - 设置中断触发模式(下降沿或低电平触发)。 - 编写中断服务函数,在其中实现具体的逻辑操作,比如切换LED的状态。 --- ```c #include <reg52.h> // 包含51单片机头文件 sbit LED = P1^0; // 定义P1.0端口连接LED void ExternalInterrupt_Init() { EA = 1; // 开启总中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发 } void main() { LED = 1; // 初始状态关闭LED ExternalInterrupt_Init(); // 调用初始化函数 while(1); // 主循环等待中断发生 } // 中断服务子程序 void external_interrupt_service() interrupt 0 { LED = ~LED; // 反转LED状态 } ``` 上述代码实现了以下功能: - 使用 `EA` 寄存器开启全局中断[^1]。 - 使用 `EX0` 和 `IT0` 来启用外部中断0,并设置其触发方式为下降沿触发[^2]。 - 当外部信号通过P3.2引脚输入时,会触发光耦合到的中断事件,从而进入中断服务子程序执行特定的操作,即反转LED的状态。 --- ### 注意事项 - **硬件连接**:确保将按钮或其他触发设备正确连接至P3.2管脚(INT0),并将LED正极接上拉电阻后接到P1.0管脚。 - **编译环境**:此代码适用于Keil uVision等支持标准C语言语法的51单片机开发工具链。 - **调试建议**:如果发现无法触发中断,请检查硬件电路是否完好无损以及是否存在干扰因素影响信号质量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值