外部中断1的练习
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit P3_3 = P3^3 ;
sbit P3_4 = P3^4 ;
sbit P1_7 = P1^7 ; //位定义void init_interrupt(); //初始化函数,进行相应的中断寄存器的设置
void delay(uint x); //不是很准的延时函数
void main(void )
{
uchar m = 0xfe;
uchar n = 0;
init_interrupt();
while(P3_4 == 0); //总开关控制主程序的流程,这是系统的要求
while(1)
{
while(P3_4 == 0);
m = _crol_(m,1); //7只发光二极管的轮流显示
if(m == 0x7f)
m = _crol_(m,1);
n = m;
n = n | 0x80;
P1 = n;
delay(33333);
}
}void init_interrupt()
{
EA = 1; //cpu开中断
EX1 = 1; //中断允许寄存器IE中的EA和EX1 允许外部中断1
IT1 = 0; // 外部中断1的设置为电平触发方式
}
void delay(uint x)
{
uint y = 3333;
for(;y > 0;y--)
for(;x > 0;x--);
}
//void exter1() interrupt 1 要细心
void exter1() interrupt 2 /*
*interrupt 0是外部中断 0 P3_2
*interrupt 1是定时器 0 P3_4
*interrupt 2是外部中断1 P3_3
*interrupt 3是定时器 1 P3_5
*interrupt 4是串行口 P3.0 RXD
P3.1 TXD
*interrupt是关键字
*exter1是函数名,可以自行定义
*/
{
uchar b;
EA = 0;
b = P1;
while(P3_3 == 0) //一开始为高,为低的话触发中断
{
P1_7 = !P1_7;
delay(56667);
}
P1 = b;
EA = 1;
}
总结记忆:
一:
1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。(外部中断0)
当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。 (外部中断1)
当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。 (定时器中断0)
当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。 (定时器中断1)
当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。 (串行口)
当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
其实就与TCON寄存器的设置密切相关
TCON :0x88h 地址
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
二:
SCON:0x98 地址
§ RI(SCON.0),串行口接收中断标志位。
当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
§ TI(SCON.1),串行口发送中断标志位。
当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。
三:
IE:0xA8h 地址
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
§ EX0(IE.0),外部中断0允许位;
§ ET0(IE.1),定时/计数器T0中断允许位;
§ EX1(IE.2),外部中断0允许位;
§ ET1(IE.3),定时/计数器T1中断允许位;
§ ES(IE.4),串行口中断允许位;
§ EA (IE.7), CPU中断允许(总允许)位。
四:(不是必须设置的)
IP:0xB8h 地址
§ PX0(IPH.0),外部中断0优先级设定位;
§ PT0(IPH.1),定时/计数器T0优先级设定位;
§ PX1(IPH.2),外部中断0优先级设定位;
§ PT1(IPH.3),定时/计数器T1优先级设定位;
§ PS (IPH.4),串行口优先级设定位;
§ PT2 (IPH.5) ,定时/计数器T2优先级设定位。
五:(中断嵌套,也不是必须的)
IPH:0xB7H 地址
§ PX0(IPH.0),外部中断0优先级设定位;
§ PT0(IPH.1),定时/计数器T0优先级设定位;
§ PX1(IPH.2),外部中断0优先级设定位;
§ PT1(IPH.3),定时/计数器T1优先级设定位;
§ PS (IPH.4),串行口优先级设定位;
§ PT2 (IPH.5) ,定时/计数器T2优先级设定位。
有个小问题,貌似不知道怎么修改单片机的默认的中断优先级啊??????以后有机会得想想