STC89C516单片机利用用中断写一个抢答器的代码
时间: 2024-03-18 21:39:11 浏览: 16
抢答器是一种常见的电子竞赛设备,可以通过按下按钮来抢答比赛中的问题。在单片机中,可以通过中断来实现抢答器的功能。下面是一个基于STC89C516单片机的抢答器代码。
```
#include <reg52.h>
sbit key1 = P1^0; // 定义按键1
sbit key2 = P1^1; // 定义按键2
sbit key3 = P1^2; // 定义按键3
sbit key4 = P1^3; // 定义按键4
int flag = 0; // 定义标志位,表示是否有人按下按键
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
void int0() interrupt 0 // 外部中断0,用于判断是否有人按下按键
{
flag = 1;
}
void main()
{
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 使能总中断
while(1)
{
if(key1 == 0) // 检测按键1是否按下
{
delay(10); // 延时消抖
if(key1 == 0)
{
flag = 0;
while(!flag); // 等待有人按下其它按键
P2 = 0x01; // 点亮LED1
}
}
if(key2 == 0) // 检测按键2是否按下
{
delay(10); // 延时消抖
if(key2 == 0)
{
flag = 0;
while(!flag); // 等待有人按下其它按键
P2 = 0x02; // 点亮LED2
}
}
if(key3 == 0) // 检测按键3是否按下
{
delay(10); // 延时消抖
if(key3 == 0)
{
flag = 0;
while(!flag); // 等待有人按下其它按键
P2 = 0x04; // 点亮LED3
}
}
if(key4 == 0) // 检测按键4是否按下
{
delay(10); // 延时消抖
if(key4 == 0)
{
flag = 0;
while(!flag); // 等待有人按下其它按键
P2 = 0x08; // 点亮LED4
}
}
}
}
```
在上面的代码中,我们使用了外部中断0来检测是否有人按下按键。当有人按下按键时,会触发外部中断0,进而设置标志位flag为1。在主函数中,我们不断检测各个按键是否按下,如果有按键按下,就等待有人按下其它按键,并点亮对应的LED灯。需要注意的是,为了消除按键抖动,我们在检测按键时加入了延时函数。