AT89S51单片机外部中断引脚P3.3接按键S1,P1口接8个发光二极管,初始时, 发光二极管D1亮,其他发光二极管灭;试用外部中断1编程实现,每按下一次 按键,8个发光二极管循环下移。(D1亮-D2亮-…-D8亮-D1亮…)。
时间: 2024-03-10 10:48:15 浏览: 160
好的,这是一个典型的单片机中断处理的例子,下面是对应的C语言代码:
```c
#include <reg52.h>
sbit led1 = P1^0; // 定义8个LED灯
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; // 定义按键
void delay(unsigned int time) // 延时函数,用于消除按键抖动
{
unsigned int i, j;
for(i=0;i<time;i++)
for(j=0;j<125;j++);
}
void main()
{
unsigned char flag = 0x01; // 定义循环移位的标志位
IT1 = 1; // 设置外部中断1下降沿触发
EX1 = 1; // 开启外部中断1
EA = 1; // 开启总中断
while(1) // 主循环
{
P1 = ~flag; // 循环移位显示LED灯
delay(2); // 延时一段时间
flag = flag << 1; // 标志位左移一位
if(flag == 0) // 如果标志位为0,重新开始循环移位
flag = 0x01;
}
}
void int1() interrupt 2 // 外部中断1的中断处理函数
{
delay(10); // 延时一段时间,消除按键抖动
if(key == 0) // 如果按键被按下
{
while(key == 0); // 等待按键松开
delay(10); // 再次消除按键抖动
EA = 0; // 关闭总中断
P1 = 0xff; // 关闭所有LED灯
delay(20); // 延时一段时间
EA = 1; // 开启总中断,继续循环移位
}
}
```
上述代码中,我们通过定义8个LED灯和一个按键,实现了按下按键后所有LED灯循环移位的功能。关键的代码在中断处理函数`int1()`中,当按键被按下时,我们关闭了总中断,关闭了所有LED灯,然后延时一段时间,再开启总中断,就可以实现循环移位的效果。需要注意的是,在处理按键时,我们需要消除按键抖动,否则会出现多次移位的情况。
阅读全文