外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。 编写汇编语言或C51程序,用按键模拟单片机外部中断输入源,当按键按下时产生中断。外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。
时间: 2024-03-15 22:47:43 浏览: 100
单片机外部中断
以下是基于C语言的程序实现:
```c
#include <reg52.h>
sbit LED1 = P0^0; // 定义P0.0口为LED1
sbit LED2 = P0^1; // 定义P0.1口为LED2
sbit LED3 = P0^2; // 定义P0.2口为LED3
sbit LED4 = P0^3; // 定义P0.3口为LED4
sbit KEY = P3^3; // 定义P3.3口为按键
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void main()
{
TMOD = 0x01; // 定时器T0工作在方式1
TH0 = 0xFC; // 定时器初值
TL0 = 0x67;
TR0 = 1; // 启动定时器
while(1)
{
if(KEY == 0) // 检测按键是否按下
{
delay(1000); // 延时去抖
if(KEY == 0) // 再次检测按键是否按下
{
LED1 = LED2 = LED3 = LED4 = 0; // 熄灭所有LED灯
while(KEY == 0); // 等待按键释放
TR0 = 0; // 停止定时器
TH0 = 0xFC; // 定时器初值
TL0 = 0x67;
ET0 = 1; // 开启定时器T0中断
EA = 1; // 开启总中断
}
}
else
{
LED1 = 1; // 点亮LED1,其余LED熄灭
LED2 = LED3 = LED4 = 0;
delay(50000); // 延时0.5秒
LED2 = 1; // 点亮LED2,其余LED熄灭
LED1 = LED3 = LED4 = 0;
delay(50000);
LED3 = 1; // 点亮LED3,其余LED熄灭
LED1 = LED2 = LED4 = 0;
delay(50000);
LED4 = 1; // 点亮LED4,其余LED熄灭
LED1 = LED2 = LED3 = 0;
delay(50000);
}
}
}
void Timer0_ISR() interrupt 1 // 定时器T0中断服务函数
{
static unsigned char cnt = 0;
if(cnt++ < 10) // LED闪烁10次
{
LED1 = LED2 = LED3 = LED4 = 1; // 点亮所有LED灯
delay(50000);
LED1 = LED2 = LED3 = LED4 = 0; // 熄灭所有LED灯
delay(50000);
}
else
{
cnt = 0;
ET0 = 0; // 关闭定时器T0中断
TR0 = 1; // 重新启动定时器
}
}
```
程序的实现思路是:首先检测按键是否按下,如果按下则停止定时器,开启定时器T0中断,并等待按键释放;如果未按下,则点亮LED灯,延时0.5秒,然后依次点亮下一个LED灯,循环执行。当定时器T0中断发生时,LED灯闪烁10次,然后重新启动定时器。
需要注意的是,定时器的初值需要根据实际情况进行调整,以保证延时时间为0.5秒。同时,程序中的延时函数需要根据单片机的主频进行调整,以保证延时时间准确。
阅读全文