写出该实验需要的代码, 实验: 外部中断实验 实验目的: 熟悉51单片机的外部中断;掌握开关的电路设计;掌握8位LED数码管的电路设计。 实验原理: 51单片机的中断,包括中断源、中断向量地址、中断服务子程序,开关的电路设计,以及数码管的硬件电路。 实验内容: 使用外部中断方式来统计独立按键S4或S5按下的次数,并通过LED数码管的低2位来显示按键次数。
时间: 2024-02-27 17:55:40 浏览: 86
好的,以下是该实验所需的代码:
```
#include <reg52.h>
sbit S4 = P1^0; // 定义S4开关对应的引脚
sbit S5 = P1^1; // 定义S5开关对应的引脚
unsigned char cnt = 0; // 定义计数器,初始化为0
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(unsigned char num) // 数码管显示函数
{
unsigned char code table[] = // 数码管段码表
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f
};
P0 = table[num]; // 将对应的段码输出到P0口
}
void initExternalInterrupt() // 初始化外部中断
{
IT0 = 1; // 使能INT0外部中断
EX0 = 1; // 允许INT0中断
EA = 1; // 全局中断使能
}
void externalInterrupt0() interrupt 0 // INT0中断服务子程序
{
delay(10); // 延时去抖
if(S4 == 0) // 判断S4是否按下
cnt++; // 计数器加1
if(S5 == 0) // 判断S5是否按下
cnt--; // 计数器减1
}
void main()
{
initExternalInterrupt(); // 初始化外部中断
while(1)
{
display(cnt % 10); // 显示计数器的个位数码
delay(100); // 延时100ms
}
}
```
代码中,我们首先定义了S4和S5对应的引脚,使用unsigned char类型的cnt变量来进行计数,初始化为0。接着,我们定义了延时函数和数码管显示函数。
在主函数中,我们调用了initExternalInterrupt()函数来初始化外部中断,然后使用一个while循环来不断地显示cnt的个位数码。在中断服务子程序externalInterrupt0()中,我们使用S4和S5的状态来判断是否需要对cnt进行加1或减1的操作。最后,我们使用display()函数来将cnt的个位数码输出到数码管上进行显示。
阅读全文