51单片机中断系统

概念

中断源:指引起CPU中断的事件,即中断请求信号的来源。51单片机有5个中断源,分别是外部中断0,定时/计数器T0中断,外部中断1,定时/计数器T1中断,串行口中断,对应地址如下表:

中断源中断矢量地址
外部中断00003H
定时/计数器T0中断000BH
外部中断10013H
定时/计数器T1中断001BH
串行口中断0023H

定时/计数器控制寄存器TCON

位编号TCON.7TCON.6TCON.5TCON.4TCON.3TCON.2TCON.1TCON.0
位地址8FH8EH8DH8CH8BH8AH89H88H
位定义TF1TR1TF0TR0IE1IT1IE0IT0
功能定时器T1的溢出中断申请位,产生中断溢出时自动置为1,当CPU响应该中断后自动置0定时器/计数器T1的控制位,由软件设置,置1时启动定时器,置0时停止定时器定时器T0溢出中断申请位,产生溢出时硬件自动置1,CPU响应中断后自动清0定时器/计数器T0的控制位,由软件设置,置1时启动定时器,置0时停止定时器外部中断INT1请求标志位,当CPU检测到外部中断信号后被置1,当CPU响应中断并进入中断函数后硬件自动清0外部中断INT1触发方式控制位,由软件设置,置1时为边沿触发方式,置0时为低电平触发中断方式外部中断INT0请求标志位,当CPU检测到外部中断信号后被置1,当CPU响应中断并进入中断函数后硬件自动清0外部中断INT0触发方式控制位,由软件设置,置1时为边沿触发方式,置0时为低电平触发中断方式

中断允许寄存器IE

位编号IE.7IE.6IE.5IE.4IE.3IE.2IE.1IE.0
位地址AFHACHABHAAHA9HA8H
位定义EAESET1EX1ET0EX0
功能CPU总中断开放标志位,置1时开总中断,置0时关闭所有中断串行中断允许标志位,置1时允许串行口中断,置0时关闭串行口中断定时器/计数器T1溢出中断允许标志位,置1时允许T1中断,置0时关闭T1中断外部中断1中断允许标志位,置1时允许外部中断1中断,置0时关闭外部中断1中断定时器/计数器T0溢出中断允许标志位,置1时允许T1中断,置0时关闭T1中断外部中断0中断允许标志位,置1时允许外部中断1中断,置0时关闭外部中断1中断

中断优先级寄存器IP

位编号IP.7IP.6IP.5IP.4IP.3IP.2IP.1IP.0
位地址BCHBBHBAHB9HB8H
位定义PSPT1PX1PT0PX0
功能串行口中断优先级控制位,置1时设定串行口中断为高优先级中断,置0时设定串行口为低优先级中断定时/计数器T1中断优先级控制位,置1时设定定时/计数器T1中断为高优先级中断,置0时设定定时/计数器T1为低优先级中断外部中断1优先级控制位,置1时设定外部中断1为高优先级中断,置0时设定外部中断1为低优先级中断定时/计数器T0中断优先级控制位,置1时设定定时/计数器T0中断为高优先级中断,置0时设定定时/计数器T0为低优先级中断外部中断0优先级控制位,置1时设定外部中断0为高优先级中断,置0时设定外部中断0为低优先级中断

定时/计数器方式寄存器TMOD

位编号TMOD.7TMOD.6TMOD.5TMOD.4TMOD.3TMOD.2TMOD.1TMOD.0
位定义GATEC/TM1M0GATEC/TM1M0
功能门控位,用于控制定时/计数器的启动是否受外部中断请求信号的控制,置1时T0的启动受外部中断0控制,T1受外部中断1控制,置0时定时/计数器的启动与外部中断无关定时或计数选择位,置1时为计数方式,置0时为定时方式定时/计数工作方式选择位定时/计数方式选择位同上同上同上同上

定时/计数器工作方式选择M1 M0

M1M0工作方式功能初值计算
00方式013位定时/计数器T=[ ( 8192 - x ) * f ] / 12
01方式116位定时/计数器T=[ ( 65536 - x ) * f ] / 12
10方式2具有自动重装初值的8位定时/计数器T=[ ( 256 - x ) * f ] / 12
11方式3分为两个独立的8位计数器(仅适用于T0)

注:T表示计时时间,f表示晶振频率,x表示初值,再给TH0(TH1)和TL0(TL1)赋值时,将x转换为16进制,在分高低8位赋值即可

例程

外部中断0

		ORG		0000H
		AJMP	START
		ORG		0003H			 //外部中断INT0地址
		AJMP	INT_0			 //转中断程序
		ORG		0030H
START:	MOV		SP,		#30H
		MOV 	R0,		#08H
		MOV		B, 		#255
		MOV		R1,		#255
		CLR		P1.1			 //P1.1清0
		//INT1初始化
		MOV		IP,		#01H	//设置外部中断INT0为最高级
		SETB	IT0				 //设置INT0为边沿触发
		SETB	EA				 //开总中断
		SETB	EX0				 //开外部中断
		ACALL	LED 


		//流水灯程序
LED:	MOV 	A,	 	#01
		MOV		P2,		A
		ACALL	DELAY  
LOOP:	RL		A
		MOV		P2,		A
		ACALL	DELAY    
		DJNZ 	R0,		LOOP
		MOV 	R0,		#08H
		LJMP    LOOP
		//延时函数程序
DELAY:	DJNZ 	B,		DELAY
		MOV		B, 		#255
		DJNZ 	R1,		DELAY
		MOV		R1,		#255
		RET		
		//中断函数
INT_0:	PUSH 	PSW					 //保护现场,临时保存程序状态字寄存器
		PUSH 	ACC
		CPL		P1.1				 //P1.1取反
		POP		ACC
		POP		PSW
		RETI

END

现象:主程序时流水灯,当P3.2连接的按键按下后,P1.1状态取反,与之相连的灯如果是熄灭的这次按下会点亮,如果是点亮的则按下后熄灭
外部中断1

		ORG		0000H
		AJMP	START
		ORG		0013H			 		//外部中断INT1地址
		AJMP	INT_1			 		//转中断程序
		ORG		0030H
START:	MOV		SP,		#30H			 //设置堆栈指针
		MOV 	R0,		#08H
		MOV		B, 		#255
		MOV		R1,		#255
		CLR		P1.1			 		//P1.1清0
		//INT1初始化
		MOV		IP,		#04H			//设置外部中断INT1为最高级
		SETB	IT1				 		//设置INT1为边沿触发
		SETB	EA				 		//开总中断
		SETB	EX1						//开外部中断
		ACALL	LED 


		//流水灯程序
LED:	MOV 	A, 		#01
		MOV		P2,		A
		ACALL	DELAY  
LOOP:	RL		A
		MOV		P2,		A
		ACALL	DELAY    
		DJNZ 	R0,		LOOP
		MOV 	R0,		#08H
		LJMP    LOOP
		//延时函数程序
DELAY:	DJNZ 	B,		DELAY
		MOV		B, 		#255
		DJNZ 	R1,		DELAY
		MOV		R1,		#255
		RET		
		//中断函数
INT_1:	PUSH 	PSW					 //保护现场,临时保存程序状态字寄存器
		PUSH 	ACC
		CPL		P1.1				 //P1.1取反
		POP		ACC
		POP		PSW
		RETI

END

现象:主程序时流水灯,当P3.3连接的按键按下后,P1.1状态取反,与之相连的灯如果是熄灭的这次按下会点亮,如果是点亮的则按下后熄灭
定时器0中断

    ORG  	0000H
    LJMP 	START
    ORG  	000BH			   //定时器0地址
    LJMP 	Timer0Interrupt	   //转定时器中断函数

START:
    MOV 	SP,		#60H		   //设置堆栈指针
	MOV 	R0, 	#00
	CLR 	P1.1			   //P1.1清0
    LCALL 	InitTimer0		   //转初始化中断定时器0

	SJMP	$		   			//主程序卡在死循环中

InitTimer0:
    MOV 	TMOD,	#10H		   //设置工作方式位1
	//赋初值,定时1ms
    MOV 	TH0,	#0FCH
    MOV 	TL0,	#18H
    SETB 	EA				   //开总中断
    SETB 	ET0				   //开定时器1中断
    SETB 	TR0				   //启动定时器
    RET
	//中断函数
Timer0Interrupt:
	//定时器中断保护现场通常写法
    PUSH 	DPH			   //数据指针DPTR高8位入栈
    PUSH 	DPL			   //数据指针DPTR低8位入栈
    PUSH 	ACC
	//重装初值
    MOV 	TH0,	#0FCH
    MOV 	TL0,	#18H
	INC 	R0			   				//定时次数加1
	CJNE 	R0,		#255,	NEXT	  	//定时255ms
	MOV		R0,		#00			   		//清0,开始下次计时
	CPL 	P1.1		   				//P1.1状态取反
NEXT:
    POP 	ACC
    POP 	DPL
    POP 	DPH
    RETI

END

现象:定时器定时1ms,共计时255ms,与P1.1相连的小灯状态变化一次
定时器1中断

    ORG  	0000H
    LJMP 	START
    ORG  	001BH			   		//定时器1地址
    LJMP 	Timer1Interrupt	   		//转定时器中断函数

START:
    MOV 	SP,		#60H		   	//设置堆栈指针
	MOV 	R0, 	#00
	CLR 	P1.1			   		//P1.1清0
    LCALL 	InitTimer1		   		//转初始化中断定时器1

	SJMP	$		   				//主程序卡在死循环中

InitTimer1:
    MOV 	TMOD,	#10H		   //设置工作方式位1
	//赋初值,定时1ms
    MOV 	TH1,	#0FCH
    MOV 	TL1,	#18H
    SETB 	EA				   //开总中断
    SETB 	ET1				   //开定时器1中断
    SETB 	TR1				   //启动定时器
    RET
	//中断函数
Timer1Interrupt:
	//定时器中断保护现场通常写法
    PUSH 	DPH			   //数据指针DPTR高8位入栈
    PUSH 	DPL			   //数据指针DPTR低8位入栈
    PUSH 	ACC
	//重装初值
    MOV 	TH1,	#0FCH
    MOV 	TL1,	#18H
	INC 	R0			   				//定时次数加1
	CJNE 	R0,		#255,	NEXT	   	//定时255ms
	MOV		R0,		#00			   		//清0,开始下次计时
	CPL 	P1.1		   				//P1.1状态取反
NEXT:
    POP 	ACC
    POP 	DPL
    POP 	DPH
    RETI

END

现象:定时器定时1ms,共计时255ms,与P1.1相连的小灯状态变化一次

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值