一、中断相关的基础概念
二、中断系统
2.1中断系统的优先级
2.2中断系统的结构
外部中断0方式由TCON的IT0来选择,IT0为1时是下降沿触发,为0是低电平信号触发。
IE:中断控制寄存器,中断的开关,EA是中断总开关。
T0:计数器输入端
RX,TX串口输入和输出。
2.3中断相关的寄存器
IE是中断的开关,IP控制中断优先级,TCON是一些中断标志位也可以选择中断方式,SCON和串口中断有关。
2.4中断服务函数程序
三、题目
首先把J5的跳帽接到2~3引脚,由原理图可以看到S5是接到了P32上,S4是接到了P33上,P3口的引脚一般比较特殊,引脚有功能复用,一个引脚可以有多个功能。
四、编程
#include "reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7; //1.要用到灯最好先sbit定义一下端口,后面比较好操作
void SelectHC573(unsigned char channel) //2.每次写程序必有的选择锁存器的函数
{
switch (channel)
{
case 4:
P2 = (P2 & 0x1f)| 0x80;
break;
case 5:
P2 = (P2 & 0x1f)| 0xa0;
break;
case 6:
P2 = (P2 & 0x1f)| 0xc0;
break;
case 7:
P2 = (P2 & 0x1f)| 0xe0;
break;
}
}
void Delay(unsigned int t)
{
while(t--);
}
void Working()
{
SelectHC573(4);
L1 = 0 ; //3.这里是给P0^0低电平,要控制LED灯必须选择锁存器,这里容易漏写
Delay(60000);
L1 = 1;
Delay(60000);
}
//================外部中断0的初始化函数和中断服务函数====================
void Init_INT0()
{
IT0 = 1; //外部中断0触发方式控制位(0:低电平触发; 1:下降沿触发)
EX0 = 1; //把外部中断0的中断使能打开
EA= 1 ; //总中断开关打开
}
unsigned char stat_int = 0 ;
void ServiceINT0() interrupt 0
{
stat_int = 1;
}
void LEDINT()
{
if(stat_int == 1 )
{
L8 = 0 ;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
stat_int = 0 ;
}
//======================================
void main()
{
Init_INT0();
while(1)
{
Working();
LEDINT();
}
}
1.选择的是下降沿触发,按下S5后P32有一个下降沿,触发了外部中断。这里还用了一个标志位,中断服务函数只是给标志位赋值,然后在主程序中不断查询标志位,进行点灯,这样使得每次L8点亮时,L1都是熄灭的,因为Working函数执行完后才去执行LEDINT函数。
2.也可以直接在中断服务函数里面进行点灯,延迟,但是这样会导致L8点亮时,L1的亮灭状态未知,因为在进入中断服务函数时L1的状态未知。
3.Init_INT0函数,一般是使能中断,选择中断触发方式,设置中断优先级。