1.实验说明
实验一:
- 用80C51单片机控制8个LED灯,在外部中断0输入引脚(P3.2)接一个开关K1。将外部中断0设置为下降沿触发,程序启动是8个LED以跑马灯的形式交替闪烁。每按一次开关K1,使引脚接地,产生一个下降沿触发的外部中断请求。在中断服务程序中,8个LED高四位和低四位交替闪烁5次,然后中断返回,8个LED继续以跑马灯形式闪烁。
实验二:
- 在实验一的基础上,在外部中断1输入引脚(P3.3)接一只按钮开关K2。当按下K1时,外部中断0下降沿触发方式触发,进入外部中断0服务程序,上下4个灯交替闪烁;此时按下K2,外部中断1下降沿触发方式触发,进入外部中断1服务程序,8个灯交替闪烁。当外部中断1响应完毕后,返回继续响应外部中断0,直到外部中断0响应完毕,返回执行主程序。
2.实验一
2.1.实验效果
分析:单片机控制8个LED、按键K1触发中断、下降沿触发方式、中断前LED跑马灯形式、中断触发后8个LED高四位和低四位交替闪烁5次,中断返回。
按下K1,高4位和低4位LED交替闪烁5次,中断返回
2.2.Proteus仿真图
连线方式为标号连接
2.3.源程序
#include<reg52.h>
unsigned char code table[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xff}; // 控制P0端口的状态
unsigned char i, j, k, l, num;
void delay() // 延时函数
{
for(i = 0; i < 200; i++)
{
for(j = 0; j < 200; j++)
;
}
}
void init() // 中断的初始化
{
// EA = 1; // 打开总中断控制
// EX0 = 1; // 允许外部中断0
// IT0 = 1; // 外部中断为下降沿触发方式
EA = 1;
EX0 = 1; EX1 = 1;
PX0 = 0; PX1 = 1;
IT0 = 1; IT1 = 1;
}
void main()
{
init(); // 中断初始化
while(1)
{
for(num = 0; num < 10; num++)
{
P0 = table[num];
delay();
}
}
}
void int0() interrupt 0 // 外部中断0中断服务程序
{
EX0 = 0;
for(k = 0; k < 5; k++)
{
P0 = 0xf0;
delay();
P0 = 0x0f;
delay();
EX0 = 1;
}
}
3.实验二
3.1.实验效果
按下K2,8个LED交替闪烁5下后,中断返回
3.2.Proteus仿真图
与实验1相同
3.3.源程序
中断1服务程序
void int1() interrupt 2 // 外部中断1服务程序
{
for(l = 0;l < 5; l++)
{
P0 = 0x00;
delay();
P0 = 0xff;
delay();
}
}