51单片机_外部中断 与 定时/计数器中断

外部中断与定时/计数器中断

  • 引言
  • 外部中断
  • 定时器中断

引言

学单片机有些时间了,一直不太理解中断这方面的知识,网上也看了很多资料,大致了解了中断的笼统含义,就比如其中一种说法:你再打LOL人机,突然家里的热水器开了,你必须先暂停LOL,先去处理热水器,以避免热水器过热造成不必要的安全事故,当你把热水器处理得当,你再去打LOL,这里称:处理热水器为中断。这样讲其实非常的笼统。这里来详细说一下:最简单的就属外部中断和定时器中断了。

外部中断

外部中断其实隶属于按键处理,外部中断最著名的当属IT0了,若IT0赋值为0,这个按钮其实是低电平触发;若IT0赋值为1,这个按钮其实是下边沿触发。(这里插播一条广告:低电平触发与下边沿触发的区别是什么?低电平触发是指这个按键只要是低电平,就会执行外部中断函数里面的代码,只要引脚为低电平时间内中断就一直有效,就会一直进入中断,直到电平变化为高电平,中断事件才肯罢休;而下边沿触发必须是由高电平触发转变为低电平才会触发,也就是说,引脚一直保持低/高电平,也无法多次触发,仅仅可以触发一次中断。总结,按键按下一次,低电平触发方式可以触发一到多次外部中断,而下边沿触发能且仅能触发一次外部中断)这就是外部中断。(这里在插播一条广告:外部中断,为按钮事件而生!)那么问题来了,按钮按下事件除了能用外部中断处理,还能怎么处理?很简单,直接在main函数里:

if(key1 == 0)
		{
			delay10ms();
			if(key1 == 0)	//确实有按键按下了
			{
				写下你按下人家按键key1干嘛呀
			}
		}

以上就是外部中断

接下来再来讲定时器中断

定时器中断

定时器其实就是倒计时,而定时器T0和T1分别对应的引脚是P3.4和P3.5。

(插播一条广告:EA代表总闸,不管是外部中断,还是定时器中断要开启,首先都要EA开闸,外部中断或定时器中断也开闸才能运行.)

计数器其实就是倒数几个数,计数器常用的寄存器有TL0,TH0,TL1,TH1。以TL0和TH0为例,TL0和TH0 都是8位寄存器,由TL0和TH0形成高八位和低八位寄存器,用于计数,一共16位。范围是0~65535,一共65536(2的16次方).

TCON寄存器:
这里只说定时/计数器部分!
TF1为定时器1溢出位,TR1为定时器1控制位(开启或关闭);TF0为定时器0溢出位,TR0为定时器0控制位(开启或关闭)。

IE寄存器:
这里只说定时/计数器部分!
ET1:定时器1中断开关
ET0:定时器0中断开关

TMOD寄存器:
有两个定时器,分别为定时器0和定时器1
一共有两组GATE,C/T,M1,M0;
其中,GATE叫门控制位,初学者直接让他等于0即可,然后让TR0或TR1等于1,对应的定时器T0或T1就启动了。
C/T:0为定时,1为计数。
最后的M0和M1是一起看的,有四中情况,分别为00,01,10,11 ,初学者直接使用01即可,表示 16位定时器/计数器,最大计数为2^16 = 65536
综上所述,TMOD一般最常用的就是0X01.(即TMOD寄存器的二进制表示为:0000 0001,表示只要让TR0或TR1等于1,对应的定时器T0或T1也就启动了,同时范围是0~65535,共65536个数)

另外在补充一下:定时器的初值怎么计算:
65536 - 10000 = 55536 ,意思是 计数器从65536 一直减到 55536 所用的时间就是10ms。
55536的十六进制是0xD8F0,
所以设置 TH0 = 0XD8,TL0=0XF0,
也就是说,初值设为0xD8F0,则每10ms就触发一次定时器0或1中断

//了解了上边这些知识点,下面这些代码你应该就能看懂了!
#include
sbit LED0=P1^0;
unsigned char i;
 
void main()
{
	TMOD=0X01;  //设置使用定时器0,16位的定时/计数寄存器
	TL0=0xD8;    //低八位赋初值
	TH0=0XF0;    //高八位赋初值
	ET0=1;          //开启定时器0中断
	TR0=1;         //运行定时器0
	EA=1;          //开启中断总开关
	while(1);
}
 
void Delay(void) interrupt 1 using 0
{
	i++;
	TR0=0;           //进入中断函数时,关闭定时器
	TL0=0XD8;    //重新赋初值
	TH0=0XF0;
	if(i==20)        //因为10ms一次触发看不出明显结果,所以让20次触发才让灯变一次
	{
		LED0=~LED0;
	}
	TR0=1;     //重新开启定时器
}

(最后在补充一点:
定时/计数器的的工作原理是进行计数。
对内部时钟脉冲进行计数时,作为定时器;对外部脉冲信号计数时,则是计数器。不管作为定时器还是计数器,本质上都是计数器。
所以,初学者不必纠结是用定时还是是计数器,因为两者其实是一个东西,只不过一个是内部时钟脉冲,一个是外部脉冲,
所以,初学者用定时器T0,T1的内部脉冲准没错,即让C/T=0就行了!

你可能感兴趣的:(单片机,单片机,嵌入式硬件)