AT89S51单片机外部中断引脚P3.3接按键S1,P1口接8个发光二极管,初始时, 发光二极管D1亮,其他发光二极管灭;试用外部中断1编程实现,每按下一次 按键,8个发光二极管循环下移。(D1亮-D2亮-…-D8亮-D1亮…)。
时间: 2024-03-07 10:53:37 浏览: 148
好的,根据题目要求,我们可以设计如下电路:
![AT89S51](https://img-blog.csdnimg.cn/20210713110330824.png)
其中,按键 S1 接在 P3.3 引脚上,8 个发光二极管分别接在 P1.0~P1.7 引脚上,初始时,只有 D1 灯亮。每按下一次按键,8 个发光二极管就会循环下移。
我们需要使用外部中断1来实现按键的检测。外部中断1的触发方式可以选择下降沿触发或者上升沿触发。这里我们选择下降沿触发,在程序中设置 P3.3 引脚为输入模式,并使能外部中断1。
按键检测的流程为:等待按键按下,等待按键释放,然后执行发光二极管的下移操作。发光二极管下移的方式可以使用移位操作实现。在每次下移时,我们需要将 D1 灯的状态保存下来,然后将 D1~D7 灯的状态向左移一位,最后将保存的 D1 灯状态移动到 D8 灯上。
下面是基于 Keil C51 编译器的程序代码,供参考:
```c
#include <reg51.h> // 引入 8051 系列单片机的寄存器定义
// 定义发光二极管的引脚
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;
// 定义按键引脚
sbit KEY = P3^3;
// 定义变量保存发光二极管的状态
unsigned char led_status = 0x01;
// 外部中断1的中断处理函数
void exint1_isr() interrupt 2
{
// 等待按键释放
while (KEY == 0);
// 发光二极管下移
led_status = (led_status << 1) | (led_status >> 7);
P1 = led_status;
}
void main()
{
// 将 P1 端口设置为输出模式,初始状态下只有 D1 灯亮
P1 = 0x01;
// 将 P3.3 引脚设置为输入模式
P3 |= 0x08;
// 使能外部中断1,并选择下降沿触发
EX1 = 1;
IT1 = 1;
// 开启总中断
EA = 1;
while (1);
}
```
需要注意的是,外部中断1的中断处理函数必须使用 `interrupt` 关键字声明,并放在程序的开头部分。在程序中,我们使用了一个变量 `led_status` 来保存发光二极管的状态,以便进行下移操作。发光二极管下移的代码在外部中断1的中断处理函数中实现。在主函数中,我们将 P1 端口设置为输出模式,并且初始状态下只有 D1 灯亮。同时,我们还使能了外部中断1,并选择下降沿触发。在程序的最后,我们使用一个死循环来保持程序的运行。
阅读全文