外部中断未发生时,系统通过定时器完成定时0.5s的延时,使8个发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。 编写89C52程序,用按键模拟单片机外部中断输入源,当按键按下时产生中断。外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。
时间: 2024-03-16 11:46:13 浏览: 68
以下是您所需要的89C52的程序,请参考:
```c
#include <reg52.h>
#define LED_PORT P0
sbit KEY = P3^3;
unsigned char led_num = 0;
unsigned char led_dir = 0;
unsigned char led_flash = 0;
void timer0_init(void);
void external_interrupt_init(void);
void main(void)
{
timer0_init();
external_interrupt_init();
EA = 1; // 全局中断使能
while (1)
{
if (led_flash)
{
LED_PORT = 0xFF;
led_flash = 0;
}
else
{
LED_PORT = ~(1 << led_num);
if (led_dir)
led_num--;
else
led_num++;
if (led_num == 8)
{
led_dir = 1;
led_flash = 1;
}
else if (led_num == 0)
{
led_dir = 0;
led_flash = 1;
}
}
}
}
void timer0_init(void)
{
TMOD &= 0xF0; // 设置定时器0为模式1
TMOD |= 0x01;
TH0 = 0xFC; // 定时0.5s,计算方法为65536-50000
TL0 = 0x18;
TR0 = 1; // 启动定时器0
}
void external_interrupt_init(void)
{
IT1 = 1; // 设置INT1下降沿触发
EX1 = 1; // 使能INT1中断
}
void external_interrupt_isr(void) interrupt 2
{
led_flash = 1;
while (!KEY); // 等待按键释放
IE1 = 0; // 关闭INT1中断
TH0 = 0xFC; // 重新加载定时器0的值
TL0 = 0x18;
TR0 = 1; // 启动定时器0
}
void timer0_isr(void) interrupt 1
{
led_flash = 0;
IE1 = 1; // 重新使能INT1中断
TR0 = 0; // 关闭定时器0
TF0 = 0; // 清除定时器0中断标志位
}
```
程序中使用定时器0实现0.5秒的延时,每次延时结束后将8个发光二极管依次点亮,当外部中断触发时,发光二极管闪烁。外部中断使用INT1中断,通过按下P3.3所接按键模拟中断输入源。在外部中断中,关闭INT1中断,重新加载定时器0的计数值,启动定时器0,等待0.5秒后重新使能INT1中断,关闭定时器0。
阅读全文