单片机中断

89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。

( P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
 TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
 TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
 RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

中断的优先级别及中断函数编号

 TMOD寄存器 (定时/计时)

中断源符号及中断号

 中断响应条件

  • 中断源有中断请求;
  •  此中断源的中断允许位为1;
  •  CPU开中断(即EA=1)。

 #include <STC89C5xRC.H>
 
 typedef unsigned int u16;	
 typedef unsigned char u8;
 
 sbit LED1 = P2^0;
 sbit KEY3 = P3^2;
 
 
 void delay_10us(u16 ten_us)
 {
	 while(ten_us--);	
 }
 
 
 //外部中断0使能函数
 void exti0_init()
 {
	 INT0 = 1;
	 EX0 = 1;
	 EA = 1;
 }
 
 
 //中断0服务程序
 void exti0() interrupt 0
 {
	 delay_10us(100);
	 if(KEY3==0)
		 LED1 = ~LED1;
 }
 
 
 void main()
 {
	 exti0_init();
	 
 }
 

//写入单片机后,按KEY3存在“触摸不灵”的感觉,时而有效时而无效。

K3开关电机 K4电机停5s,转5s   K4只需按一次,K3产生中断

 #include <STC89C5xRC.H>
 
 typedef unsigned int u16;	
 typedef unsigned char u8;
 
 sbit LED1 = P2^0;
 sbit LED2 = P2^1;
 sbit KEY3 = P3^2;
 sbit KEY4 = P3^3;
 sbit DC_Motor = P1^3;
 
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
			for(j=110;j>0;j--);
}
 
 
 void delay_10us(u16 ten_us)
 {
	 while(ten_us--);	
 }
 
 
 //外部中断0使能函数
 void exti0_init()
 {
	 INT0 = 1;
	 EX0 = 1;
	 EA = 1;
 }
 
 //外部中断2使能函数
  void exti2_init()
 {
	 INT1 = 1;
	 EX1 = 1;
	 EA = 1;
 }
 
 //外部中断0服务程序
 void exti0() interrupt 0
 {
	   if(DC_Motor==1)
		 {
			 DC_Motor=0;
			 EX1 = 0;
		 }
		 else
		 {
			 DC_Motor=1;
			 EX1 = 1;
		 }
 }
 
  //外部中断2服务程序
 void exti2() interrupt 2
 {
		 DC_Motor = 0;
		 delay_ms(5000);
		 DC_Motor = 1;
		 delay_ms(5000);
		 KEY4 = 0;
 }
 
 
 
 void main()
 {
	 exti0_init();
	 exti2_init();
	 while(1);
 }
 

 //使用外部中断0、1与定时器0实现:key3(外部中断0)开/关机,key4(外部中断1)使能定时器0;实现电机停2s,转2s

电机接在J47的1、5接口

 #include <STC89C5xRC.H>
 
 typedef unsigned int u16;	
 typedef unsigned char u8;
 
 sbit LED1 = P2^0;
 sbit LED2 = P2^1;
 sbit KEY3 = P3^2;
 sbit KEY4 = P3^3;
 sbit DC_Motor = P1^3;
 
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
			for(j=110;j>0;j--);
}
 
 
 void delay_10us(u16 ten_us)
 {
	 while(ten_us--);	
 }
 
 //
 void time0_init(void)
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}
 
 //
void time0() interrupt 1 //定时器0中断函数
{
	static u16 i;//定义静态变量i
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==2000)
	{
		i=0;
		DC_Motor = ~DC_Motor;	
	}						
}
 
 
 //外部中断0使能函数
 void exti0_init()
 {
	 INT0 = 1;
	 EX0 = 1;
	 EA = 1;
 }
 
 //外部中断2使能函数
  void exti2_init()
 {
	 INT1 = 1;
	 EX1 = 1;
	 EA = 1;
 }
 
 //外部中断0服务程序
 void exti0() interrupt 0
 {
	   if(DC_Motor==1)
		 {
			 DC_Motor=0;
			 EX1 = 0;
			 //
			 TR0 = 0;
		 }
		 else
		 {
			 DC_Motor=1;
			 EX1 = 1;
		 }
 }
 
  //外部中断2服务程序
 void exti2() interrupt 2
 {
//		 DC_Motor = 0;
//		 delay_ms(5000);
//		 DC_Motor = 1;
//		 delay_ms(5000);
//		 KEY4 = 0;
	     time0_init();
 }
 
 
 
 void main()
 {
	 exti0_init();
	
	 exti2_init();
	 while(1);
 }
 

succ!

猜你喜欢

转载自blog.csdn.net/m0_61598337/article/details/131484503