其中实验2.2.2.1:用开关或者按键作为外部中断源,控制某个或者某组灯亮、灭,并且验证中断的优先级 其中实验2.2.2.2:用开关或者按键作为定时/计数器的外部脉冲输入,数码管随之计量(每按1次显示数字加1) 51单片机代码实现
时间: 2024-03-06 12:48:49 浏览: 173
当使用开关或按键作为外部中断源时,你可以使用下面的代码来控制某个或某组灯的亮灭,并验证中断的优先级:
```c
#include <reg52.h>
#include <intrins.h>
sbit LED = P1^0; // 定义LED引脚
void delay(unsigned int xms) // 延时函数
{
unsigned int i, j;
for (i = xms; i > 0; i--)
for (j = 112; j > 0; j--);
}
void Interrupt_Init() // 初始化外部中断
{
IT0 = 1; // IT0 = 1,设置为下降沿触发
EX0 = 1; // 允许外部中断0
EA = 1; // 全局中断允许
}
void main()
{
LED = 0; // 初始化LED为熄灭状态
Interrupt_Init(); // 初始化外部中断
while (1); // 主程序循环
}
void External0_ISR() interrupt 0 // 定义外部中断0的中断服务程序
{
LED = ~LED; // LED状态取反
delay(1000); // 延时1秒钟,防止抖动
}
```
当使用开关或按键作为定时/计数器的外部脉冲输入时,你可以使用下面的代码来实现数码管随之计量,每按1次显示数字加1:
```c
#include <reg52.h>
#include <intrins.h>
sbit SCLK = P1^0; // 定义SCLK引脚
sbit RCLK = P1^1; // 定义RCLK引脚
sbit DIO = P1^2; // 定义DIO引脚
unsigned char code ledChar[] = { // 数码管字符数组
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned char num = 0; // 初始化数字为0
void delay(unsigned int xms) // 延时函数
{
unsigned int i, j;
for (i = xms; i > 0; i--)
for (j = 112; j > 0; j--);
}
void HC595_SendByte(unsigned char dat) // 发送一个字节数据到595芯片
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DIO = dat & 0x80;
dat <<= 1;
SCLK = 0;
_nop_();
SCLK = 1;
}
}
void HC595_Output() // 加载输出
{
RCLK = 0;
_nop_();
RCLK = 1;
}
void External1_ISR() interrupt 2 // 定义外部中断1的中断服务程序
{
num++; // 每按1次数字加1
if (num >= 10) num = 0; // 数字大于等于10时,重新从0开始
HC595_SendByte(ledChar[num]); // 发送数据到595芯片
HC595_Output(); // 加载输出
delay(100); // 延时100ms,防止按键抖动
}
void Interrupt_Init() // 初始化外部中断
{
IT1 = 1; // IT1 = 1,设置为下降沿触发
EX1 = 1; // 允许外部中断1
EA = 1; // 全局中断允许
}
void main()
{
HC595_SendByte(ledChar[num]); // 初始化数码管显示0
HC595_Output(); // 加载输出
Interrupt_Init(); // 初始化外部中断
while (1); // 主程序循环
}
```
阅读全文