外部中断未发生时,系统通过定时器完成定时0.5s的延时,使8个发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。 编写89C52程序,用按键模拟单片机外部中断输入源,当按键按下时产生中断。外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。
时间: 2024-03-16 18:45:44 浏览: 59
单片机上机操作考试题部分答案_(2).doc
好,这是一个典型的单片机中断处理程序。以下是89C52芯片的程序代码:
```
#include <reg52.h>
sbit LED1 = P1^0; //定义LED1
sbit LED2 = P1^1; //定义LED2
sbit LED3 = P1^2; //定义LED3
sbit LED4 = P1^3; //定义LED4
sbit LED5 = P1^4; //定义LED5
sbit LED6 = P1^5; //定义LED6
sbit LED7 = P1^6; //定义LED7
sbit LED8 = P1^7; //定义LED8
sbit KEY = P3^3; //定义KEY
void delay(unsigned int ms) //延时函数
{
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main()
{
unsigned char i = 0, j = 0;
TMOD = 0x01; //设置定时器0为模式1
TH0 = 0x4C; //设置定时器0的初始值
TL0 = 0x00;
TR0 = 1; //启动定时器0
while (1)
{
if (KEY == 0) //检测按键是否按下
{
delay(10); //消除按键抖动
if (KEY == 0) //再次检测按键是否按下
{
j = 1; //标记中断已发生
while (!KEY); //等待按键释放
}
}
if (!j) //中断未发生
{
if (i == 0)
{
LED1 = 1;
LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
}
else if (i == 1)
{
LED2 = 1;
LED1 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
}
else if (i == 2)
{
LED3 = 1;
LED1 = LED2 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
}
else if (i == 3)
{
LED4 = 1;
LED1 = LED2 = LED3 = LED5 = LED6 = LED7 = LED8 = 0;
}
else if (i == 4)
{
LED5 = 1;
LED1 = LED2 = LED3 = LED4 = LED6 = LED7 = LED8 = 0;
}
else if (i == 5)
{
LED6 = 1;
LED1 = LED2 = LED3 = LED4 = LED5 = LED7 = LED8 = 0;
}
else if (i == 6)
{
LED7 = 1;
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED8 = 0;
}
else if (i == 7)
{
LED8 = 1;
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = 0;
}
i++;
if (i == 8) i = 0;
delay(500); //延时0.5s
}
else //中断已发生
{
if (TH0 == 0x4C && TL0 == 0x00) //判断定时器是否溢出
{
if (i == 0 || i == 2 || i == 4 || i == 6)
{
LED1 = LED3 = LED5 = LED7 = 1; //闪烁
LED2 = LED4 = LED6 = LED8 = 0;
}
else
{
LED2 = LED4 = LED6 = LED8 = 1; //闪烁
LED1 = LED3 = LED5 = LED7 = 0;
}
TH0 = 0x3C; //重置定时器
TL0 = 0xB0;
}
}
}
}
void interruptTimer0() interrupt 1 //定时器0中断服务程序
{
TH0 = 0x4C; //重置定时器
TL0 = 0x00;
}
```
程序中使用定时器0来完成LED从左到右的循环点亮,并且在按键产生中断后,使用定时器0的中断服务程序来实现LED的闪烁。需要注意的是,由于按键可能存在抖动,所以在检测按键是否按下时,需要加上一个延时来消除抖动。同时,在中断服务程序中也需要判断定时器是否溢出,以实现LED的闪烁效果。
阅读全文