外观
六、外部中断实验
开发板开源工程链接:https://oshwhub.com/xiezhaoyan/51-dan-pian-ji-diy-kai-fa-ban-97-zhi-cha-jian
1 开发板硬件部分
外部中断通过独立按键模块引出,包括KEY3和KEY4。其中KEY3按键连接单片机P3.2,为外部中断INT0;KEY3按键连接单片机P3.3,为外部中断INT1。按键未按下时,端口电平为高电平;按键按下时,端口电平变为低电平。外部中断配置为边沿触发方式,按键按下时,外部中断被触发。
注意:由于P3.2端口同时被红外接收器IR1复用,因此按键KEY3容易收到外部红外信号干扰。因此建议器件IR1焊接位置采用排母焊接,使用红外接收功能时再在端口处插入器件。
2 Proteus仿真电路
中断系统的Proteus仿真电路如图3所示,与独立按键的电路相同,绘制方法可以参考我的B站视频:https://www.bilibili.com/video/BV1G14y1v7BP/?spm_id_from=333.788
Proteus仿真电路的工程文件见百度网盘链接。
3 Keil程序
程序设计要求:
K3和K4都未按下时,P1口8只LED呈流水灯显示,当按一下K4时,产生一个低优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只LED全部闪烁。
此时按一下K3时,产生一个高优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,上下4只LED交替闪烁。
当显示5次后,再从外中断0返回继续执行外中断1中断服务程序,即P1口控制8只LED全部闪烁。设置外中断0为高优先级,外中断1为低优先级。
C
/************************************************************
*实验10-外部中断实验-不同优先级
************************************************************/
# include "reg51.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//定义独立按键K3控制脚
sbit KEY3=P3^2;
//定义独立按键K4控制脚
sbit KEY4=P3^3;
/*定义了流水灯的显示数据*/
u8 code leddata[10]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
/************************************************************
* 函 数 名:delay_10us
* 函数功能:延时函数,ten_us=1时,大约延时10us
* 输 入:ten_us
* 输 出:无
************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/************************************************************
* 函 数 名:delay_ms
* 函数功能:延时函数,i=1时,大约延时1ms
* 输 入:1
* 输 出:无
************************************************************/
void delay_ms(u16 i) /*延时函数delay(),i为形式参数,不能赋初值*/
{
u8 j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{
; /*空函数*/
}
}
}
/************************************************************
* 函 数 名:int0_init
* 函数功能:外部中断0配置函数
* 输 入:无
* 输 出:无
************************************************************/
void int0_init(void)
{
IT0=1; //跳变沿触发方式(下降沿)
EX0=1; //打开INT0的中断允许
PX0=1; //高优先级
}
/************************************************************
* 函 数 名:int1_init
* 函数功能:外部中断1配置函数
* 输 入:无
* 输 出:无
************************************************************/
void int1_init(void)
{
IT1=1; //跳变沿触发方式(下降沿)
EX1=1; //打开INT1的中断允许
PX1=0; //低优先级
}
/************************************************************
* 函 数 名:main
* 函数功能:主函数
* 输 入:无
* 输 出:无
************************************************************/
void main() /*主函数*/
{
u16 a;
int0_init(); /*外部中断0配置*/
int1_init(); /*外部中断1配置*/
EA=1; /*总中断允许*/
while(1)
{
for(a=0;a<9;a++)
{
delay_ms(500); /*延时*/
P1=leddata(a); /*将已经定义的流水灯显示数据送到P1口*/
}
}
}
/************************************************************
* 函 数 名:int0_isr
* 函数功能:外部中断0中断服务函数
* 输 入:无
* 输 出:无
************************************************************/
void int0_isr(void) interrupt 0 /*外中断0的中断服务函数*/
{
u8 n;
delay_10us(1000); //延时去抖
if(KEY3==0)
{
for(n=0;n<10;n++)
{
P1=0x0F; /*低4位LED灭,高4位LED亮*/
delay_ms(500); /*延时*/
P1=0xF0; /*高4位LED灭,低4位LED亮*/
delay_ms(500); /*延时*/
}
}
}
/************************************************************
* 函 数 名:int1_isr
* 函数功能:外部中断1中断服务函数
* 输 入:无
* 输 出:无
************************************************************/
void int1_isr(void) interrupt 2 /*外中断1的中断服务函数*/
{
u8 m;
delay_10us(1000); //延时去抖
if(KEY4==0)
{
for(m=0;m<10;m++)
{
P1=0xFF; /*全灭*/
delay_ms(500); /*延时*/
P1=0x00; /*全亮*/
delay_ms(500); /*延时*/
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
4 演示视频
具体演示视频,可以参考我的B站视频:https://www.bilibili.com/video/BV1WB4y1j7Hi/?spm_id_from=333.788
相关资源:
链接:https://pan.baidu.com/s/1TLnOhGkpHmD9q9RYNVlBbg?pwd=af7e
提取码:af7e
喜欢的话请关注点赞,开发板的技术交流可以加群:834029577,感谢关注!!!