006-中断

中断

引例:烧水,电视,电话,在某个场景下同时发生,此刻人作为处理这些问题的唯一主体,就需要有一个轻重缓急,按照紧迫程度(优先级)去解决这些问题。
 
中断使能寄存器——IE的控制位(8位控制):

  • 第7位 EA——总中断, 为1时打开(总开关)
  • 第1位 ET0——定时器0中断使能,为1时打开(相当于闹钟开关)

注意:

  • 中断函数不需要调用,达到中断条件自动进入。
  • 刷新时间固定1ms,不会受到计算过程的影响。
  • 中断函数定义时,格式为:
    void InterruptTime0() interrupt 1
    其中的1表示中断函数编号,其计算方式为:x*8+3=?,?为中断向量地址的十进制值,例如本例采用T0中断,对应地址为0x000B=11,所以x=1。
  • 中断优先级分为固有优先级和抢占优先级:
    固有优先级:几个中断同时发生时,先处理优先级默认高的程序,处理过程中对其他一切中断不予响应。
    抢占优先级:同时发生中断,优先级高的西先响应,在处理中断过程中,出现更高级别优先级,则先执行更改级别优先级再回来处理当前优先级。
     

实验一:我们对【005-数码管的使用】中方案三的程序进行改动,使用中断函数以解决抖动问题。

#include<reg52.h>	//头文件

sbit LS1 = P2^2;	//74LS138控制端
sbit LS2 = P2^3;
sbit LS3 = P2^4;

unsigned char shu_ma_guan[16] = {
	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	//0~F的对应值
	0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//全局变量
unsigned char LedBuff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};	//定义8个数码管初始状态均为00000000,即都不显示
unsigned char flag1s = 0;	//一秒到达标志位,为1即表示到达一秒
unsigned int cnt = 0;
unsigned char i = 0;

void main()		//主函数
{	
	unsigned long sec = 0;
	
	TMOD = 0x01;	//定时器定义,晶振12Mhz,每次1ms
	TH0 = 0xFC;
	TL0 = 0x18;
	TR0 = 1;	//打开定时器
	EA = 1;	        //打开中断总开关
	ET0 = 1;	//打开定时器0中断开关
																		 
	while(1)
	{	
		if(flag1s == 1 )	//判断是否到一秒
		{
			flag1s = 0;	//时间到达一秒,标志复位
			sec++;		//时间到达一秒自动加1
			LedBuff[0] = shu_ma_guan[sec%10];	//确定数码管在某个时间时各个位的显示数字
			LedBuff[1] = shu_ma_guan[sec/10%10];
			LedBuff[2] = shu_ma_guan[sec/100%10];
			LedBuff[3] = shu_ma_guan[sec/1000%10];
			LedBuff[4] = shu_ma_guan[sec/10000%10];
			LedBuff[5] = shu_ma_guan[sec/100000%10];
			LedBuff[6] = shu_ma_guan[sec/1000000%10];
			LedBuff[7] = shu_ma_guan[sec/10000000%10];
		}
	 }	
}

//中断函数
void InterruptTime0() interrupt 1	//函数名中在:Interrupt——中断函数,Time0——定时器0中断
					//不要忘记interrupt关键字及1(1的计算看文章开头)
{
	TH0 = 0xFC;	/定义定时器
	TL0 = 0x18;	//注意:右移TF0溢出时,进入定时器中断硬件自动清零,不在需要软件清零,省略语句TF0=0;
	cnt++;		//TFO溢出一次,自动加1
	if(cnt == 1000)		/时间到达一秒
	{
		cnt = 0;	//复位,从新计次
		flag1s = 1;	//1秒到达标志置1
	}

	P0 = 0x00; 	//消除鬼影,使得数码管的所有段全灭
	switch(i)	//数码管刷新
	{
		case 0: LS3=0;LS2=0;LS1=0;i++;P0=LedBuff[0];break;
		case 1: LS3=0;LS2=0;LS1=1;i++;P0=LedBuff[1];break;																				  
		case 2: LS3=0;LS2=1;LS1=0;i++;P0=LedBuff[2];break;
		case 3: LS3=0;LS2=1;LS1=1;i++;P0=LedBuff[3];break;
		case 4: LS3=1;LS2=0;LS1=0;i++;P0=LedBuff[4];break;
		case 5: LS3=1;LS2=0;LS1=1;i++;P0=LedBuff[5];break;
		case 6: LS3=1;LS2=1;LS1=0;i++;P0=LedBuff[6];break;
		case 7: LS3=1;LS2=1;LS1=1;i=0;P0=LedBuff[7];break;
		default: break;
	}		
} 
posted @ 2021-01-31 17:23  shihao_Yang  阅读(227)  评论(0编辑  收藏  举报