AT89S51单片机外部中断引脚P3.3接按键S1,P1口接8个发光二极管,初始时,发光二极管D1亮,其他发光二极管灭;试用外部中断1编程实现,每按下一次按键,8个发光二极管循环下移。(D1亮-D2亮-...-D8亮-D1亮...)。
时间: 2024-03-22 13:41:05 浏览: 68
好的,这是一个比较典型的AT89S51外部中断和LED灯控制实验。下面是具体的步骤和代码:
步骤:
1. 确定按键S1和发光二极管各自连接的IO口,按键连接到P3.3口,发光二极管连接到P1口。
2. 配置P1口为输出口,P3.3口为输入口,使P1口的D1发光二极管亮起。
3. 配置外部中断,使P3.3口能够响应下降沿触发的中断。
4. 在中断服务程序中编写代码,实现LED灯的循环下移。
代码如下:
```c
#include <reg52.h> // 包含51系列单片机的头文件
// 定义LED灯的端口
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 外部中断服务程序
void exint1_isr() interrupt 2
{
static unsigned char i = 0; // 定义静态变量i,存储当前LED灯的编号
// 将当前LED灯熄灭
switch (i)
{
case 0: LED1 = 0; break;
case 1: LED2 = 0; break;
case 2: LED3 = 0; break;
case 3: LED4 = 0; break;
case 4: LED5 = 0; break;
case 5: LED6 = 0; break;
case 6: LED7 = 0; break;
case 7: LED8 = 0; break;
}
// 将i加1,实现LED灯的下移
i++;
if (i >= 8) i = 0;
// 将当前LED灯点亮
switch (i)
{
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
case 4: LED5 = 1; break;
case 5: LED6 = 1; break;
case 6: LED7 = 1; break;
case 7: LED8 = 1; break;
}
}
int main()
{
// 配置P1口为输出口,P3.3口为输入口
P1 = 0xff;
P3 = 0xff;
IT1 = 1; // 设置中断类型为下降沿触发
EX1 = 1; // 使能外部中断1
EA = 1; // 全局中断使能
// 初始状态下,将D1发光二极管点亮
LED1 = 1;
while (1)
{
// 主程序中不需要添加任何代码
}
}
```
这段代码的实现原理是,每当按键S1按下时,就会触发一次外部中断,进入中断服务程序。在中断服务程序中,通过控制LED灯的亮灭状态,实现LED灯的循环下移。同时,为了记录当前LED灯的编号,使用了一个静态变量i。在程序最开始的时候,将D1发光二极管点亮,表示初始状态。在主程序中,不需要添加任何代码,因为所有的操作都在中断服务程序中完成。
阅读全文