控制/MCU
硬件电路:
由硬件电路可以看出通过P32引脚可以触发外部中断0。当外部为低电平或者负跳变(高电平跳变为低电平)时,即可启动外部中断0。
中断系统结构
由中断系统结构可以看出外部中断0需要配置IT0、IE0、EX0、EA、(PX0)位。下面我们来介绍一下要用到的寄存器。(中断允许寄存器IE和中断优先级寄存器IP不再赘述)
TCON-定时/计数器控制寄存器 (可位寻址)
TF1-定时计数器1溢出标志位
(为1溢出申请中断。中断方式硬件自动清0,查询方式需软件清0)
TR1-定时计数器1运行控制位
(若GATE==1且INT1为高电平,TR1为1运行;若GATE==0,TR1为1运行;TR1需软件清0关闭)
TF0-定时计数器0溢出标志位(与TF1类似)
TR0-定时计数器0运行控制位(与TR1类似)
IE1-外部中断1请求标志
(为1表明正在向CPU申请中断,CPU转向中断服务程序后,硬件清0)
IT1-外部中断1触发方式选择位
(为1为跳变沿触发方式(负跳变),为0为低电平触发方式)
IE0-外部中断0请求标志(与IE1类似)
IT0-外部中断0触发方式选择位(与IT1类似)
所以我们在使用外部中断0的时候需要用到TCON寄存器中IE0、IT0位查询或设置触发方式,需要IE寄存器中EA、EX0位来打开总中断允许位和外部中断0允许位,在中断嵌套时需要IP寄存器来配置优先级。
程序代码:
使用外部中断0,使得在负跳变的触发下申请中断,中断响应使P1口的8位LED全部点亮500ms。
在此开发板上存在独立键盘模块,其中S4一端连接P32/INT0口,一端接地,按下后可以产生负跳变。
代码如下:
1/****************************
2* 使用外部中断0点亮LED *
3****************************/
4#include< reg52.h >
5#define uint unsigned int
6#define uchar unsigned char
7
8void delay(uint t_ms) //ms级延时
9{
10 uchar y;
11 while(t_ms--)
12 for(y = 114; y > 0; y--);
13}
14
15void init() //自定义函数-中断之前的准备
16{
17 IT0 = 1; //设置申请中断信号为负跳变有效
18 EA = 1; //开总中断开关
19 EX0 = 1; //开外部中断0开关
20}
21
22void main()
23{
24 init(); //中断初始化
25 while(1) //死循环
26 P1 = 0Xff; //使LED全灭
27}
28
29void init0() interrupt 0 //外部中断0
30{
31 P1 = 0; //将数码管全部点亮
32 delay(500); //延时500ms
33}
当P32/INT0还没有负跳变触发时,CPU一直执行while死循环,但是一旦有负跳变触发,CPU会根据interrupt 0进入中断服务程序使P1的8位LED全部点亮并持续500ms。
代码亲测有效,请注意硬件电路与代码的对应关系。
全部0条评论
快来发表一下你的评论吧 !